nginx 学习笔记

nginx安装

# 查看ngnix的yum包
yum list all | grep nginx
# 更新epel-release源
yum install -y epel-release
# 安装nginx 
yum install -y nginx
# 查看nginx的安装目录
rpm -ql nginx
# 查看nginx的启动命令
nginx -h

nginx version: nginx/1.20.1
Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]
             [-e filename] [-c filename] [-g directives]
# nginx启动
nginx

# 查看nginx进程
ps -ef | grep nginx

#  编译安装
yum install -y curl wget
wget http://nginx.org/download/nginx-1.22.0.tar.gz

# 解压缩
tar -vxzf nginx-1.22.0.tar.gz
# 进入到解压缩目录
cd nginx-1.22.0
# 编译
./configure \
--prefix=/opt/nginx \
 --conf-path=/opt/nginx/conf/nginx.conf \
--user=nginx \
--group=nginx \
--pid-path=/opt/nginx/pid/nginx.pid \
--error-log-path=/opt/nginx/logs/error.log \
--http-log-path=/opt/nginx/logs/access.log  \
--with-pcre  \
--with-http_ssl_module \
--with-http_image_filter_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_gunzip_module  \
--with-http_realip_module \
--with-http_dav_module  \
--with-http_geoip_module \
--with-http_auth_request_module \
--with-debug 

# 模块解释
--user 用户
--group 用户组
--pid-path pid存放路径
--error-log-path error.log存放路径
--http-log-path access.log存放路径
--with-pcre 启用
--with-http_ssl_module 启用ssl模块
--with-http_image_filter_module 传输JPEG/PNG/GIF 图片过滤器
--with-http_stub_status_module  获取nginx自启动以来的状态
--with-http_gzip_static_module  在线实时压缩输出数据流
--with-http_gunzip_module  为不支持gzip编码方法的客户端具有"Content-Encoding: gzip"响应头
--with-http_realip_module 允许从请求标头更改客户端的ip地址
--with-http_dav_module  增加PUT DELETE MKCOL;创建集合,COPY和MOVE默认关闭
--with-http_geoip_module 使用预编译的MaxMind数据库解析客户端IP地址,得到变量值
--with-debug 启用debug日志

# 编译
make
# 安装
make install

# 整个过程中,可能缺少的依赖库
yum install -y gcc gcc-c++ openssl openssl-devel gd gd-devel GeoIP GeoIP-devel GeoIP-data zlib zlib-devel  autoconf pcre pcre-devel make automake

# 启动nginx
/path/sbin/nginx

# 启动过程中,可能会失败
* 查看设置的nginx用户是否存在

nginx的进程

nginx上多进程结构,一个master process, 一个cache Manager process,一个cache Loader process 和多个worker process进程。master process用于管理其派生的子进程,而worker进程用于处理连接请求。cache manager/cache loader用于缓存上游服务器的数据。

使用信号量管理master和worker进程

  • master进程
    • 监控worker进程
      • SIGCHLD
    • 管理worker进程
    • 接受信号
      • SIGTERM, SIGINT
      • SIGQUIT
      • SIGHUP
      • SIGUSR1
      • SIGUSR2
      • SIGWINCH
  • worker进程
    • 接受信号
      • SIGTERM,SIGINT
      • SIGQUIT
      • SIGUSR1
      • SIGWINCH
  • 命令行
    • reload: SIGHUP
    • reopen: SIGUSR1
    • stop:SIGTERM
    • quit:SIGQUIT

nginx reload重载配置文件的流程

  • 向master进程发送SIGHUP信号(reload命令)
  • master进程检查配置语法是否正确
  • master进程打开监听端口
  • master进程使用新得配置文件启动新的worker子进程
  • master进程向老的worker子进程发送SIGQUIT信号
  • 老的worker进程关闭监听据句柄,处理完当前连接后关闭进程

nginx热升级流程

  • 将旧的nginx文件替换成新的nginx文件
  • 向master进程发生SIGUSR2信号
  • master进程修改pid文件,加后缀.oldbin
  • master进程用新的nginx文件启动新的master进程
  • 向旧的master进程发送SIGWINCH信号,旧的worker子进程退出
  • 回滚情形:向旧的master发送SIGHUP信号,向新的master发送SIGQUIT信号

nginx模块

  • 核心模块
    • ngx_core
    • ngx_errlog
    • ngx_conf
    • ngx_events
    • ngx_epoll
    • ngx_regex
    • ngx_event
  • 标准http模块
    • ngx_http_core
    • ngx_http_charset
    • others
  • 可选http模块
    • ngx_http_gzip
    • ngx_http_ssl
    • others
  • mail服务模块
    • ngx_mail_core
    • ngx_mail_pop3
    • others
  • 第三方服务模块
    • rds_json_nginx
    • lua_nginx
    • others

