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进程
- 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;
- limit_conn_zone
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;
- limit_req_zone
限制特定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
- allow
# 组合示例
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;
- auth_basic
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
- auth_request
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永久重定向
- flag 可选值
-
上下文: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;
- autoindex
-
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 {}
- 默认已被编译进nginx ,禁用须通过
- server 定义上游服务地址
- 语法: server address [parameters]
- weight=number权重值,默认为1
- max_conns=number 上游服务器的最大并发连接数
- fail_timeout=time 服务不可用的判定时间
- max_fails=number 服务器不可用的检查次数
- backup 备份服务器,仅当其他服务器都不可用时
- down 标记服务器长期不可用,离线维护
- 上下文:upstream
- 示例:
- 语法: server address [parameters]
- 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
- 示例:
- proxy_pass http://127.0.0.18080
- proxy_pass http://127.0.0.1:8080/proxy
- 注意点
- 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
- proxy_request_buffering
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
- proxy_method method 请求行方法
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
- 模块ngx_http_upstream_least_conn_module,默认编译在nginx中,禁用
- least_conn
- 指令
- fair第三方
- url_hash 第三方