从源码编译安装
下载nginx-1.26.3.tar.gz并解压
shell
tar zxvf nginx-1.26.3.tar.gz
进入解压后的目录nginx-1.26.3,configure为安装脚本,输入*./configure*命令会提示缺少依赖,安装对应依赖
shell
yum install -y gcc
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
通过configure安装
shell
./configure --prefix=/home/nginx
prefix指定nginx安装目录,默认为/usr/local/nginx,更多参数查看nginx.org/en/docs/con...
执行make和make install安装完成
启动nginx
进入到nginx安装目录的sbin目录下
./nginx启动./nginx -s stop快速关闭./nginx -s quit平稳关闭,在退出前完成已接受的请求./nginx -s reload重新加载nginx配置文件,不重启服务
将nginx创建为服务文件并设置为系统服务,/etc/systemd/system或/usr/lib/systemd/system目录下
shell
vi /usr/lib/systemd/system/nginx.service
shell
[Unit]
Description=Nginx HTTP Server
After=network.target # 网络启动后再启动 Nginx
[Service]
Type=forking # Nginx 以 fork 方式运行(后台进程)
PIDFile=/home/nginx/logs/nginx.pid # PID 文件路径(必须与 Nginx 配置一致)
ExecStartPre=/home/nginx/sbin/nginx -t #检查配置文件
ExecStart=/home/nginx/sbin/nginx # 启动命令
ExecReload=/home/nginx/sbin/nginx -s reload # 重载配置命令
ExecStop=/home/nginx/sbin/nginx -s stop # 停止命令(优雅停止设置为quit)
PrivateTmp=true # 为服务分配独立的临时目录,增强安全性
[Install]
WantedBy=multi-user.target # 声明多用户模式下开机自启
重载systemd配置文件
shell
systemctl daemon-reload
启动开机自启
shell
systemctl enable nginx.service
shell
systemctl start nginx #启动
systemctl stop nginx #停止
systemctl status nginx #运行状态
systemctl reload nginx #重新加载配置
systemctl retart nginx #重启
常用配置说明
nginx有一个master进程以及多个worker进程,master加载配置文件和维护worker进程,worker处理请求。
ngx_core_module
worker进程使用的用户,group省略时与user相同
nginx
#语法
user user [group];
#默认值
user nobody nobody;
#位置:main
主进程id存储位置
nginx
#语法
pid file;
#默认值
pid logs/nginx.pid;
#位置:main
错误日志配置,file表示路径,level可选debug 、 info 、 notice 、 warn 、 error 、 crit 、 alert 或 emerg
nginx
#语法
error_log file [level];
#默认值
error_log logs/error.log error;
#位置:main, http, mail, stream, server, location
工作进程可同时打开的最大连接数,包含与代理服务器和客户端的连接
nginx
#语法
worker_connections number;
#默认值
worker_connections 512;
#位置:events
工作进程的数量,auto会自动检测CPU核数
nginx
#语法
worker_processes number | auto;
#默认值
worker_processes 1;
#位置:main
ngx_http_core_module
server
一个nginx 可以有多个server 块,每个server_name可以有多个域名,空格分隔,接收请求时,先通过ip和端口 匹配listen,再通过请求头中的HOST 确定到哪个server ,未匹配到时第一个server 为默认服务器,可以通过在listen 中添加 default_server 指定默认服务器。请求头中没有HOST ,将匹配server_name ""。server_name _表示不匹配
server_name、listen
listen监听服务器**[ip:]端口**的请求,忽略时监听所有ip
server_name 配置通过本机host文件解析或远端DNS解析的域名 ,*为通配符
基于名称的虚拟服务器
nginx
server {
listen 80 default_server;
server_name example.net www.example.net;
...
}
server {
listen 80;
server_name "";
return 444;
}
基于名称和IP的虚拟服务器
nginx
server {
listen 192.168.1.1:80;
server_name example.org www.example.org;
...
}
server {
listen 192.168.1.1:80;
server_name example.net www.example.net;
...
}
client_body_buffer_size
http、server、location
读取客户端请求体的内存缓冲区大小,超出部分写入临时文件
nginx
#语法
client_body_buffer_size size;
#默认值
client_body_buffer_size 8k|16k;
#位置:http、server、location
client_body_in_file_only
将客户端请求体整个保存到文件中
nginx
#语法
client_body_in_file_only on | clean | off;
#默认值
client_body_in_single_buffer off;
#位置:http、server、location
on将请求体保存在临时文件中,请求处理完成后不删除clean将请求体保存在临时文件中,请求处理完成后删除off小请求体存缓存区,大请求体存临时文件,处理后自动删除临时文件
client_body_in_single_buffer
是否将客户端发送的请求体完整存储在单个内存缓冲区中,当 client_body_in_single_buffer on 且请求体未超过缓冲区大小时,$request_body 可直接获取完整内容;否则可能为空或不完整。
nginx
#语法
client_body_in_single_buffer on | off;
#默认值
client_body_in_single_buffer off;
#位置:http, server, location
client_body_temp_path
请求体储存时的临时文件目录
nginx
#语法
client_body_temp_path path [level1 [level2 [level3]]];
#默认值
client_body_temp_path client_body_temp;
#位置:http, server, location
level对应子目录,最多可有三级,每个level均取值为1-3,表示该层级目录数,如client_body_temp_path client_body_temp 1 2 ,表示一级目录有16个,二级目录有16²个目录
client_body_timeout
读取客户端请求体的超时时间。仅设置在两次连续读取操作之间的时间段内,而不是整个请求体的传输时间,超时显示408
nginx
#语法
client_body_timeout time;
#默认值
client_body_timeout 60s;
#位置:http, server, location
client_header_buffer_size
读取客户端请求头的内存缓冲区大小,超过缓冲区大小则根据large_client_header_buffers设置处理
nginx
#语法
client_header_buffer_size size;
#默认值
client_header_buffer_size 1k;
#位置:http, server
client_header_timeout
读取客户端请求头的超时时间。如果客户端在此时间内未传输完整请求头,请求将终止并返回 408(请求超时)错误
nginx
#语法
client_header_timeout time;
#默认值
client_header_timeout 60s;
#位置:http, server
client_max_body_size
客户端氢气体的最大大小,超过返回413错误,0表示禁用对请求体大小的检查
nginx
#语法
client_max_body_size size;
#默认值
client_max_body_size 1m;
#位置:http, server, location
location
nginx
#语法
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
#位置:server, location
优先级从高到低:
=精确匹配^~特殊前缀匹配,一旦匹配成功,会终止后续正则匹配检查~正则匹配区分大小写~*正则匹配不区分大小写,正则表达式第一个匹配时会直接使用其配置并终止后续搜索- 普通前缀匹配,遵循最长匹配原则
@name不能嵌套,自定义名称一般用于重定向
location请求若由proxy_pass处理且指定了URI,匹配部分将会被替换并拼接到proxy_pass后面,location请求对应的静态资源相对于当前location的root目录下
keepalive
复用已建立的 TCP 连接处理多个 HTTP 请求 / 响应,避免每次请求都重新建立和关闭 TCP 连接,从而减少网络开销、提升通信效率。
客户端
nginx
#语法
keepalive_disable none | browser ...;
#默认值
keepalive_disable msie6;
#位置:http, server, location
none启用所有浏览器长连接msie6禁用IE6的长连接(默认)safari禁用safari长连接
一个长连接的总时长,达到时间时关闭连接
nginx
#语法
keepalive_time time;
#默认值
keepalive_time 1h;
#位置:http, server, location
一个长连接在该时间内没接收到请求,则会关闭该请求,0表示禁用keepalive
nginx
#默认值
keepalive_timeout timeout [header_timeout];
#默认值
keepalive_timeout 75s;
#位置:http, server, location
一个长连接可处理的最大请求数量
nginx
#语法
keepalive_requests number;
#默认值
keepalive_requests 1000;
#位置:http, server, location
upstream
设置与后端上游服务器的空闲长连接池
nginx
#语法
keepalive connections;
#位置:upstream
空闲长连接池的最大数量,修改负载均衡方法时该指令需在其之后,对于http需在location中设置
nginx
location /http/{
proxy_http_version 1.1;#HTTP/1.0 默认不支持长连接,需客户端显式发送Connection:keep-alive 头
proxy_set_header Connection "";#清除客户端请求中的 Connection 头,避免后端服务器关闭长连接
}
keepalive_requests 一个长连接可处理的最大请求数量
keepalive_time 一个长连接的总时长,达到时间时关闭连接
send_timeout
nginx向客户端传输响应的超时时间,仅在两次连续的写操作之间,不是整个响应
nginx
#语法
send_timeout time;
#默认值
send_timeout 60s;
#位置:http, server, location
ETag
启用或禁用响应头中的ETag,基于资源的大小时间等生成,用于客户端缓存判断请求的资源是否发生更改,请求时响应头会返回ETage,再次请求时服务器对比请求头中的If-None-Modified与服务端的ETag,若未修改返回状态码304,常与Last-Modified配合使用
nginx
#语法
etag on | off;
#默认值
etag on;
#位置:http, server, location
if_modified_since
服务器如何比较请求头中的If-Modified-Since和服务器资源的Last-Modified
nginx
#语法
if_modified_since off | exact | before;
#默认值
if_modified_since exact
#位置:http, server, location
off 不比较,始终视为已修改
exact 精确匹配
before 响应的时间小于等于请求头中的If-Modified-Since的时间
sendfile
用于优化静态文件传输性能的核心配置,其底层依赖操作系统的sendfile系统调用,主要作用是减少数据在用户空间与内核空间之间的拷贝次数
nginx
#语法
sendfile on | off;
#默认值
sendfile off;
#位置:http, server, location, if in location
传统传输文件流程:
- 操作系统从磁盘读取文件数据,存入内核缓冲区(内核空间);
- 数据从内核缓冲区拷贝到应用程序缓冲区(用户空间,如 Nginx 进程的内存);
- 数据再从应用程序缓冲区拷贝到Socket 缓冲区(内核空间,用于网络发送);
- 最终从 Socket 缓冲区通过网络发送给客户端
使用sendfile的流程:
- 磁盘数据读入内核缓冲区;
- 内核直接将缓冲区数据 "移交" 给 Socket 缓冲区(通过指针映射,而非实际拷贝);
- 数据从 Socket 缓冲区发送到客户端。
open_file_cache
缓存文件的元数据
nginx
#语法
open_file_cache off;
open_file_cache max=N [inactive=time];
#默认值
open_file_cache off;
#位置:http, server, location
off关闭
max设置缓存的最大元素数量
inactive移除指定时间内未被访问的缓存
open_file_cache_errors
控制是否缓存 文件错误信息
nginx
#语法
open_file_cache_errors on | off;
#默认值
open_file_cache_errors off;
#位置:http, server, location
open_file_cache_min_uses
在 open_file_cache 的 inactive 时间窗口内,一个文件至少被访问多少次,其元数据才会被保留在缓存中
nginx
#语法
open_file_cache_min_uses number;
#默认值
open_file_cache_min_uses 1;
#位置:http, server, location
open_file_cache_valid
设置缓存中元数据的定期验证间隔,定期(每间隔该时间)验证缓存中的元数据是否与磁盘实际文件一致并修改
nginx
#语法
open_file_cache_valid time;
#默认值
open_file_cache_valid 60s;
#默认值
error_page
根据响应码跳转到相应错误页
nginx
#语法
error_page code ... [=[response]] uri;
#位置:http, server, location, if in location
code响应码,多个用空格分隔
=response更改响应码为response响应码
uri指本地静态文件路径、外部地址、内部命名 location如自定义@name
nginx
error_page 500 502 503 504 /50x.html;
# 精确匹配50x.html 限制 /50x.html 仅内部访问
location = /50x.html {
internal; # 客户端直接请求 example.com/50x.html 会返回 404
root /usr/share/nginx/html; # 明确指定文件所在目录(可选,若继承server的root则可省略)
}
limit_rate
限制对客户端的响应速率,每秒的字节数,如1k表示1k/s,针对的是客户端的一个请求,客户端同时打开两个连接,总速率将是限制的两倍,0表示不限制
nginx
#语法
limit_rate rate;
#默认值
limit_rate 0;
#位置:http, server, location, if in location
可结合limit_rate_after(传输一定字节后限速)
ngx_http_proxy_module
proxy_bind
指与反向代理服务器连接时本地的ip和端口,off取消从上一级继承的proxy_bind的配置,transparent指定为非本机ip,如$remote_addr指定为客户端的真实ip地址(需要系统层面配置支持)
nginx
#语法
proxy_bind address [transparent] | off;
#位置:http, server, location
proxy_pass
proxy_pass设置反向代理地址,后可配置多个地址,空格隔开,也可配置为server_group
nginx
#语法
proxy_pass URL;
#位置:location, if in location, limit_except
若proxy_pass 中指定了URI,则location 中匹配的URI部分将被替换为proxy_pass的部分再拼接到后面进行反向代理。
若proxy_pass 中未指定URI,则location 中的URI将被拼接到proxy_pass中进行反向代理。
proxy_buffering
启用或禁用代理服务器响应的缓存区
nginx
#语法
proxy_buffering on | off;
#默认值
proxy_buffering on;
#位置:http, server, location
启用时将响应保存到proxy_buffer_size和 proxy_buffers设置的缓冲区中,超过内存缓冲区大小的部分将存在proxy_max_temp_file_size和proxy_temp_file_write_size的临时文件中
禁用时Nginx 就立即发给客户端,不读取响应
proxy_buffer_size
读取反向代理服务器响应的第一部分的内存缓冲区大小,通常为响应头
nginx
#语法
proxy_buffer_size size;
#默认值,取决于系统
proxy_buffer_size 4k|8k;
#位置:http, server, location
proxy_buffers
读取代理服务器响应体 的内存缓冲区大小,接收响应时先将响应体存入内存缓冲区,超出的部分存入临时文件proxy_max_temp_file_size
nginx
#语法
proxy_buffers number size;
#默认值
proxy_buffers 8 4k|8k;
#位置:http, server, location
number 缓冲区数量
size 缓冲区大小
proxy_busy_buffers_size
读取响应的缓冲区能用于向客户端发送响应的缓冲区总大小(这些缓冲区无法被用于读取代理服务器响应)
nginx
#语法
proxy_busy_buffers_size size;
#默认值
proxy_busy_buffers_size 8k|16k;
#位置:http, server, location
proxy_set_header
向反向代理服务器中重新定义或追加请求头
nginx
#语法
proxy_set_header field value;
#默认值
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
#位置:http, server, location
value可以是文本、变量、及其组合
proxy_cache
是否开启对代理服务器的缓存
nginx
#语法
proxy_cache zone | off;
#默认值
proxy_cache off;
#位置:http, server, location
zone指定的缓存区域的名称,相同的区域可重复使用,区域名称见proxy_cache_path的keys_zone
off关闭
proxy_cache_background_update
是否开启:缓存内容过期时,先向客户端返回旧缓存,同时在后台异步更新缓存
nginx
#语法
proxy_cache_background_update on | off;
#默认值
proxy_cache_background_update off;
#位置:http, server, location
proxy_cache_bypass
如果指定的变量中至少一个不为非空且不等于0则绕过缓存
nginx
#语法
proxy_cache_bypass string ...;
#位置:http, server, location
proxy_cache_methods
缓存对应请求方法的响应
nginx
#语法
proxy_cache_methods GET | HEAD | POST ...;
#默认值
proxy_cache_methods GET HEAD;
#位置:http, server, location
proxy_cache_purge
如果指定的变量中至少一个不为非空且不等于0则清除缓存
nginx
#语法
proxy_cache_purge string ...;
#位置:http, server, location
proxy_cache_key
缓存的键名,识别不同请求的唯一标识
nginx
#语法
proxy_cache_key string;
#默认值
proxy_cache_key $scheme$proxy_host$request_uri;
#位置:http, server, location
proxy_cache_lock
开启时,若资源未缓存,只有一个会请求后端并缓存,其余有相同缓存键的请求进入等待队列阻塞直至从缓存中获取
nginx
#语法
proxy_cache_lock on | off;
#默认值
proxy_cache_lock off;
#位置:http, server, location
proxy_cache_lock_age
在指定时间内向代理服务器发送请求并缓存未完成时,进入等待队列有相同缓存键的请求会再发一个请求
nginx
#语法
proxy_cache_lock_age time;
#默认值
proxy_cache_lock_age 5s;
#位置:http, server, location
proxy_cache_lock_timeout
请求上锁的超时时间,单个请求超过该时间时,会发送给代理服务器,但不缓存响应
nginx
#语法
proxy_cache_lock_timeout time;
#默认值
proxy_cache_lock_timeout 5s;
#位置:http, server, location
proxy_cache_min_uses
达到指定的请求次数后缓存响应
nginx
#语法
proxy_cache_min_uses number;
#默认值
proxy_cache_min_uses 1;
#位置:http, server, location
proxy_cache_path
设置缓存位置及其他参数,proxy_cache_path可多次定义
nginx
#语法
proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [min_free=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
#位置:http
缓存文件名是缓存键名经过MD5后的结果
path缓存文件的目录
level缓存的没目录层级,层级范围是1:3最多三层,每层用只能是1或2,代表几个16进制,如1:2:2表示三层,分别为16、16*16、16*16个目录
use_temp_path是否先将缓存写入临时文件,再重命名为缓存文件,若临时文件和缓存文件不在同一个文件系统,就不是重命名操作,设置为on时,临时文件位置由proxy_temp_path指定,off临时文件直接放在缓存目录中
keys_zone定义代理服务器的缓存区域,即proxy_cache指定的zone,存在内存中
inactive指定时间内未被访问 的缓存数据,无论是否过期,都会移除,默认10分钟
proxy_cache_revalidate
缓存过期时允许发送If-Modified-Since和If-None-Match请求头重新验证缓存是否更改,仅更改才会拉取,否则复用
nginx
#语法
proxy_cache_revalidate on | off;
#默认值
proxy_cache_revalidate off;
#位置:http, server, location
proxy_cache_use_stale
后端服务异常时是否使用过期缓存
nginx
#语法
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | off ...;
#默认值
proxy_cache_use_stale off;
#位置:http, server, location
error后端返回任何错误(如连接拒绝、重置等)时使用过期缓存
proxy_cache_valid
设置不同响应代码的缓存有效期时间
nginx
#语法
proxy_cache_valid [code ...] time;
#位置:http, server, location
若仅指定了时间,缓存的响应码为200、301、302,any表示任何相应
ngx_http_upstream_module
upstream
定义一组服务器。服务器可以监听不同的端口
nginx
#语法
upstream name { ... }
#位置:http
nginx
upstream dynamic {
server backend1.example.com weight=5;
server backend2.example.com:8080;
}
server {
location / {
proxy_pass http://dynamic;
health_check;
}
}
格式为:域名/ip[+端口]
nginx
#语法
server address [parameters];
#位置:upstream
weight=number 设置服务器权重,默认为1
max_fails=number 在fail_timeout时间内最大的失败次数,默认为1,超过后服务视为不可用。
fail_timeout=time 1.失败次数的次序时间;2.服务器被视为不可用的时间段。
负载均衡方式
-
轮询(默认)
-
hash key基于key的hash映射,可设置为$request_uri等变量 -
ip_hash对客户端请求的ip进行hash取余,确保同一客户端的请求始终转发到同一服务器
ngx_http_rewrite_module
rewrite
nginx
#语法
rewrite regex replacement [flag];
#位置:server, location, if
使用 PCRE 正则表达式更改请求 URI,不能超过10次,通过引用$1、$2...引用URI中的捕获组
flag 参数如下:
last 终止当前location或server块中的所有配置,根据新 URI 重新匹配location(内部跳转)
break 终止当前块的后续rewrite规则,不重新匹配location,在当前块中继续处理请求
redirect 返回 302 临时重定向(浏览器不会缓存跳转关系),适用于临时调整 URL
permanent 返回 301 永久重定向(浏览器会缓存跳转关系),适用于 URL 永久变更
ngx_http_referer_module
referer
nginx
#语法
valid_referers none | blocked | server_names | string ...;
#位置:server, location
指定请求头中的Referer来源,嵌入到 $invalid_referer 变量,允许的来源变量被设为空字符串,否则为1,结合if($invalid_referer)判断是否允许以实现防盗链和请求来源验证
none 允许请求头缺少Referer
blocked 允许请求头的Referer的值被防火墙或代理服务器删除
server_names 允许匹配server块中的server_name域名
自定义字符串 可以在开头或结尾有 *
正则表达式 以~开始
ngx_http_gzip_module
使用gzip动态压缩响应,减少传输数据
gzip
开启或禁用gzip动态压缩
nginx
#语法
gzip on | off
#默认值
gzip off
#位置:http, server, location, if in location
gzip_static
是否启用预压缩直接发送预先压缩好的静态资源的.gz文件
nginx
#语法
gzip_static on | off | always;
#默认值
gzip_static off;
#位置:http, server, location
on有预压缩文件且客户端支持gzip,否则返回原文件
off关闭预压缩
always有.gz文件时,不论客户端是否支持直接发送预压缩文件
gzip_buffers
设置压缩响应的缓冲区数量和大小,默认情况下,缓冲区大小等于一个内存页,取决于系统
nginx
#语法
gzip_buffers number size;
#默认值
gzip_buffers 32 4k|16 8k;
#位置:http, server, location
gzip_comp_level
设置响应的压缩等级,范围为1~9,值越大压缩率越高但越耗费服务器CPU
nginx
#语法
gzip_comp_level level;
#默认值
gzip_comp_level 1;
#位置:http, server, location
gzip_disable
当请求头User-Agent中的值与表达式匹配时禁用gzip响应压缩
nginx
#语法
gzip_disable regex ...;
#位置:http, server, location
gzip_http_version
设置gzip压缩响应所需的最低http版本,对符合条件的压缩
nginx
#语法
gzip_http_version 1.0 | 1.1;
#默认值
gzip_http_version 1.1;
#位置:http, server, location
gzip_min_length
设置启用压缩的响应的最小长度,由Content-Length响应头确定,避免对过小响应压缩
nginx
#语法
gzip_min_length length;
#默认值
gzip_min_length 20;
#位置:http, server, location
gzip_proxied
是否对代理服务器的响应进行压缩
nginx
#语法
c off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
#默认值
gzip_proxied off;
#位置:http, server, location
off对所有代理请求禁用压缩expired响应头包含Expires字段且值为过期时间则启用压缩no-cache响应头包含有Cache-Control:no-cache则启用压缩no-store响应头包含有Cache-Control:no-store则启用压缩private响应头包含有Cache-Control:private则启用压缩no_last_modified响应头不包含Last-Modified字段则启用压缩no_etag响应头不包含ETag则启用压缩auth请求头包含Authorization则启用压缩any对所有代理请求启用压缩
gzip_types
指定对MIME类型的响应进行压缩
nginx
#语法
gzip_types mime-type ...;
#默认值
gzip_types text/html;
#位置:http, server, location
gzip_vary
为开启了gzip的响应添加Vary: Accept-Encoding响应头,该响应头用于告诉缓存服务器,当前资源根据客户端请求头中的Accept-Encoding变化,仅gzip on/gzip_static on开启时可用
nginx
#语法
gzip_vary on | off;
#默认值
gzip_vary off;
#位置:http, server, location
brotli
比gzip压缩效率更高的压缩算法,仅在https中能用
ngx_http_ssl_module
ssl
http、server、location
nginx
server {
listen 443 ssl;
keepalive_timeout 70;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
ssl_certificate /usr/local/nginx/conf/cert.pem;
ssl_certificate_key /usr/local/nginx/conf/cert.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
}
listen 443 ssl 开启https,默认的端口为443
ssl_certificate ssl证书
ssl_certificate_key ssl私钥
ngx_http_ssi_module
服务端包含,通过特定指令在服务器端合并静态文件、动态内容,再返回给客户端
ssi
开启或禁用
nginx
#语法
ssi on | off;
#默认值
ssi off;
#位置:http, server, location, if in location
开启或禁用,根据请求头中的If-Modified-Since与主文件的Last-Modified对比是否更新,并设置响应头Last-Modified
nginx
#语法
ssi_last_modified on | off;
#默认值
ssi_last_modified off;
#位置:http, server, location
ssi命令
nginx
<!--# include file="footer.html" -->
指定一个文件包含另一个文件,如在html中使用
ngx_http_limit_req_module
请求限流模块,基于漏桶算法(漏桶容量和流出请求速率固定,请求过快会溢出拒绝请求),限制单位时间内来自key标识的请求次数
limit_req_zone
定义一个共享内存区,可配置多个
nginx
#语法
limit_req_zone key zone=name:size rate=rate [sync];
#位置:http
key针对限流的key(按什么标识限流),可以包含文本、变量及其组合,如使用变量$binary_remote_addr表示的是客户端的ip地址的二进制形式,占用内存小,$remote_addr客户端ip地址字符串形式,$server_name针对server中的server_name限流
zone定义的共享内存区域,其中name表示区域名称,size表示区域大小如10m,存储统计数据,若存储已满,则会移除最久未使用的,若还是不行则以错误形式终止请求
rate限流速率(漏桶请求流出速率),如10r/s(每秒最多 10 次请求)、60r/m(每分钟最多 60 次,即每秒 1 次)
limit_req
引用limit_req_zone中的共享内存区域对该区块请求生效,可配置多个
nginx
#语法
limit_req zone=name [burst=number] [nodelay | delay=number];
#位置:http, server, location
zone引用limit_req_zone对应的区域名称
burst突发请求(即超出请求限制的请求)的缓冲队列大小,超过该队列的请求将以错误形式终止请求,默认为0,针对每个key
nodelay让burst队列中请求跳过等待,直接处理,与burst绑定,但不超过rate速率,无nodellay时,排队在一定延迟后进行处理,有nodelay时满足rate的情况下立即处理不延迟
delay与nodelay相反,在缓冲队列中的请求,满足rate情况下,一定number延迟后处理
limit_req_dry_run
模拟限流规则的执行逻辑,但不真正拒绝任何请求,仅通过日志记录 "本应被限流" 的请求
nginx
#语法
limit_req_dry_run on | off;
#默认值
limit_req_dry_run off;
#位置:http, server, location
limit_req_log_level
控制限流相关日志记录级别
nginx
#语法
limit_req_log_level info | notice | warn | error;
#默认值
limit_req_log_level error;
#位置:http, server, location
limit_req_status
限流拒绝时的响应码设置
nginx
#语法
limit_req_status code;
#默认值
limit_req_status 503;
c, server, location
ngx_http_limit_conn_module
限制基于key标识的连接数量,处于活跃的TCP连接数(服务器正在处理请求并且请求头已读取完毕的才会计算)
limit_conn_zone
定义一个共享内存区,保存各key的状态,可以包含文本、变量及其组合,可配置多个
nginx
#语法
limit_conn_zone key zone=name:size;
#位置:http
key针对限制连接的key
zone定义的共享内存区域
limit_conn
设置key的最大连接数
nginx
#语法
limit_conn zone number;
#位置:http, server, location
zone指limit_conn_zone中的zone
number最大连接数
ngx_http_log_module
请求日志,请求结束时记录
access_log
访问日志,每次写入日志都会检查文件是否存在,不存在则不写入
nginx
#语法
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
#默认值
access_log logs/access.log combined;
#位置:http, server, location, if in location, limit_except
path日志路径
format日志格式化,格式化配置在log_format中,默认使用combined
buffer启用缓存区,日志暂放在内存缓冲区大小,超过缓冲区大小后写入磁盘,或配置flush使用
gzip开启日志gzip压缩的等级,在写入磁盘之前压缩,1-9
flush日志从缓冲区刷新到磁盘的时间
if如果condition为0或空字符串则不记录日志
log_format
格式化日志
nginx
#语法
log_format name [escape=default|json|none] string ...;
#默认值
log_format combined "..."
#位置:http
open_log_file_cache
日志文件描述符缓存
nginx
#语法
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
#默认值
open_log_file_cache off;
#位置:http, server, location
其他说明
获取客户端ip
nginx作为代理服务器反向代理后端时,后端无法获取用户ip地址时,增加如下配置:
nginx
proxy_set_header X-Forwarded-For $remote_addr;
$remote_addr客户端与nginx连接时的ip地址,若经过多级反向代理,可使用变量$proxy_add_x_forwarded_for,客户端请求头中的 X-Forwarded-For 字段,再加上 $remote_addr 变量的值,两者用逗号分隔。如果客户端请求头中没有 "X-Forwarded-For" 字段,那么 $proxy_add_x_forwarded_for 变量就等于 $remote_addr 变量。
worker_processes
工作进程数,一般配置为物理机CUP核数
worker_connections
一个进程的连接数,包含与反向代理服务器的连接
压缩
gzip动态压缩开启后无法使用sendfile
concat模块
压缩请求数,如将多个css、js、图片等请求合并为一个,git地址github.com/alibaba/ngi...
自动化同步rsync、inotify
inotify监控目录是否有变化,在通过事件执行自动化脚本rsync同步源文件以自动同步源文件
多级缓存
协商缓存
Last-Modified:客户端请求时带上If-Modified-Since请求头,服务器检查文件的last_modify是否能对上,返回响应头Last-Modified响应状态码为304,客户端直接从本地读取
ETag:精度比last-modified 高,请求时携带If-None-Match请求头,返回响应头中含有ETag,状态码也是304
强制缓存
响应头中设置Cache-Control
public响应的数据可以被缓存,客户端和代理端都可以缓存
private可私有缓存,客户端可以缓存,代理不能缓存
no-cache可以使用缓存,但必须发送请求到服务器回源验证
no-store禁用缓存
max-age在浏览器缓存的时间以秒为单位
进程追踪
linux中使用strace
针对客户端ip限流
在http块中,针对客户端ip限流,每分钟30个请求
nginx
limit_req_zone $binary_remote_addr zone=limitClient:10m rate=30r/m;
在location中
nginx
limit_req zone=limitClient burst=5
传输限速
传输到达10m后限速为1m/s
nginxlimit_rate
limit_rate 1m
limit_rate_after 10m
针对客户端ip限制连接数
在http块中,针对客户端ip限制连接数,最大连接数为5
nginx
limit_conn_zone $binary_remote_addr zone=limitClient:10m;
在location中
nginx
limit_conn limitClient 5