https://www.weixueyuan.net/nginx/http/
Nginx镜像模块:ngx_http_mirror_module
镜像请求与实际请求是异步处理的,对实际请求无影响。该模块的内置配置指令如下面表格中所示。
名称 | 访问镜像指令 |
---|---|
指令 | mirror |
作用域 | http、server、location |
默认值 | off |
指令说明 | 将用户的访问请求镜像到指定的 URI,同级支持多个 URI |
配置样例如下:
server {
listen 8080;
root /opt/nginx-web/www;
location / {
mirror /benchmark;
index index.html;
}
location = /benchmark {
internal;
proxy_pass http://192.168.2.145$request_uri;
}
}
名称 | 镜像请求体指令 |
---|---|
指令 | mirror_request_body |
作用域 | http, server, location |
默认值 | on |
指令值可选项 | on 或 off |
指令说明 | 将用户的访问请求体同步镜像到指定的 URI,当启用该指令时,创建镜像子请求前会优先读取并缓存客户端的请求体内容,同时 proxy_request_buffering、fastcgi_request_buffering、scgi_request_buffering 和 uwsgi_request_buffering 等指令的不缓存设置将被关闭 |
配置样例如下:
server {
listen 8080;
server_name localhost;
root /opt/nginx-web/www;
mirror_request_body off;
location / {
index index.html;
mirror /accesslog;
}
location = /accesslog {
internal;
proxy_pass http://192.168.2.145/accesslog/${server_name}_$server_port$request_uri;
}
}
配置样例如下:
server {
listen 8080;
root /opt/nginx-web/www;
location / {
mirror /benchmark; # 镜像用户请求
mirror /benchmark; # 镜像用户请求
mirror /benchmark; # 镜像用户请求
index index.html;
}
location = /benchmark {
internal;
proxy_pass http://192.168.2.145$request_uri;
}
}
Nginx referer:请求头控制模块
另外,有些代理服务器或防火墙也会把 Referer 字段过滤掉。通常情况下,伪造 Referer 字段的内容是很容易的,因此该模块主要用于浏览器正常发送请求中 Referer 值的过滤。
虽然通过 Referer 字段进行来源控制并不十分可靠,但用在防盗链的场景中还是基本可以满足需求的。该模块的内置配置指令如下表所示。
指令 | 作用域 | 默认值 | 指令说明 |
---|---|---|---|
referer_hash_max_size | server, location | 2048 | referer 指令中,存储变量的哈希表的大小 |
referer_hash_bucket_size | server, location | 64 | referer 指令中,存储变量的哈希桶的大小 |
valid_referers | server, location | -- | 当用户的 HTTP 头的属性字段 Referer 的值符合指令值的检测时,设置变量 $invalid_referer 为空 |
referer 指令值参数如下表所示。
参数名称 | 参数说明 |
---|---|
none | Referer 的值为空 |
blocked | 代理服务器或防火墙过滤后的 Referer 值,这些值都不以 http:// 或 https:// 开头 |
server_names | Referer 的值中包含一个服务器名 |
配置样例如下:
server{
listen 8080;
server_name nginxtest.org;
root /opt/nginx-web/www;
valid_referers none blocked *.nginxtest.org;
# 当Referer为空或内容不包含“http://”或以“https://”开头的主机名为“*.nginxtest.
# org”时允许访问
if ($invalid_referer) {
return 403;
}
}
指令值为正则表达式时,必须以
~
开头,Nginx 将从“http://”或“https://”之后的字符串开始匹配。默认变量 $invalid_referer 的值为 1,当 Referer 的值与指令值的内容匹配时,$invalid_referer 的值为空。
Nginx allow、deny:IP访问控制模块
名称 | 允许访问指令 |
---|---|
指令 | allow |
作用域 | http、server、location、limit_except |
默认值 | -- |
指令说明 | 允许指定源 IP 的客户端请求访问 |
名称 | 拒绝访问指令 |
---|---|
指令 | deny |
作用域 | http、server、location、limit_except |
默认值 | -- |
指令说明 | 拒绝指定源 IP 的客户端请求访问 |
配置样例如下:
location / {
deny 192.168.1.1; # 禁止192.168.1.1
allow 192.168.0.0/24; # 允许192.168.0.0/24的IP访问
allow 10.1.1.0/16; # 允许10.1.1.0/16的IP访问
allow 2001:0db8::/32;
deny all;
}
Nginx用户cookie模块
名称 | 用户 cookie 指令 |
---|---|
指令 | userid |
作用域 | http、server、location |
默认值 | off |
指令值可选项 | on、off、v1 或 log |
指令说明 | 设置关闭或启用用户 cookie 及启用的方式 |
当指令值为 off 时,关闭用户 cookie 接收和记录功能。
当指令值为 on 时,启用用户 cookie 接收和记录功能,默认为 v2 版本设置 cookie。设置 cookie 的响应头标识为 Set-Cookie2。
当指令值为 v1 时,使用 v1 版本设置 cookie,设置 cookie 的响应头标识为 Set-Cookie。
当指令值为 log 时,不设置用户 cookie,但对接收到的 cookie 进行记录。
名称 | 用户 cookie 域指令 |
---|---|
指令 | userid_domain |
作用域 | http, server, location |
默认值 | none |
指令说明 | 设置用户 cookie 中的域名,none 表示禁用 cookie 的域设置 |
名称 | 用户 cookie 过期指令 |
---|---|
指令 | userid_expires |
作用域 | http, server, location |
默认值 | off |
指令值可选项 | time 或 max 或 off |
指令说明 | 设置用户 cookie 的过期时间,time 表示客户端保存 cookie 的时间,max 表示 cookie 的过期时间,默认为会话结束即过期 |
名称 | 用户 cookie 标识指令 |
---|---|
指令 | userid_mark |
作用域 | http, server, location |
默认值 | off |
指令值可选项 | letter 或 digit 或 = 或 off |
指令说明 | 设置用户 cookie 的标识机制并设置用作标记的字符。该标识机制用于在保存客户标识符的同时添加或修改 userid_p3p 及 cookie 的过期时间 |
用作标记的指令值可以是任意英文字母(区分大小写)、数字或“=”。
userid_mark 设置完成后,将与用户 cookie 中传送的 Base64 格式的标识的第一个字符进行比较,如果不匹配,则重新发送用户标识、userid_p3p 及 cookie 的过期时间。
名称 | 用户 cookie 名称指令 |
---|---|
指令 | userid_name |
作用域 | http, server, location |
默认值 | uid |
指令说明 | 设置 cookie 名称 |
名称 | 用户 p3p 指令 |
---|---|
指令 | userid_p3p |
作用域 | http、server、location |
默认值 | none |
指令说明 | 设置是否将 p3p 头属性字段同 cookie 一同发送 |
P3P 是 W3C 推荐的隐私保护标准,P3P 头属性字段通常用于解决与支持 P3P 协议的浏览器的跨域访问问题。
名称 | 用户 cookie 路径指令 |
---|---|
指令 | userid_path |
作用域 | http, server, location |
默认值 | -- |
指令说明 | 设置 cookie 路径 |
名称 | 用户 cookie 源服务器指令 |
---|---|
指令 | userid_service |
作用域 | http, server, location |
默认值 | -- |
指令说明 | 设置 cookie 的发布服务器。当 cookie 标识符由多个服务器发出时,为确保用户标识的唯一性,则应为每个服务器分配编号,cookie 版本 1 时默认为 0,cookie 版本 2 时默认为服务器 IP 地址的最后 4 个八位字节组成的数字 |
配置样例如下:
server {
listen 8083;
server_name example.com;
root /opt/nginx-web;
auth_request /auth;
userid on;
userid_name uid;
userid_domain example.com;
userid_path /;
userid_expires 1d;
userid_p3p 'policyref="/w3c/p3p.xml", CP="CUR ADM OUR NOR STA NID"';
location / {
index index.html index.htm;
add_header Set-Cookie "username=$remote_user";
}
location /auth {
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
proxy_pass http://192.168.2.145:8080/HttpBasicAuth.php;
}
}
Nginx limit_conn:并发连接数限制模块
该模块只会对请求头已经完全读取完毕的请求进行计数统计。由于 Nginx 采用的是多进程的架构,该模块通过共享内存存储计数状态以实现多个进程间的计数状态共享。该模块的内置配置指令如下面表格中所示。
名称 | 计数存储区指令 |
---|---|
指令 | limit_conn_zone |
作用域 | http |
默认值 | -- |
指令说明 | 设定用于存储指定变量计数的共享内存区域 |
名称 | 连接数设置指令 |
---|---|
指令 | limit_conn |
作用域 | http, server, location |
默认值 | -- |
指令说明 | 设置指定变量的最大并发连接数 |
名称 | 连接数日志级别指令 |
---|---|
指令 | limit_conn_log_level |
作用域 | http、server、location |
默认值 | error |
指令值可选项 | info、notice、warn、error |
指令说明 | 当指定变量的并发连接数达到最大值时,输出日志的级别 |
名称 | 连接数状态指令 |
---|---|
指令 | limit_conn_status |
作用域 | http、server、location |
默认值 | 503 |
指令说明 | 当指定变量的并发连接数达到最大值时,请求返回的状态码 |
配置样例如下:
limit_conn_zone $binary_remote_addr zone=addr:10m; # 对用户IP进行并发计数,将计数内存区命
# 名为addr,设置计数内存区大小为10MB
server {
location /web1/ {
limit_conn addr 1; # 限制用户的并发连接数为1
}
}
limit_conn_zone 的 key 可以是文本、变量或文本与变量的组合。
$binary_remote_addr 为 IPv4 时占用 4B,为 IPv6 时占用 16B。
limit_conn_zone 中 1MB 的内存空间可以存储 32 000 个 32B 或 16 000 个 64B 的变量计数状态。
变量计数状态在 32 位系统平台占用 32B 或 64B,在 64 位系统平台占用 64B。
并发连接数同样支持多个变量的同时统计,配置样例如下:
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
...
limit_conn perip 10;
limit_conn perserver 100;
}
Nginx index:首页处理
常用的首页处理配置指令如下面表格中所示。
名称 | 首页指令 |
---|---|
指令 | index |
作用域 | http、server、location |
默认值 | index index.html |
指令说明 | 设置 HTTP 服务器的默认首页 |
配置样例如下:
location / {
index index.$geo.html index.html;
}
名称 | 随机首页指令 |
---|---|
指令 | random_index |
作用域 | location |
默认值 | off |
指令值可选项 | on 或 off |
指令说明 | 随机读取文件目录下的文件内容为首页内容 |
配置样例如下:
root /opt/nginx-web/html;
location / {
random_index on;
}
名称 | 自动首页指令 |
---|---|
指令 | autoindex |
作用域 | http、server、location |
默认值 | off |
指令值可选项 | on 或 off |
指令说明 | 自动创建目录文件列表为目录首页 |
名称 | 自动首页格式指令 |
---|---|
指令 | autoindex_format |
作用域 | http、server、location |
默认值 | html |
指令值可选项 | html 或 xml 或 json 或 jsonp |
指令说明 | 设置 HTTP 服务器的自动首页文件格式 |
名称 | 自动首页文件大小指令 |
---|---|
指令 | autoindex_exact_size |
作用域 | http、server、location |
默认值 | on |
指令值可选项 | on 或 off |
指令说明 | 设置 HTTP 服务器的自动首页显示文件大小。默认文件大小单位为 Byte,当指令值为 off 时,将根据文件大小自动换算为 KB 或者 MB 或者 GB 的单位大小 |
名称 | 自动首页时间指令 |
---|---|
指令 | autoindex_localtime |
作用域 | http、server、location |
默认值 | off |
指令值可选项 | on 或 off |
指令说明 | 按照服务器时间显示文件时间。默认显示的文件时间为 GMT 时间。当指令值为 on 时,显示的文件时间为服务器时间 |
配置样例如下:
location / {
autoindex on;
autoindex_format html;
autoindex_exact_size off;
autoindex_localtime on;
}
Nginx请求频率限制模块
通常该模块被用于限定同一 IP 客户端单位时间内请求的次数。该模块通过共享内存存储计数状态以实现多个工作进程间的同一变量计数状态的共享。该模块的内置配置指令如下面表格中所示。
名称 | 计数存储区指令 |
---|---|
指令 | limit_req_zone |
作用域 | http |
默认值 | -- |
指令说明 | 设定用于存储指定变量请求计数的共享内存区域 |
名称 | 请求限制设置指令 |
---|---|
指令 | limit_req |
作用域 | http, server, location |
默认值 | -- |
指令说明 | 启用请求限制并进行请求限制的相关配置 |
名称 | 请求限制日志级别指令 |
---|---|
指令 | limit_req_log_level |
作用域 | http, server, location |
默认值 | error |
指令值可选项 | info, notice, warn, error |
指令说明 | 当指定变量的并发连接数达到最大值时,输出日志的级别 |
名称 | 请求限制状态指令 |
---|---|
指令 | limit_req_status |
作用域 | http, server, location |
默认值 | 503 |
指令说明 | 当指定变量的并发连接数达到最大值时,请求返回的状态码 |
配置样例如下:
http {
limit_req_zone $server_name zone=addr:10m rate=1r/s;
# 限制访问当前站点的请求数,对站点请求计数,将计数内存区命名为addr,
# 设置计数内存区大小为10MB,请求限制为1秒1次
server {
location /search/ {
limit_req zone=one;
# 同一秒只接收一个请求,其余的立即返回状态码503,直到第2秒才接收新的请求
limit_req zone=one burst=5;
# 同一秒接收6个请求,其余的返回状态码503,只处理一个请求,其余5个请求进入队
# 列,每秒向Nginx释放一个请求进行处理,同时允许接收一个新的请求进入队列
limit_req zone=one burst=5 nodelay;
# 同一秒接收6个请求,其余的返回状态码503,同时处理6个请求,6秒后再接收新的请求
}
}
}
limit_req 的 burst 参数相当于一个缓冲容器,该容器内可容纳 burst 所设置的数量的请求,没有 nodelay 参数时,将匀速向 Nginx 释放需要处理的请求。未进入 burst 容器队列的请求将被返回状态码 503 或由 limit_req_status 指令指定的状态码。
limit_req 的 nodelay 参数是指对请求队列中的请求不进行延时等待,而是立即处理。
请求频率同样支持多个变量的同时计数及叠加,配置样例如下:
limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
limit_req_zone $server_name zone=perserver:10m rate=10r/s;
server {
...
limit_req zone=perip burst=5 nodelay;
limit_req zone=perserver burst=10;
}
Nginx expires:页面缓存时间配置
需要注意的是,这种缓存方式只能在用户不对浏览器强制刷新的情况下生效,如果用户通过 url 来进行访问,是可以访问到缓存的。
Nginx 中的 expires 指令的介绍如下表所示:
名称 | 缓存时间指令 |
---|---|
指令 | expires |
作用域 | http、server、location、if in location |
默认值 | off |
指令值可选项 | 时间或 epoch 或 max 或 off |
指令说明 | 当响应状态码为 200、201、204、206、301、302、303、304、307 或 308 时,对响应头中的属性字段“Expires”和“Cache-Control”进行添加或编辑操作 |
当指令值为时间时,既可以是正值也可以是负值。Expires 的值为当前时间与指令值的时间之和。当指令值的时间为正或 0 时,Cache-Control 的值为指令值的时间。当指令值的时间为负时,Cache-Control 的值为 no-cache。
当指令值为时间时,可用前缀
@
指定一个绝对时间,表示在当天的指定时间失效。当指令值为 epoch 时,Expires 的值为 Thu,01 Jan 1970 00:00:01 GMT,Cache-Control 的值为 no-cache。
当指令值为 max 时,Expires 的值为 Thu,31 Dec 2037 23:55:55 GMT,Cache-Control 的值为 10 年。
当指令值为 off 时,不对响应头中的属性字段 Expires 和 Cache-Control 进行任何操作。
配置样例如下:
map $content_type $expires { # 根据$content_type的值,对变量$expires进行赋值
default off; # 默认不修改Expires和Cache-Control的值
application/pdf 42d; # application/pdf类型为42天
~image/ max; # 图片类型为max
}
server {
expires 24h; # 设置Expires的值为当前时间之后的24小时,
# Cache-Control的值为24小时
expires modified +24h; # 编辑Expires的值增加24小时,Cache-Control的值增
# 加24小时
expires @15h; # 设置Expires的值为当前日的15点,Cache-Control的值
# 为当前时间到当前日15点的时间差
expires $expires; # 根据变量$expires的内容设置缓存时间
add_header Cache-Control no-cache;
add_trailer X-Always $host always;
}
Nginx开启gzip压缩及相关配置详解
要想启用响应数据 gzip 压缩(ngx_http_gzip_module 模块)功能,需要用户浏览器也支持 gzip 解压功能,目前大多数浏览器都支持 gzip 压缩数据的显示。Nginx 服务器接收客户端浏览器发送的请求后,通过请求头中的属性字段 Accept-Encoding 判断浏览器是否支持 gzip 压缩,对支持 gzip 压缩的浏览器将发送 gzip 压缩的响应数据。
ngx_http_gzip_module 模块的内置配置参数如下表所示。
指令 | 作用域 | 默认值 | 指令值可选项 | 指令说明 |
---|---|---|---|---|
gzip | http、server、location、if in location | off | on 或 off | 启用 gzip 功能 |
gzip_buffers | http、server、location | 32 4k 或 16 8k | -- | 设置 gzip 压缩缓冲区 |
gzip_comp_level | http、server、location | 1 | -- | 设置 gzip 压缩级别,取值范围为 1~9,该指令值越大,压缩程度越高 |
gzip_disable | http、server、location | -- | -- | 当请求头中的属性字段 User-Agent 的内容与指令值正则匹配时关闭 gzip 压缩功能 |
gzip_http_version | http、server、location | 1.1 | 1.0 或 1.1 | 设置压缩请求的最早 HTTP 协议版本 |
gzip_min_length | http、server、location | 20 | -- | 设置启用 gzip 压缩的响应数据的最小长度,判断依据为响应头中 Content-Length 的值。如果 Content-Length 不存在,则该指令无效;如果指令值为 0,则表示全部压缩 |
gzip_proxied | http、server、location | off | off 或 expired 或 no-cache 或 no-store 或 private 或 no_last_modified 或 no_etag 或 auth 或 any | 根据被代理服务器返回响应数据的响应头属性字段判断是否启用 gzip 压缩 |
gzip_types | http、server、location | text/html | -- | 设置可进行 gzip 压缩的响应数据的 MIME 类型,指令值为 * 时表示所有 MIME 类型 |
gzip_vary | http、server、location | off | on 或 off | 在响应头中添加 Vary:Accept-Encoding,返回给前端代理或 CDN 服务器,用于判岗是否向客户端发送 gzip 的缓存副本,避免代理或 CDN 服务器将 gzip 压缩后的缓存副本响应给不具备 gzip 解压能力的浏览器 |
其中 gzip_proxied 指令的指令值可选项说明如下:
- off:关闭该指令功能;
- expired:若 HTTP 响应头中包含属性字段 Expires,则启用压缩;
- no-cache:若 HTTP 响应头中包含属性字段 Cache-Control:no-cache,则启用压缩;
- no-store:若 HTTP 响应头中包含属性字段 Cache-Control:no-store,则启用压缩;
- private:若 HTTP 响应头中包含属性字段 Cache-Control:private,则启用压缩;
- no_last_modified:若 HTTP 响应头中不包含属性字段 Last-Modified,则启用压缩;
- no_etag:若 HTTP 响应头中不包含属性字段 ETag,则启用压缩;
- auth:若 HTTP 响应头中包含属性字段 Authorization,则启用压缩;
- any:对所有响应数据启用压缩。
当客户端浏览器不支持 gzip 压缩时,可以使用 ngx_http_gunzip_module 模块将压缩的数据解压后发送给客户端。对支持 gzip 压缩的浏览器不做处理。
ngx_http_gunzip_module 模块的内置配置指令如下表所示。
指令 | 作用域 | 默认值 | 指令值可选项 | 指令说明 |
---|---|---|---|---|
gunzip | http、server、location | off | on 或 off | 设置是否启用动态解压支持 |
gunzip_buffers | http、server、location | 32 4K | -- | 设置用于解压的缓冲区大小 |
通常 gzip 压缩指令都是读取未压缩的文本,在进行动态压缩后把响应数据发送给客户端,ngx_http_gzip_static_module 模块可以使 Nginx 把 gzip 压缩过的以 .gz 为后缀的文件或已压缩的响应数据直接发送给客户端。
ngx_http_gzip_static_module 模块的内置配置指令如下表所示。
名称 | 静态压缩指令 |
---|---|
指令 | gzip_static |
作用域 | http、server、location |
默认值 | off |
指令值可选项 | on 或 off 或 always |
指令说明 | 启用压缩数据读取功能 |
gzip_static 指令的指令值可选项说明如下:
- on:不检查客户端是否支持 gzip 压缩数据,始终发送 gzip 压缩数据;
- always:不检查客户端是否支持 gzip 压缩数据,始终发送 gzip 压缩数据;
- 该指令的执行优先级高于 gzip 指令;
- 开启该指令后,默认优先查找以 .gz 为后缀的文件;
- gzip_types 指令对 gzip_static 的设置无效。
配置样例如下:
gzip_static always; # 始终发送静态的gzip压缩数据 gunzip on; # 若客户端浏览器不支持gzip压缩数据,则解压后发送 gunzip_buffers 16 8k; # 解压缓冲区大小为128KB gzip_proxied expired no-cache no-store private auth; # 当被代理的服务器符合条件时, # 对响应数据启用gzip压缩 gzip on; # 启用动态gzip压缩功能 gzip_min_length 1k; # 响应数据超过1KB时启用gzip压缩 gzip_buffers 4 16k; # 动态压缩的缓冲区大小是64KB gzip_comp_level 3; # 压缩级别为3 gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; # 对指定的MIME类型数据启用动态压缩 gzip_vary on; # 向前端代理或缓存服务器发送添加“Vary: Accept- # Encoding”的响应数据