nginx编译安装配置参数

--prefix 指定安装目录
--user 运行nginx的worker子进程的属主
--group 运行nginx的worker子进程的属组
--pid-path 存放nginx进程运行pid文件的路径
--conf-path 配置文件nginx.conf的存放路径
--error-log-path 错误日志error.log的存放路径
--http-log-path 访问日志access.log的存放路径
--with-pcre pcre库的存放路径,正则表达式会用到
--with-zlib zlib库的存放路径,gzip模块用到

nginx main模块段核心参数

user USERNAME [GROUP]  指定运行nginx的worker子进程的属主和属组,其中组可以不指定。 
示例: 
user nginx nginx;

pid DIR 指定运行nginx的master主进程的pid文件存放路径。
示例: 
pid /opt/nginx/logs/nginx.pid;

worker_rlimit_nofile NUMBER 指定worker子进程可以打开的最大文件句柄数。
示例:
worker_rlimit_nofile 2048;

worker_rlimit_core SIZE 指定worker子进程异常终止后的core文件,用于记录分析问题。
示例:
worker_rlimit_core 50M;
working_directory /opt/nginx/tmp;

worker_processes NUMBER | auto 指定nginx启动的worker子进程数量
示例:
worker_processes 4;
worker_processes auto; 

worker_cpu_affinity CPUMASK1 CPUMASK2... 指定每个worker子进程和我们cpu物理核心绑定
示例:
4个物理核心,4个worker子进程
worker_cpu_affinity 0001 0020 0100 1000; 

worker_priority NUMBER 指定worker子进程的nice值,值越小越优先:nice设定范围为-20到19
示例:
worker_priority -10;

worker_shutdown_timeout  TIME 指定worker子进程优雅退出时超时时间。
示例:
worker_shutdown_timeout 5s;

timer_resolution interval 指定worker子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降。
示例:
worker_resolution 100ms;

daemon on|off 设定nginx的运行方式,前台还是后台,前台用户调试,后台用于生产。
示例:
daemon off;

lock_file file 指定负责负载均衡互斥锁文件存放路径;
示例:
# 默认配置
lock_file /logs/nginx.lock

nginx event模块核心参数

use method 指定nginx使用哪种事件驱动模型;
method可选值:select、poll、kqueue、epoll、/dev/poll、eventport
推荐配置:不指定,让nginx自己选择

worker_connections number 指定worker子进程能够处理的最大并发连接数;
示例:
worker_connections 1024;
# 操作系统最大的连接数是65535,除以cpu的物理核数;
worker_connections 65535/worker_process; 

accept_mutex on|off  指定是否打开负载均衡互斥锁;
示例:
# 默认配置
accept_mutex off;

accept_mutex_delay time 指定新连接分配给worker子进程的超时时间;
示例:
# 默认配置
accept_mutex_delay 500ms;



muti_accept on|off  指定worker子进程可以接收的新连接个数;
示例:
# 默认配置
muti_accept off

nginx server_name

nginx 域名匹配优先级,从高到低

  • 精确匹配
  • 左侧通配符匹配
  • 右侧通配符匹配
  • 正则表达式匹配

nginx的root和alias

  • root
    • 语法: root path;
    • 上下文:http server location if
  • alias
    • 语法: alias path;
    • 上下文:location
    • 注意事项:
      • 使用alias,末尾一定要加/
      • alias只能在location块中
  • 相同点
    • URI到磁盘文件的映射
  • 区别:
    • root会将定义路径与URI叠加;alias则只取定义路径
  • location 匹配优先级,从高到低
    • =
    • ^~
    • ~
    • ~*
    • 不带任何符号
location / picture {
    root /opt/nginx/html/picture;
}

客户端请求www.test.com/picture/1.jpg,则对应磁盘映射路径/opt/nginx/html/picture/picture/1.jpg

location /picture {
  alias /opt/nginx/html/picture/;
}
客户端请求www.test.com/picture/1.jpg,则对应磁盘映射路径
/opt/nginx/html/picture/1.jpg

nginx location

  • 语法:location [= | ~ | ~* | ^~] uri {}
  • 上下文: server location
  • location 后面带/和不带/的区别
    • 不带/, nginx首先去查找是否有匹配的文件夹,如果没有文件夹,会匹配是否有配置的文件,
    • /, nginx只会查找文件夹下的文体,不会匹配文件,即只匹配文件夹
=  精确匹配
location = /images/ {...}

~ 正则匹配,区分大小写 
location ~\.(jpg|gif)$ {...}

~* 正则匹配,不区分大小写
location ~*\.(jpg|gif)$ {...}

^~ 匹配到即停止搜索
location ^~ /images/ {...}

不带任何符号
location / {...}

nginx的stbu_status模块

  • 指令语法: stub_status on | off;低于1.7.5版本,需要指定stub_status on;
  • 上下文: server location
  • 配置示例: location /uri { stub_status; }

nginx limit_conn模块

  • 限制客户端的并发连接数
  • 默认编译进nginx,通过--without-http_limit_conn_module禁用
  • 使用共享内存,多多有worker子进程生效
  • 常用指令
    • limit_conn_zone
      • 语法: limit_conn_zone key zone=name:size
      • 上下文:http
      • 示例:limit_conn_zone $binary_remote_addr zone=addr:10m
    • limit_conn_status
      • 语法: limit_conn_status code;
      • 上下文: http、server、location
      • 示例:limit_conn_status 503;
    • limit_conn_log_level
      • 语法:limit_conn_log_level info|notice|warn|error;
      • 上下文:http、server、location
      • 示例:limit_conn_log_level error;
    • limit_conn
      • 语法: limit_conn zone number
      • 上下文: http、server、location
      • 示例:limit_conn addr 100;

nginx limit_req模块

  • 用于限制客户端处理请求的平均速率
  • 默认编译进nginx,通过--without-http_limit_req_module禁用
  • 默认使用共享内存,对所有worker子进程生效。
  • 常用指令:
    • limit_req_zone
      • 语法: limit_req_zone key zone=name:size rate=rate;
      • 上下文:http
      • 示例: limit_req_zone $binary_remote_add zone=one:10m rate=2r/m;
    • limit_req_status
      • 语法: limit_req_status code
      • 上下文:http、server、location
      • 示例:limit_req_status 503;
    • limit_req_log_level
      • 语法: limit_req_log_level info|notice|warn|error
      • 上下文 http、server、location
        示例: limit_req_log_level error;
    • limit_req
      • 语法:limit_req zone=name [burst=number] [nodelay|delay=number];
      • 上下文:http、server、location
      • 示例:limit_req zone=one;limit_req zone=one burst=5 nodelay;

限制特定ip或网段访问的access模块

  • 指令集
    • allow
      • 语法 allow address|cidr|unix|all;
      • 上下文:http、server、location、limit_except
      • 示例:allow 192.167.0.10;
    • deny
      • 语法: deny address |cidr |unix|all;
      • 上下文: http、server、location、limit_except
      • 示例: deny 192.168.0.0/24
# 组合示例
location /  {
  deny 192.168.1.1;
  allow 192.168.1.0/24;
  allow 10.1.1.0/16;
  allow 2001:0db8::/32;
  deny all;
}

nginx限定特定用户访问的auth_basic模块

  • 基于http basic authentication协议进行用户名密码认证
  • 默认已编译进nginx,通过--without-http_auth_basic_module 禁用
  • 指令集:
    • auth_basic
      • 语法:auth_basic string | off;
      • 上下文:http、server、location、limit_except
      • 示例: auth_basic off;
    • auth_basic_user_file
      • 语法:auth_basic_user_file file;
      • 上下文:http、server、location、limit_except
      • 示例:auth_basic_user_file /opt/nginx/log/file;

nginx的auth_request模块

  • 默认未编译进nginx,通过 with-http_auth_request_module启用
  • 指令集
    • auth_request
      • 语法:auth_request uri |off
      • 上下文:http、server、location
      • 示例:auth_request off;
    • auth_request_set
      • 语法:auth_request_set $variable value;
      • 上下文:http、server、location
      • 示例:auth_request_set
location /private/ {
   auth_request /auth;
}

location /auth {
   proxy_pass http://127.0.0.1:8080/verify;
   proxy_pass_request_body off;
   proxy_set_header Content-Length "";
   proxy_set_header X-Original-URI $request_uri;
}

nginx的rewrite模块

  • return指令
    • 停止处理请求,直接发返回相应码或重定向到其他url
    • 执行return指令后,location中的其他指令将不会被执行
    • 语法:
      • return code [text]
      • return code url
      • return url
    • 上下文
      • server、location、if
location / {
  ....
  return 404;
  ....
}
  • rewrite指令

  • 根据指定正则表达式匹配规则,重写url

  • 语法:rewrite regex replacement [flag]

    • flag 可选值
      • last 重写后的url发起新的请求,再次进入server段,重试location中的匹配
      • break 直接使用重写后的url,不再匹配其他location中的语句
      • redirect 返回302临时重定向
      • permanent 返回301永久重定向
  • 上下文:server、location、if

  • 示例:rewrite /images/(.*.jpg)$ /pic/$1;

  • if指令

    • 语法: if (condtion) {...};
    • 上下文:server、location
    • 示例:if ($http_user_agent ~Chrome)

nginx的autoindex功能

  • 用户请求以/结尾时,列出目录结构

  • 指令集

    • autoindex
      • 语法:autoindex on|off
      • 上下文:http、server、location
      • 示例:autoindex off
    • autoindex_exact_size
      • 语法:autoindex_exact_size on|off
      • 上下文:http、server、location
      • 示例:autoindex_exact_size on;
    • autoindex_format
      • 语法:autoindex_format html|xml |json|jsonp
      • 上下文:http、server、location
      • 示例:autoindex_format html;
    • autoindex_localtime
      • 语法: autoindex_localtime on|off
      • 上下文: http、server、location
      • 示例:autoindex_localtime off;
  • nginx的变量分类

  • TCP连接变量

    • remote_addr 客户端ip地址
    • remote_port 客户端端口
    • server_addr 服务端ip地址
    • server_port 服务端端口
    • server_protocol 服务端协议
    • binary_remote_addr 二进制格式的客户端IP地址
    • connection TCP连接的序号,递增
    • connection_request TCP连接当前的请求数量
    • proxy_protocol_addr 若使用了proxy_protocol协议,则返回协议中地址,否则返回空
    • proxy_protocol_port 若使用了proxy_protocol协议,则返回协议中端口,否则返回空
  • HTTP请求变量

    • uri 请求的uri,不包含参数
    • request_uri 请求的uri,包含参数
    • scheme 协议名,http或https
    • request_method 请求方法
    • request_length 全部请求的长度,包括请求行、请求头、请求体
    • args 全部参数字符串
    • args_参数名 特定参数值
    • is_args url中有参数,则返回?;否则返回空
    • query_string 与args相同
    • remote_user 由http basic authentication协议传入的用户名
    • host 先看请求行,在看请求头,最后找server_name
    • http_user_agent 用户浏览器
    • http_referer 从哪些链接过来的请求
    • http_via 经过一层代理服务器,添加对应代理服务器的信息
    • http_x_forwarded_for 获取用户真实ip
    • http_cookie 用户cookie
  • nginx处理HTTP请求产生的变量

    • request_time 处理请求已耗费的时间
    • request_id 请求的id
    • request_completion 请求处理完成返回ok,否则返回空
    • server_name 匹配请求的server_name值
    • https 若开启https,则返回on,否则返回空
    • request_filename 磁盘文件系统待访问文件的完整路径
    • document_root 由uri和root/alias规则生成的文件夹路径
    • realpath_root 将document_root中的软连接换成真实路径
    • limit_rate 返回响应时的速度上限值
  • nginx返回响应变量

  • nginx内部变量

nginx定义上游服务的upstream模块

  • upstream模块用于定义上游的服务相关信息
  • 指令集
  • upstream 段名,以{开始,}结束,中间定义上游服务的URL
    • 默认已被编译进nginx ,禁用须通过 --without-http_upstream_module
    • 语法: upstream name {}
    • 上下文:http
    • 示例: upstream {}
  • server 定义上游服务地址
    • 语法: server address [parameters]
      • weight=number权重值,默认为1
      • max_conns=number 上游服务器的最大并发连接数
      • fail_timeout=time 服务不可用的判定时间
      • max_fails=number 服务器不可用的检查次数
      • backup 备份服务器,仅当其他服务器都不可用时
      • down 标记服务器长期不可用,离线维护
    • 上下文:upstream
    • 示例:
  • zone 定义共享内存,用于跨worker子进程
  • keepalive 对上游服务启用长链接
    • 语法:keepalive connections
    • 上下文:upstream
    • 示例:keepalive 16;
  • keepalive_requests 一个长链接最多请求个数
    • 语法:keepalive_requests number,默认number 100
    • 上下文:upstream
    • 示例:keepalive_requests 50;
  • keepalive_timeout 空闲情况下,一个长链接的超时时间
    • 语法: keepalive_timeout time;
    • 上下文:upstream
    • 示例: keepalive_timeout 60s;
upstream back_end {
  server 127.0.0.1:8080 weight=3 max_conns=1000 fail_timeout=10s max_fails=2;
  keepalive 32;
  keepalive_requests 50;
  keepalive_timout 30s;
}

nginx的proxy_pass指令

  • 由http_proxy模块提供(ngx_http_proxy_module)
  • 默认已被编译进nginx,禁用须通过--without-http_proxy_module
  • 语法:proxy_pass url
  • 上下文:location、if、limit_except
  • 示例:
  • 注意点
    • url必须以http或https开头
    • url可以携带变量
    • url中是否带uri,直接影响发往上游请求的url

proxy_pass常见的误区

  • 带/和不带/用法的区别
    • 不带/意味着nginx不会修改用户URL,而是直接透传给上游的应用服务器
    • 带/意味着nginx会修改用户URL,修改方法:将location匹配后的URL从用户URL中删除
  • 代理到上游服务器的url结尾是否有必要加/
    • 根据服务的部署的目录结构调整

nginx接收用户请求包的处理方式

  • 请求体上全部接受传送合适接受一部分传输一部分,这是根据proxy_request_buffering指令相关
  • 指令集
    • proxy_request_buffering
      • 语法:proxy_request_buffering on |off;
      • 默认值:proxy_request_buffering on;
      • 上下文:http、server、location
    • client_max_body_size
      • 若请求体大小(Content-Length)> client_max_body_size时,请求失败,nginx返回413状态码:Request Entity Too Large
      • 语法:client_max_body_size size
      • 默认值:client_max_body_size 1M;
        *上下文:http、server、location
    • client_body_buffer_size
      • 若请求体大小(Content-Length)< client_body_buffer_size时, 请求体存储到内存中,请求成功,若若请求体大小(Content-Length)> client_body_buffer_size时, 请求体存储磁盘client_body_temp_path path指定目录,请求成功。
      • 语法:client_body_buffer_size size
      • 默认值:client_body_buffer_size 8k|16K;
      • 上下文:http、server、location
    • client_body_in_single_buffer,请求体内存缓冲尽可能分配到连续的内存空间上
      • 语法:client_body_in_single_buffer on | off;
      • 默认值:client_body_in_single_buffer off;
      • 上下文:http、server、location
    • client_body_temp_path 请求体磁盘缓冲文件目录
      • 语法: client_body_temp_path path [level1] [level2] [level3]
      • 默认值:client_body_temp_path client_body_temp;
      • 上下文:http、server、location
    • client_body_in_file_only 当on时,请求体大小不管大小,都存储在磁盘上,clean不管请求体大小,都存储在磁盘上,但是请求结束后,会删除磁盘文件,off禁止缓冲磁盘文件
      • 语法:client_body_in_file_only on|clean|off
      • 默认值:client_body_in_file_only off
      • 上下文:http、server、location
    • client_body_timeout
      • 语法:client_body_timeout time
      • 默认值:client_body_timeout 60s
      • 上下文:http、server、location

nginx反向代理场景下,如何更改发往上游的用户请求

  • 请求行修改指令
    • proxy_method method 请求行方法
      • 语法: proxy_method method
      • 默认值: 无
      • 上下文: http、server、location
    • proxy_http_version 请求行协议
      • 语法:proxy_http_version 1.0|1.1
      • 默认值:proxy_http_version 1.0
      • 上下文:http、server、location
    • proxy_set_header
      • 语法:proxy_set_header field value
      • 默认值:
        • proxy_set_header Host $proxy_host;
        • proxy_set_header Connection close;
      • 上下文:http、server、location
    • proxy_pass_request_headers
      • 语法:proxy_pass_request_headers on|off
      • 默认值: proxy_pass_request_headers on
      • 上下文: http、server、location
    • proxy_pass_request_body
      • 语法: proxy_pass_request_body on|off
      • 默认值:proxy_pass_request on
      • 上下文:http、server、location

nginx 配置实现负载均衡算法

  • 权重算法
  • 哈希算法
    • 指令
      • 语法: hask key [consistent]
      • 默认值: 无
      • 上下文:upstream
  • ip-hash算法
    • 指令
      • 语法:ip_hash
      • 默认值:无
      • 上下文:upstream
  • 轮询默认
  • least_conn最少连接算法
    • 指令
      • least_conn
        • 模块ngx_http_upstream_least_conn_module,默认编译在nginx中,禁用--without-http_upstream_least_conn_module
        • 语法:least_conn
        • 默认值:无
        • 上下文:upstream
  • fair第三方
  • url_hash 第三方
posted @ 2022-09-17 19:27  phper-liunian  阅读(44)  评论(0编辑  收藏  举报