本篇文章主要讲ngx_http_proxy_module和ngx_stream_proxy_module模块下各指令的使用方法。
1. 代理请求 proxy_pass
1.1 proxy_pass 代理请求
Syntax: proxy_pass URL;
Default: —
Context: location, if in location, limit_except
设置连接被代理服务器的协议、IP地址以及location应映射到的可选 URI。协议可指定为 "http "或 "https"。地址可指定为域名或 IP 地址,以及一个可选端口,如:
proxy_pass http://localhost:8000/uri/;
如果一个域名解析到多个地址,所有地址都将以循环方式使用。另外,还可以将一个地址指定为一个服务器组(即负载均衡组,proxy_pass配合upstream一起使用)。
参数值可以包含变量。在这种情况下,如果将地址指定为域名,则在描述的服务器组中搜索该名称,如果找不到,则使用resolver指令确定。
如果proxy_pass指令已指定URI,请求URI将按如下步骤发送给服务器:
location /pages/ { proxy_pass http://127.0.0.1:8688/test/; }
原始请求为:http://47.**.**.80:8688/pages/test/mg.js
最终请求为:http://127.0.0.1:8688/test/test/mg.js。将原始请求中与location匹配的部分替换成指定的URI。
使用替换后的请求URL进行代理转发。
Nginx记录日志如下
{"time_iso8601":"2023-12-30T15:16:50+08:00","http_host":"127.0.0.1:8688","remote_addr":"127.0.0.1","request_uri":"/test/test/mg.js","status":"404","bytes_sent":"720","request_time":"0.000","gzip_ratio":"",} {"time_iso8601":"2023-12-30T15:16:50+08:00","http_host":"47.**.**.80:8688","remote_addr":"14.145.163.198","request_uri":"/pages/test/mg.js","status":"404","bytes_sent":"749","request_time":"0.000","gzip_ratio":"",}
结论:
如果 proxy_pass 指定了 URI,Nginx 会将原始请求中与location完全匹配的部分替换成指定的URI,原始请求URI之后的内容仍保持不变。
再看一个小测试。修改Nginx配置如下,去掉location name “/pages/” 后面的“/”
location /pages { proxy_pass http://127.0.0.1:8688/test/; }
原始请求URL:http://47.**.**.80:8688/pagesttt/test/mg.js,大胆猜测下Nginx代理请求URL会是什么。
请求请求URL:http://47.**.**.80:8688/test/ttt/test/mg.js
Nginx日志如下
{"time_iso8601":"2023-12-30T15:23:54+08:00","http_host":"127.0.0.1:8688","remote_addr":"127.0.0.1","request_uri":"/test/ttt/test/mg.js","status":"404","bytes_sent":"720","request_time":"0.000","gzip_ratio":"",} {"time_iso8601":"2023-12-30T15:23:54+08:00","http_host":"47.**.**.80:8688","remote_addr":"14.145.163.198","request_uri":"/pagesttt/test/mg.js","status":"404","bytes_sent":"749","request_time":"0.000","gzip_ratio":"",}
一定要注意上面结论里提到的完全匹配!!! 所以,我们在配置代理请求时要尽量把location配置成精确匹配 = ,如果只能配置成通用匹配,那就尽量在location name后面也加上"/"。location的匹配规则及优先级可以参考这篇文章 Nginx(六) Nginx location 匹配顺序及优先级深究(亲测有效)_ng location 先后顺序
如果proxy_pass指令未指定URI,请求URI将按如下步骤发送给服务器:
location /pages/ { proxy_pass http://127.0.0.1:8080; }
原始请求为:http://47.**.**.80:8688/pages/test/mg.js
最终请求为:http://127.0.0.1:8080/pages/test/mg.js。URI保持不变。
使用最终请求URL进行代理转发。
Nginx输出日志
{"time_iso8601":"2023-12-30T16:55:15+08:00","http_host":"127.0.0.1:8080","remote_addr":"127.0.0.1","request_uri":"/pages/test/mg.js","status":"404","bytes_sent":"720","request_time":"0.000","gzip_ratio":"",} {"time_iso8601":"2023-12-30T16:55:15+08:00","http_host":"47.**.**.80:8688","remote_addr":"14.145.163.198","request_uri":"/pages/test/mg.js","status":"404","bytes_sent":"749","request_time":"0.000","gzip_ratio":"",}
结论:
如果 proxy_pass 未指定 URI,且仅指定了被代理服务器的IP(和端口),后面未加"/",那么代理请求URL中的URI还使用原始请求中的URI。
再看个小测试。修改Nginx配置如下,代理地址后增加一个"/"
location /pages/ { proxy_pass http://127.0.0.1:8080/; }
原始请求为:http://47.**.**.80:8688/pages/test/mg.js
最终请求为:http://127.0.0.1:8080/test/mg.js。将原始请求中与location匹配的部分替换成空字符串(也可以理解成删除匹配部分)。
使用替换后的请求URL进行代理转发。
Nginx输出日志
{"time_iso8601":"2023-12-30T17:02:02+08:00","http_host":"127.0.0.1:8080","remote_addr":"127.0.0.1","request_uri":"/test/mg.js","status":"404","bytes_sent":"720","request_time":"0.000","gzip_ratio":"",} {"time_iso8601":"2023-12-30T17:02:02+08:00","http_host":"47.**.**.80:8688","remote_addr":"14.145.163.198","request_uri":"/pages/test/mg.js","status":"404","bytes_sent":"749","request_time":"0.000","gzip_ratio":"",}
切记,如果location是正则表达式匹配, proxy_pass指令不能指定URI。
1.2 proxy_redirect 代理响应重定向
Syntax: proxy_redirect default;
proxy_redirect off;
proxy_redirect redirect replacement;
Default: proxy_redirect default;
Context: http, server, location
该指令用于设置如何处理被代理服务器返回的重定向响应(301或302响应码)。简单直白的讲就是修改后端服务器返回的请求重定向路径,避免暴露后端服务器IP和端口。
- proxy_redirect default:默认配置。当proxy_pass的URL与响应头字段Location的URL部分内容完全匹配时,Nginx此时会用server_name + listen port + 当前location的URI组合起来替换掉Location中与proxy_pass完全匹配的部分。没有完全匹配内容时,相当于proxy_redirect = off,后端服务器返回的Location是什么就给客户端返回什么。
- proxy_redirect off:禁用proxy_redirect功能。后端服务器返回的Location是什么就给客户端返回什么。
- proxy_redirect redirect replacement:指定用什么来替换哪部分内容。
- redirect:替换哪部分。截取/完全匹配响应头字段Location的URL部分内容。
- replacement:用什么替换。用该值替换掉redirect。该参数可以仅配置URI,省略掉HOST和Port,如果省略则使用当前server的server_name和listen port(80端口除外)组合起来代理host+port。
proxy_redirect 支持同时配置多个,可根据不同的需求配置多个proxy_redirect。
proxy_redirect default;
proxy_redirect http://localhost:8000/ /;
proxy_redirect http://www.example.com/ /;
proxy_redirect 指令不同配置的重定向结果请参考这篇文章 Nginx(十五) proxy_pass和proxy_redirect指令的组合测试
1.3 proxy_http_version Http协议版本
Syntax: proxy_http_version 1.0 | 1.1;
Default: proxy_http_version 1.0;
Context: http, server, location
This directive appeared in version 1.1.4.
设置代理请求时要使用的HTTP协议版本,默认是1.0。建议设置成1.1版本,使用1.1版本自带的“Connection:keep-alive”请求体字段来开启HTTP长连接、分块传输等功能。
1.4 proxy_set_header 设置请求头
Syntax: proxy_set_header field value;
Default: proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
Context: http, server, location
在发送代理请求前,可通过该指令来修改或添加请求头字段信息。value可包含文本和变量。该指令可被继承,只有在当前层级未配置该指令时,才会继承上一级的配置。默认情况下。只配置了如下两个请求头字段:
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
如果启用了代理响应缓存,那么原始请求头中的“ If-Modified-Since”,“ If-Unmodified-Since”,“ If-None-Match”,“ If-Match”,“ Range”和“ If-Range”字段不会传递给被代理服务器。
# 设置代理请求头中的host为源请求头字段Host的值,如果源请求头中没有http_host字段,那么传递的内容为空
proxy_set_header Host $http_host;
# 如果源请求头中没有http_host字段,也可使用$host变量来传递host信息
proxy_set_header Host $host;
# host也可以和被代理服务器端口一起传递
proxy_set_header Host $host:$server_port;
# 设置代理请求头中的Referer为客户端请求头字段http_referer的值
proxy_set_header Referer $http_referer;
# 设置代理请求头中的Cookie为客户端请求头字段http_cookie的值
proxy_set_header Cookie $http_cookie;
# 设置代理请求头中的X-Real-IP为客户端的IP
proxy_set_header X-Real-IP $remote_addr;
# 设置代理请求头中的X-Forwarded-For为客户端请求头字段X-Forwarded-For的值,如果没有该字段,则等于$remote_addr
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 设置代理请求头中的X-Forwarded-Proto为请求协议的值
proxy_set_header X-Forwarded-Proto $scheme;
# 向后端服务器传递客户端真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
1.5 proxy_set_body 设置请求体
Syntax: proxy_set_body value;
Default: —
Context: http, server, location
在发送代理请求前,可通过该指令来修改请求体信息。 value可包含文本和变量。
1.6 proxy_pass_header 允许传递的响应头
Syntax: proxy_pass_header field;
Default: —
Context: http, server, location
设置允许将后端服务器返回的响应头中的哪些原本被禁用的字段传递给客户端,默认情况下,Nginx不会把后端服务器返回的响应头中的“Date”、“Server”、“X-Pad”和“X-Accel-...”等字段返回给客户端。参考proxy_hide_header指令。
1.7 proxy_hide_header 禁止传递的响应头
Syntax: proxy_hide_header field;
Default: —
Context: http, server, location
默认情况下,nginx不会将后端服务器响应中的 “Date”、“Server”、“X-Pad”和“X-Accel-...” 等字段返回给客户端。proxy_hide_header 指令可设置不传递的其他字段。相反,如果需要允许传递字段,则可以使用 proxy_pass_header 指令。
1.8 proxy_pass_request_body 传递原始请求体
Syntax: proxy_pass_request_body on | off;
Default: proxy_pass_request_body on;
Context: http, server, location
设置是否将原始请求中的body传递给后端服务器。默认是on,表示传递。
location /x-accel-redirect-here/ {
proxy_method GET;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_pass ...
}
1.9 proxy_pass_request_headers 传递原始请求头
Syntax: proxy_pass_request_headers on | off;
Default: proxy_pass_request_headers on;
Context: http, server, location
设置是否将原始请求中的header传递给后端服务器。默认是on,表示传递。
location /x-accel-redirect-here/ {
proxy_method GET;
proxy_pass_request_headers off;
proxy_pass_request_body off;
proxy_pass ...
}
1.10 proxy_protocol 代理协议
Syntax: proxy_protocol on | off;
Default: proxy_protocol off;
Context: stream, server
This directive appeared in version 1.9.2.
设置在与被代理服务器进行通信时是否启用代理协议。
1.11 proxy_requests 接收数据包数量
Syntax: proxy_requests number;
Default: proxy_requests 0;
Context: stream, server
This directive appeared in version 1.15.7.
设置在终止客户端与现有UDP数据流绑定的会话前,允许客户端发送的数据包数量。当服务端接收的数据包数量达到该值后,将建立新的会话来接收下一个数据包。当所有客户端的数据包都传输到被代理服务器并收到指定数量(proxy_responses)的响应后,或者是连接达到超时时间(proxy_timeout)后,会话将终止。设为0表示不受限制。
1.12 proxy_responses 预期响应数据包数量
Syntax: proxy_responses number;
Default: —
Context: stream, server
This directive appeared in version 1.9.13.
如果使用UDP协议,设置被代理服务器给客户端返回响应时的预期数据包数量。该数字可作为会话终止的提示。默认情况下,数据包数量不受限制。如果设为零,则客户端不会收到任何响应。但是,如果收到响应但会话仍未结束,则将处理该响应。
1.13 proxy_session_drop 终止会话
Syntax: proxy_session_drop on | off;
Default: proxy_session_drop off;
Context: stream, server
This directive appeared in version 1.15.8.
当被代理服务器从服务器组中删除或被标记为永久不可用后,设置是否要终止与该代理服务器建立的所有会话。可能会因为重新解析或使用 API DELETE 命令而发生这种情况。当服务器被认定为不健康,或使用 API PATCH 命令时,这台服务器将被标记成永久不可用。当客户端或被代理服务器处理完下一个read或write事件后,每个会话就会终止。
2. 代理缓冲 proxy_buffer
代理缓冲区用于临时存储从后端服务器返回的响应数据。启用代理缓冲时,Nginx是等待接收部分或整个响应后再将其返回给客户端(边收边传),可提高传输效率。禁用代理缓冲时,响应数据是立即同步给客户端,响应速度会有所提高,适用于对实时性要求较高的场景。
2.1 proxy_buffering 是否开启响应缓冲
Syntax: proxy_buffering on | off;
Default: proxy_buffering on;
Context: http, server, location
设置是否缓存后端服务器返回的响应内容(body)。默认开启。
启用缓冲后,nginx 首先会尽快接收后端服务器的响应,并将其保存到由 proxy_buffer_size 和 proxy_buffers 指令设置的缓冲区中,然后再返回给客户端。需要注意的是,这是个边收边传的过程,并不是等全部接收完了才传输给客户端。如果整个响应内容无法存入内存,可以将其中一部分保存到磁盘上的临时文件中。临时文件的写入由 proxy_max_temp_file_size 和 proxy_temp_file_write_size 指令控制。
禁用缓冲后,proxy_buffers和proxy_busy_buffers_size这两个指令都会失效,但proxy_buffer_size指令还是生效的。nginx在接收到响应内容后会立即将其同步传递给客户端,而不会尝试从后端服务器读取整个响应。此时,nginx每次从后端服务器接收数据的最大值由proxy_buffer_size指令控制。
还可以通过在 "X-Accel-Buffering "响应头字段中输入 "yes"或 "no"来启用或禁用缓冲。可以使用 proxy_ignore_headers 指令禁用这一功能。
2.2 proxy_buffers 每个连接的缓冲区
Syntax: proxy_buffers number size;
Default: proxy_buffers 8 4k|8k;
Context: http, server, location
用于设置Nginx从后端服务器读取单个连接响应数据(body)的缓冲区number和size,总大小=number × size。size默认等于一个内存页。根据平台不同,size为 4K 或 8K,linux系统中一个内存页是4k。
[root@reader ~]# getconf PAGESIZE
4096
请注意,proxy_buffers的值需要综合考虑系统每个连接的平均响应大小、内存大小和最大并发连接数来设定,如果并发数较高,而系统闲置内存较小,缓冲区设置较大时可能会瞬间占满内存。这时要么降低并发连接数,要么降低缓冲区大小。
2.3 proxy_buffer_size 存放响应头的缓冲区
Syntax: proxy_buffer_size size;
Default: proxy_buffer_size 4k|8k;
Context: http, server, location
用于设置Nginx从上游服务器读取响应头的缓冲区大小,这个缓冲区通常存储一些较小的响应头信息。size默认等于一个内存页。根据平台不同,size为 4K 或 8K,linux系统中一个内存页是4k。
proxy_buffer_size缓冲区仅用于存储响应头信息,不需要设置太大,但还是建议最好跟proxy_buffers指令中的size保持一致。
2.4 proxy_busy_buffers_size 忙于发送缓冲区
Syntax: proxy_busy_buffers_size size;
Default: proxy_busy_buffers_size 8k|16k;
Context: http, server, location
该指令用于限制忙于给客户端发送响应数据的缓冲区大小,proxy_busy_buffers_size并不是独立的缓冲空间,而是proxy_buffers和proxy_buffer_size的一部分。
当启用代理响应缓冲后,Nginx在尚未读取完所有响应数据的情况下,如果读取的响应数据达到了一定量,就会从总缓冲区中划分出一部分来专门给客户端发送响应数据,而具体要划分多少缓冲区就由proxy_busy_buffers_size指令来控制。在此期间,其余缓冲区还是正常读取响应,剩余缓冲区写满后,再根据其它配置情况(proxy_temp_file_write_size 和 proxy_max_temp_file_size)来决定是否要将剩余响应数据缓冲到临时文件中。默认情况下,size 受 proxy_buffer_size 和 proxy_buffers 这两个指令设置的缓冲区大小限制。
# 默认大小
proxy_busy_buffers_size = Max(proxy_buffer_size, proxy_buffers.size) * 2
# 最大值和最小值
Min(proxy_buffer_size, proxy_buffers.size) ≤ proxy_busy_buffers_size ≤ (proxy_buffers.number - 1) × proxy_buffers.size
2.5 proxy_temp_file_write_size 单次最多写入
Syntax: proxy_temp_file_write_size size;
Default: proxy_temp_file_write_size 8k|16k;
Context: http, server, location
当响应数据超出响应数据缓冲区时,响应数据会被写入临时文件中,该指令用于限制每次写入临时文件的数据大小。默认情况下,大小受 proxy_buffer_size 和 proxy_buffers 指令设置的两个缓冲区限制。临时文件的最大大小由 proxy_max_temp_file_size 指令设置。
2.6 proxy_max_temp_file_size 临时文件最大值
Syntax: proxy_max_temp_file_size size;
Default: proxy_max_temp_file_size 1024m;
Context: http, server, location
限制存放响应数据的临时文件的最大值,默认是1024M。当响应数据超出响应数据缓冲区的大小时,超出部分数据将存储到临时文件中,该指令设置临时文件的最大值,配置为0时,表示关闭磁盘缓冲。该值必须大于单个缓冲区或 proxy_buffer_size 的大小。
2.7 proxy_request_buffering 代理请求体缓冲
Syntax: proxy_request_buffering on | off;
Default: proxy_request_buffering on;
Context: http, server, location
This directive appeared in version 1.7.11.
设置是否开启客户端请求体缓冲区,默认开启。启用该缓冲后,Nginx在将请求转发给被代理服务器之前,需要从客户端读取整个请求体。若禁用该缓冲,Nginx在接收到请求体后立即转发给被代理服务器,已经发送部分请求体的请求,将无法使用proxy_next_upstream指令功能。
如果是基于HTTP/1.1协议的分块传输请求,那么无论该指令配置如何,都会强制要求读取完整个请求体后再转发请求给被代理服务器。
3. 代理缓存 proxy_cache
启用代理缓存后,Nginx可以把后端服务器返回的响应数据缓存在磁盘文件中,客户端下次请求同一数据时,Nginx可以直接返回缓存数据,从而提高响应速度,减少向后端发送请求的次数,降低后端服务器的负载,并可以在被代理服务器发生故障时通过缓存的内容作为备份来提高网站的可用性。
3.1 proxy_cache_path 缓存配置
Syntax: 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];
Default: —
Context: http
指定缓存文件的存储路径、目录结构、格式、最大缓存大小和失效时间等参数。
- path:缓存文件存储路径。缓存文件名是对 cache key 使用 MD5 算法计算后生成的结果。
/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c
- [levels=levels]:levels=[level1]:[level2]:[level3],设置缓存文件存储目录的层数和层级,层数最多是3层,层级最大是2。
# 层数是2层,第一层层级是1,第二层层级是2,如:/data/nginx/cache/7/82
proxy_cache_path /data/nginx/cache levels=1:2
# 层数是2层,第一层层级是2,第二层层级是2,如:/data/nginx/cache/17/28
proxy_cache_path /data/nginx/cache levels=2:2
# 层数是3层,第一层层级是1,第二层层级是1,第二层层级是2,如:/data/nginx/cache/7/4/s7
proxy_cache_path /data/nginx/cache levels=1:1:2
# 层数是3层,第一层层级是2,第二层层级是1,第二层层级是2,如:/data/nginx/cache/7/43/b8
proxy_cache_path /data/nginx/cache levels=1:2:2
- keys_zone=name:size:设置缓存文件键值对的存储共享内存区及大小。所有活动密钥和有关数据信息都存储在共享内存区中,共享内存区的名称和大小由 keys_zone 参数配置。1 MB 的区域大约可存储8000个密钥。
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=myCache:10m;
- [use_temp_path=on|off]:设置是否将使用临时文件目录,如果开启(on),会将临时文件存放到临时目录中。Nginx缓存代理响应数据时,会先将响应数据写入到一个临时文件,然后再重命名该文件。从 0.8.9 版开始,可以把临时文件和缓存放在不同的文件系统上。但要注意的是,在这种情况下,文件会在两个文件系统之间复制,而不是进行简单的重命名操作。因此,建议在任何给定位置都将缓存和由proxy_temp_path 指令设置的临时文件目录放在同一个文件系统中。如果省略该参数或将其值设为 on,则将使用 proxy_temp_path 指令为临时文件指定目录。如果设置为 off,临时文件将直接存放在缓存目录中,建议将 use_temp_path 设置为off,这样可避免不必要的数据拷贝。
- [inactive=time]:设置缓存文件的失效时间,单位是秒。如果某个缓存文件在inactive指定时间内未被访问,则删除该缓存文件,默认是10分钟。
- [max_size=size]:设置缓存空间上限值,如果不指定,表示不限制缓存大小,有可能会占用完所有磁盘空间。
- [min_free=size]:设置缓存空间最小可用值,用于清除不常用的缓存。
- [manager_ ***]:当缓存数据总大小超过缓存空间上限值或缓存可用空间不足时,"cache manager" 进程会删除最近使用最少的缓存文件。缓存文件会在 manager_files、manager_threshold 和 manager_sleep 参数(1.11.5)配置的迭代中删除。在一次迭代中,删除的 manager_files 条目不会超过(默认为 100)。一次迭代的持续时间受 manager_threshold 参数限制(默认为 200 毫秒)。在两次迭代之间,会有一个由 manager_sleep 参数(默认为 50 毫秒)设置的暂停。在Nginx主进程启动一分钟后,特殊的 "cache loader "进程被激活。它将以前存储在文件系统中的缓存数据信息加载到缓存区。加载也是迭代进行的。在一次迭代中,加载的加载器文件项不会超过 100 个(默认为 100 个)。此外,一次迭代的持续时间受 loader_threshold 参数的限制(默认为 200 毫秒)。在两次迭代之间,会有一个由 loader_sleep 参数(默认为 50 毫秒)设置的暂停。
- [manager_files=number]:cache manager进程每次迭代更新缓存时可移除缓存文件的数量上限值,默认是100。
- [manager_sleep=time]:cache manager进程相邻两次迭代更新缓存的间隔时间,默认是50ms。
- [manager_threshold=time]:cache manager进程每次迭代更新缓存时的最长执行时间,默认是200ms。
- [loader_files=number]:cache loader进程每次迭代加载缓存时可加载缓存文件的数量上限值,默认是100。
- [loader_sleep=time]:cache loader进程相邻两次迭代加载缓存的间隔时间,默认是50ms。
- [loader_threshold=time]:cache loader进程每次迭代加载缓存时的最长执行时间,默认是200ms。
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=myCache:10m max_size=1g inactive=60m use_temp_path=off;
另外,Nginx商用版还提供以下几个参数:
- [purger=on|off]:指示是否通过缓存清除器(1.7.12)从磁盘中删除与通配符匹配的缓存条目。将该参数设置为on(默认为off)将激活 "缓存清除器 "进程,永久遍历所有缓存条目并删除与通配符键匹配的条目。
- [purger_files=number]:设置一次迭代(1.7.12)中扫描的项目数。默认情况下,purger_files 设置为 10。
- [purger_threshold=number]:设置一次迭代的持续时间(1.7.12)。默认情况下,purger_threshold 设置为 50 毫秒。
- [purger_sleep=number]:设置迭代之间的暂停时间(1.7.12)。默认情况下,purger_sleep 设置为 50 毫秒。
3.2 proxy_cache 开启缓存
Syntax: proxy_cache zone | off;
Default: proxy_cache off;
Context: http, server, location
开启代理缓存并配置用于缓存的共享内存区。同一区域可用于多个地方。off参数表示禁用缓存,且不继承上一级的配置。
proxy_cache myCache;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 304 302 1d;
3.3 proxy_cache_valid 缓存有效期
Syntax: proxy_cache_valid [code ...] time;
Default: —
Context: http, server, location
根据不同响应状态码来设置响应数据缓存时间。可选参数code可以配置多个,中间用空格分隔,如果不配置code,那么仅缓存200、301和302状态码的响应数据。time表示缓存的过期时间。如果需要给不同响应状态码设置不同的缓存策略,可以同时配置多个。
# 状态码为200和302的响应缓存10分钟
proxy_cache_valid 200 302 10m;
# 状态码为404的响应缓存10分钟
proxy_cache_valid 404 1m;
# 仅缓存200、301和302状态码的响应数据
proxy_cache_valid 5m;
# 所有状态码的响应都缓存1分钟
proxy_cache_valid any 1m;
默认情况下,缓存文件会永久保存,除非缓存数据总量超过了缓存上限值或最小可用空间不足时,才会清理不常用的缓存文件。
3.4 proxy_cache_key 缓存维度/键值
Syntax: proxy_cache_key string;
Default: proxy_cache_key $scheme$proxy_host$request_uri;
Context: http, server, location
定义缓存key,也可以称为设置缓存维度,Nginx会用这个key来缓存不同的请求响应结果(缓存文件名就是根据key来生成的)。同样的,获取缓存时也是根据这个key来获取对应的缓存文件。
proxy_cache_key "$host$request_uri $cookie_user";
默认情况下,该指令的值应接近于字符串
proxy_cache_key $scheme$proxy_host$uri$is_args$args;
3.5 proxy_no_cache 不被缓存
Syntax: proxy_no_cache string ...;
Default: —
Context: http, server, location
设置哪些代理请求的响应不会被缓存。如果字符串参数中至少有一个值不为空且不等于 "0",则响应数据不会被缓存,可以与proxy_cache_bypass指令一起使用。
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
proxy_no_cache $http_pragma $http_authorization;
3.6 proxy_cache_bypass 不读缓存
Syntax: proxy_cache_bypass string ...;
Default: —
Context: http, server, location
设置哪些代理请求不从缓存中读取数据,而是直接请求被代理服务器。如果字符串参数中至少有一个值不为空且不等于 "0",那么将不会从缓存中获取响应数据,可以与proxy_no_cache指令一起使用。
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
proxy_cache_bypass $http_pragma $http_authorization;
3.7 proxy_cache_min_uses 最少请求次数
Syntax: proxy_cache_min_uses number;
Default: proxy_cache_min_uses 1;
Context: http, server, location
设置代理请求达到指定请求次数后,才对其响应进行缓存,防止低频请求的响应数据被缓存。
3.8 proxy_cache_purge 清除指定请求的缓存
Syntax: proxy_cache_purge string ...;
Default: —
Context: http, server, location
This directive appeared in version 1.5.7.
设置哪些请求的缓存文件需要被清除。如果字符串参数中至少有一个值不为空且不等于 "0",那么对应cache key的缓存文件将被清除。这个请求需要手动发起,Nginx无法主动发起,返回 204(无内容)响应表示操作成功。
如果设定请求的cache key以星号("*
")结尾,则所有与通配符匹配的缓存文件都将从缓存中清除。不过,这些文件仍将保留在磁盘上,直到它们因inactivity(对应proxy_cache_path指令中的inactive参数)而被删除,或被缓存清除器处理,或客户端尝试访问它们。
proxy_cache_purge myCache $host$1$is_args$args;
假设一个URL为'http://192.168.8.42/test.txt',那么通过访问'http://192.168.8.42/purge/test.txt'就可以清除该URL的缓存!
该指令属于第三方模块,需要单独配置。
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
tar -xf ngx_cache_purge-2.3.tar.gz && cd nginx-1.12.2
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module\
--with-http_realip_module --with-http_addition_module --with-http_gzip_static_module\
--with-http_stub_status_module --with-http_sub_module --with-pcre\
--add-module=../'ngx_cache_purge-2.3' --add-module=./'nginx_upstream_check_module'
3.9 proxy_cache_methods 指定方法缓存
Syntax: proxy_cache_methods GET | HEAD | POST ...;
Default: proxy_cache_methods GET HEAD;
Context: http, server, location
This directive appeared in version 0.7.59.
指定哪些请求方法的响应数据会被缓存,如果客户端请求方法在该指令值队列中,则响应将被缓存。Nginx默认始终缓存"GET"和 "HEAD"方法的响应数据,虽然"GET "和 "HEAD "方法总会被添加到该指令值队列中,但在配置时还是建议明确指定它们。
3.10 proxy_cache_use_stale 使用旧缓存
Syntax: proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | off ...;
Default: proxy_cache_use_stale off;
Context: http, server, location
设置在什么情况下可以使用旧缓存,如服务端返回500或404错误信息等,或者是Nginx正在更新旧缓存,那么这时候Nginx可以选择是否要把旧缓存数据返回给客户端。可配合 proxy_next_upstream 指令一起使用。
3.11 proxy_cache_background_update 后台更新缓存
Syntax: proxy_cache_background_update on | off;
Default: proxy_cache_background_update off;
Context: http, server, location
This directive appeared in version 1.11.10.
当允许使用过期的响应数据时,该指令可设置是否允许启动后台子请求来更新已过期的缓存文件,由Nginx向上游主动发送请求来更新过期缓存。请注意,在更新过期缓存响应时,有必要允许使用过期缓存响应。
3.12 proxy_cache_convert_head
Syntax: proxy_cache_convert_head on | off;
Default: proxy_cache_convert_head on;
Context: http, server, location
This directive appeared in version 1.9.7.
设置是否将 "HEAD"方法转换为 "GET "方法进行缓存。禁用转换时,proxy_cache_key 指令配置内容应包含 $request_method。
3.13 proxy_cache_lock 代理缓存锁
Syntax: proxy_cache_lock on | off;
Default: proxy_cache_lock off;
Context: http, server, location
This directive appeared in version 1.1.12.
设置是否开启代理缓存锁。启用后,如果同一时间内有多个相同cache key的代理请求需要发送给被代理服务器,那么每次只允许发送一个(按序选择最靠前的)请求给被代理服务器,而其它请求要么是等待上一个请求的响应被返回后再读取缓存数据,要么是等待上一个请求超时后(proxy_cache_lock_age指令设置)再发送给被代理服务器,要么是等获取代理缓存锁的等待时间超时后再发送给被代理服务器。缓存锁超时时间由proxy_cache_lock_timeout 指定设置。开启缓存锁可有效地提升缓存利用率,降低被代理服务器的负载。
3.14 proxy_cache_lock_age 代理缓存锁有效期
Syntax: proxy_cache_lock_age time;
Default: proxy_cache_lock_age 5s;
Context: http, server, location
This directive appeared in version 1.7.8.
设置代理缓存锁的有效期,即上一个请求返回响应的超时时间。当启用缓存锁机制时,如果一个请求在该指令设定的时间内未生成响应数据缓存文件,缓存锁将被释放,下一个获取到缓存锁的请求会被转发给被代理服务器。
3.15 proxy_cache_lock_timeout 等待缓存锁超时时间
Syntax: proxy_cache_lock_timeout time;
Default: proxy_cache_lock_timeout 5s;
Context: http, server, location
This directive appeared in version 1.1.12.
设置 proxy_cache_lock 的等待超时时间。超时后,其它请求才能发送给被代理服务器,但响应数据不会被缓存。
3.16 proxy_cache_max_range_offset
Syntax: proxy_cache_max_range_offset number;
Default: —
Context: http, server, location
This directive appeared in version 1.11.6.
设置range请求的最大偏移量,单位是字节。超出该偏移量的请求将直接传递给被代理服务器,但响应数据不会被缓存。
3.17 proxy_cache_revalidate 重验缓存
Syntax: proxy_cache_revalidate on | off;
Default: proxy_cache_revalidate off;
Context: http, server, location
This directive appeared in version 1.5.7.
设置是否开启重新验证已过期的缓存文件。当缓存文件过期后,可在请求头中增加 "If-Modified-Since "和 "If-None-Match "字段来重新验证已过期的缓存内容是否仍有效。
3.18 proxy_temp_path 临时缓存文件目录
Syntax: proxy_temp_path path [level1 [level2 [level3]]];
Default: proxy_temp_path proxy_temp;
Context: http, server, location
设置临时缓存文件的存放目录,默认是Nginx安装目录下的proxy_temp目录。最多可指定三层子目录,类似于proxy_cache_path指令中的levels参数。
3.19 proxy_store 持久保存/镜像文件
Syntax: proxy_store on | off | string;
Default: proxy_store off;
Context: http, server, location
设置是否将被代理服务器返回的响应数据(静态文件)保存到磁盘中,文件的最后修改时间是根据接收到的 "Last-Modified "响应头字段设置的。如果设置为on,文件将保存到 alias 或 root 指令指定的路径下。另外,还可以使用带有变量的字符串明确设置文件名:
proxy_store /data/www$original_uri;
首先将响应写入到临时文件,然后再重命名该文件。从 0.8.9 版开始,可以把临时文件和持久保存文件存放在不同的文件系统上。但要注意的是,在这种情况下,文件会在两个文件系统之间复制,而不是进行简单的重命名操作。因此,建议在任何给定位置,都将持久保存文件和由 proxy_temp_path 指令设置的临时文件目录放在同一个文件系统中。
proxy_cache 与 proxy_store 指令不能在同一指令域中同时使用。
该指令可用于创建静态不可更改文件的本地副本
location /images/ {
root /data/www;
error_page 404 = /fetch$uri;
}
location /fetch/ {
internal;
proxy_pass http://backend/;
proxy_store on;
proxy_store_access user:rw group:rw all:r;
proxy_temp_path /data/temp;
alias /data/www/;
}
或者类似这样
location /images/ {
root /data/www;
error_page 404 = @fetch;
}
location @fetch {
internal;
proxy_pass http://backend;
proxy_store on;
proxy_store_access user:rw group:rw all:r;
proxy_temp_path /data/temp;
root /data/www;
}
3.20 proxy_store_access 文件访问权限
Syntax: proxy_store_access users:permissions ...;
Default: proxy_store_access user:rw;
Context: http, server, location
为新创建的镜像文件和目录设置访问权限,如:
proxy_store_access user:rw group:rw all:r;
如果指定了任何组或所有访问权限,则可以省略用户权限:
proxy_store_access group:rw all:r;
4. 超时时间 timeout
4.1 proxy_timeout 连接超时时间
Syntax: proxy_timeout timeout;
Default: proxy_timeout 10m;
Context: stream, server
设置客户端或被代理服务器连接上两次连续read或write操作之间的超时时间。如果在这段时间内没有数据传输,连接就会关闭。 类似于keepalive_timeout。
4.2 proxy_connect_timeout 建立连接超时
Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;
Context: http, server, location
设置Nginx与代理服务器尝试建立连接的超时时间。请注意,这个指令限制的是尝试建立连接的超时时间,并不是连接建立成功后的保活时长。默认设置是60秒,但并不是说非要等60秒后才反馈连接建立失败,因为Nginx与被代理服务器建立连接时,也是通过TCP协议建立的连接,那么就会受内核参数net.ipv4.tcp_syn_retries的影响,如果我们把syn_retries的次数配置的较小(默认配置是5次,大约相当于180秒),Nginx重传SYN报文的次数达到上限并等待完成后,有可能总耗时都不到60秒,此时照样会反馈连接建立失败。如果syn_retries配置的较大,SYN报文重传次数虽未达到上限,但总耗时已达到proxy_connect_timeout指定的时间,此时也会反馈连接建立失败,所以Nginx与被代理服务器尝试建立连接的超时时间是取proxy_connect_timeout与SYN报文重传用时的最小值。
实际使用中不建议调整该值,要调整也是调小,不要调大,最大值尽量不要超过75秒。
4.3 proxy_read_timeout 接收响应超时
Syntax: proxy_read_timeout time;
Default: proxy_read_timeout 60s;
Context: http, server, location
设置接收代理响应的超时时间。这个超时并不是接收一个响应的用时时间,而是两次连续接收响应(read操作)的最大间隔时间。当接收完一个响应后,如果在proxy_read_timeout指定时间内未接收到第二次响应,Nginx将关闭该连接。
4.4 proxy_send_timeout 发送请求超时
Syntax: proxy_send_timeout time;
Default: proxy_send_timeout 60s;
Context: http, server, location
设置向被代理服务器发送请求的超时时间。同样的,这个超时也不是发送一次请求的用时时间,而是两次连续发送请求(write操作)的最大间隔时间。所以当发送完第一次代理请求后,如果在proxy_send_timeout指定时间内未发送第二次请求,Nginx将关闭该连接。
5. 使用下一台上游服务器 proxy_next_upstream
当向一台上游服务器发送代理请求出错或无响应内容时,可认定该服务器异常,此时Nginx可通过配置 proxy_next_upstream 指令来选择是否要换下一台上游服务器继续处理当前这个请求,向下一台服务器发送请求可能还要受尝试次数(proxy_next_upstream_tries)和时间(proxy_next_upstream_timeout)的限制。具体说明请参考5.4章节。
5.1 proxy_next_upstream 尝试下一台服务器
Syntax: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | non_idempotent | off ...;
Default: proxy_next_upstream error timeout;
Context: http, server, location
指定在哪种情况下可以将请求转发给下一台上游服务器继续进行处理。需要注意的是,只有在尚未向客户端发送任何内容的情况下,才能将请求传递给下一个服务器。也就是说,如果在传输响应的过程中出现错误或超时,则无法修复。
该指令还定义了与服务器通信失败的判定标准。error、timeout 和 invalid_header 会始终被视为通信失败,即使指令中没有指定它们。只有在该指令中指定了 http_500、http_502、http_503、http_504 和 http_429 的情况下,它们才会被视为通信失败,而http_403 和 http_404 永远不会被视为通信失败。
- error:在与上游服务器建立连接、发送请求或读取响应头时发生错误;
- timeout:在与上游服务器建立连接、发送请求或读取响应头时发生超时;
- invalid_header:上游服务器返回空响应或无效响应;
- http_500:上游服务器返回的响应码为500;
- http_502:上游服务器返回的响应码为502;
- http_503:上游服务器返回的响应码为503;
- http_504:上游服务器返回的响应码为504;
- http_404:上游服务器返回的响应码为404;
- http_429:上游服务器返回的响应码为429;
- non_idempotent:通常情况下,如果请求已发送到上游服务器(1.9.13),那么使用non-idempotent方法(POST、LOCK、PATCH)的请求不会传递给下一台服务器;启用该选项后,可以明确允许重试此类请求。
- off:禁止将请求传递给下一台上游服务器。
5.2 proxy_next_upstream_timeout 重试超时
Syntax: proxy_next_upstream_timeout time;
Default: proxy_next_upstream_timeout 0;
Context: http, server, location
This directive appeared in version 1.7.5.
限制尝试向下一台上游服务器转发请求的总耗时,默认是0,表示不受时间限制。
proxy_next_upstream_timeout 10s;
5.3 proxy_next_upstream_tries 重试次数
Syntax: proxy_next_upstream_tries number;
Default: proxy_next_upstream_tries 0;
Context: http, server, location
This directive appeared in version 1.7.5.
限制向下一台上游服务器转发请求的尝试次数,默认是0,表示不受次数限制。
proxy_next_upstream_timeout 时间范围内最多允许尝试 proxy_next_upstream_tries 次,含第一次。
proxy_next_upstream_tries 2;
5.4 综合说明(已测试)
proxy_next_upstream error timeout http_500;
proxy_next_upstream_timeout 10s;
proxy_next_upstream_tries 5;
假设我们针对某一server或location配置了多台后端服务器,Nginx首次转发请求给第一台服务器后返回的响应码为500,此时Nginx把请求转发给Next Server(可用,server指令中的max_fails、fail_timeout参数设置)进行处理,并开启一个计时器,时间设定为proxy_next_upstream_timeout指令配置的值。如果Next Server返回的响应码还是500,则继续将请求转发给Next Next Server,直到满足以下任意一个条件,Nginx才会停止转发并将最终的响应结果返回给客户端:
- 计时时间超过了proxy_next_upstream_timeout设定的时间,也就是我们上面配置的10秒;
- 向Next Server转发的次数达到了proxy_next_upstream_tries设定的次数限制,也就是我们上面配置的5次;
- 响应结果不满足proxy_next_upstream指定设定的条件,比如返回结果是404或301;
- 所有可用后端服务器都被尝试请求过了,不管最后一个服务器返回的响应是什么都会停止转发。
Q:如果后端服务器只有3个,每个服务器的失败尝试次数为1 ,不可用时长是20秒,proxy_next_upstream_tries =5,会尝试请求几次?
A:如果请求第一台服务器返回500,则转发请求给第二台可用服务器,如果第二台服务器还是返回500,则再请求第三台可用服务,无论第三台服务器返回结果是什么都会终止请求,并将结果返回给客户端(具体给客户端返回什么样的响应还要看proxy_intercept_errors和error_page指令的配置结果)。此时配置的proxy_next_upstream_timeout和proxy_next_upstream_tries将失效。也就是服务器不会被循环再次请求。请注意,如果请求完第一台服务器后返回500,而后面的服务器在fail_timeout时间内都被判定为不可用,那么就不再尝试转发请求给其他服务器,retry次数为0,直接将第一台服务器的响应返回给客户端。
6. 代理服务器SSL验证 proxy_ssl
6.1 proxy_ssl_certificate
Syntax: proxy_ssl_certificate file;
Default: —
Context: http, server, location
This directive appeared in version 1.7.8.
与ssl_certificate指令一样,指定包含 PEM 格式证书的文件,用于代理 HTTPS 服务器的身份验证。
6.2 proxy_ssl_certificate_key
Syntax: proxy_ssl_certificate_key file;
Default: —
Context: http, server, location
This directive appeared in version 1.7.8.
与ssl_certificate_key指令一样,指定包含 PEM 格式秘钥的证书文件,用于代理 HTTPS 服务器的身份验证。
6.3 proxy_ssl_ciphers
Syntax: proxy_ssl_ciphers ciphers;
Default: proxy_ssl_ciphers DEFAULT;
Context: http, server, location
This directive appeared in version 1.5.6.
与ssl_ciphers指令一样,指定对代理请求 HTTPS 服务器启用的密码。密码以 OpenSSL 库能理解的格式指定。具体配置可参考 Module ngx_http_ssl_module
6.4 proxy_ssl_conf_command
Syntax: proxy_ssl_conf_command name value;
Default: —
Context: http, server, location
This directive appeared in version 1.19.4.
与ssl_conf_command指令一样,在与代理 HTTPS 服务器建立连接时设置任意 OpenSSL 配置命令。
同一配置层中可以指定多个 proxy_ssl_conf_command 指令。只有在当前配置层没有定义 proxy_ssl_conf_command 指令时,这些指令才会继承上一级配置。
6.5 proxy_ssl_crl
Syntax: proxy_ssl_crl file;
Default: —
Context: http, server, location
This directive appeared in version 1.7.0.
与ssl_crl指令一样,指定用于验证代理 HTTPS 服务器的 PEM 格式的已撤销证书(CRL)。
6.6 proxy_ssl_name
Syntax: proxy_ssl_name name;
Default: proxy_ssl_name $proxy_host;
Context: http, server, location
This directive appeared in version 1.7.0.
允许重设服务器名称,该名称用于验证代理 HTTPS 服务器的证书,并在与代理 HTTPS 服务器建立连接时通过 SNI 传递。默认情况下,使用 proxy_pass URL 的Host部分。
6.7 proxy_ssl_password_file
Syntax: proxy_ssl_password_file file;
Default: —
Context: http, server, location
This directive appeared in version 1.7.8.
与ssl_password_file指令一样,指定一个包含密钥口令的文件,每个口令单独一行。在加载密钥时,会依次尝试使用口令。
6.8 proxy_ssl_protocols
Syntax: proxy_ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];
Default: proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
Context: http, server, location
This directive appeared in version 1.5.6.
与ssl_protocols指令一样,为向代理 HTTPS 服务器发出的请求启用指定协议。
6.9 proxy_ssl_server_name
Syntax: proxy_ssl_server_name on | off;
Default: proxy_ssl_server_name off;
Context: http, server, location
This directive appeared in version 1.7.0.
与代理 HTTPS 服务器建立连接时,启用或禁用通过 TLS 服务器名称指示扩展(SNI,RFC 6066)传递服务器名称。
6.10 proxy_ssl_session_reuse
Syntax: proxy_ssl_session_reuse on | off;
Default: proxy_ssl_session_reuse on;
Context: http, server, location
确定在使用代理服务器时是否可以重复使用 SSL 会话。如果日志中出现 "SSL3_GET_FINISHED:digest check failed"(SSL3_GET_FINISHED:摘要检查失败)错误,请尝试禁用会话重用。
6.11 proxy_ssl_trusted_certificate
Syntax: proxy_ssl_trusted_certificate file;
Default: —
Context: http, server, location
This directive appeared in version 1.7.0.
与ssl_trusted_certificate指令一样,指定用于验证代理 HTTPS 服务器证书的 PEM 格式可信 CA 证书的文件。
6.12 proxy_ssl_verify
Syntax: proxy_ssl_verify on | off;
Default: proxy_ssl_verify off;
Context: http, server, location
This directive appeared in version 1.7.0.
启用或禁用代理 HTTPS 服务器证书验证。
6.13 proxy_ssl_verify_depth
Syntax: proxy_ssl_verify_depth number;
Default: proxy_ssl_verify_depth 1;
Context: http, server, location
This directive appeared in version 1.7.0.
与ssl_verify_depth指令一样,设置代理 HTTPS 服务器证书链的验证深度。
7. proxy_socket_keepalive TCP保活
Syntax: proxy_socket_keepalive on | off;
Default: proxy_socket_keepalive off;
Context: http, server, location
This directive appeared in version 1.15.6.
设置是否开启与被代理服务器间的TCP保活机制,类似于listen指令中的so_keepalive参数。如果设置为on,表示开启,socket将打开SO_KEEPALIVE选项,参数使用系统内核参数。
8. proxy_method 代理请求方法
Syntax: proxy_method method;
Default: —
Context: http, server, location
指定转发到被代理服务器的请求要使用的HTTP方法(GET/POST/DELETE/UPDATE),而不使用客户端请求中的方法。如果不指定,代理请求方法与客户端的请求方法保持一致。
9. proxy_bind 绑定地址
Syntax: proxy_bind address [transparent] | off;
Default: —
Context: http, server, location
This directive appeared in version 0.8.22.
该指令用于指定Nginx在向后端服务器发送请求时应绑定的本机IP地址,端口号可选。参数值可包含变量。配置为off时,表示不继承上级配置的 proxy_bind,此时,系统将自动分配本地 IP 地址和端口。transparent 是可选参数,表示使用透明代理模式,允许将客户端的真实 IP 传递给被代理服务器,并将客户端的真实 IP 设置为访问被代理服务器的源 IP。
proxy_bind $remote_addr transparent;
10. proxy_ignore_headers 忽略响应头
Syntax: proxy_ignore_headers field ...;
Default: —
Context: http, server, location
后端服务器返回的响应中某些响应头字段可能会影响Nginx的行为,可通过该指令来设置Nginx可忽略处理响应头中的哪些字段。可忽略以下字段: "X-Accel-Redirect"、"X-Accel-Expires"、"X-Accel-Limit-Rate" (1.1.6)、"X-Accel-Buffering" (1.1.6)、"X-Accel-Charset" (1.1.6)、"Expires"、"Cache-Control"、"Set-Cookie" (0.8.44) 和 "Vary" (1.7.7)。
- "X-Accel-Expires"、"Expires"、"Cache-Control"、"Set-Cookie "和 "Vary "设置了响应缓存的参数;
- "X-Accel-Redirect":执行内部重定向到指定 URI;
- "X-Accel-Limit-Rate ":设置向客户端传输响应的速率限制;
- "X-Accel-Buffering":启用或禁用响应缓冲;
- "X-Accel-Charset":设置所需的响应字符集。
11. proxy_ignore_client_abort 是否关闭连接
Syntax: proxy_ignore_client_abort on | off;
Default: proxy_ignore_client_abort off;
Context: http, server, location
设置当客户端关闭连接而不再等待响应时,是否应关闭与被代理服务器的连接。
12. limit_rate 限速
12.1 proxy_limit_rate 限制读取代理响应速率
Syntax: proxy_limit_rate rate;
Default: proxy_limit_rate 0;
Context: http, server, location
This directive appeared in version 1.7.7.
限制每个连接从被代理服务器读取响应的速率。速率以每秒字节数为单位。设为0时将禁用速率限制。该指令限制的是单个连接的速率,如果 nginx 同时打开两个连接到被代理服务器,总速率将是限定速率的两倍。只有在启用了代理缓冲后,该限制才会生效。
12.2 proxy_download_rate 限制读取代理响应速率
Syntax: proxy_download_rate rate;
Default: proxy_download_rate 0;
Context: stream, server
This directive appeared in version 1.9.3.
限制每个连接从被代理服务器读取响应的速率。速率以每秒字节数为单位。设为0时将禁用速率限制。该指令限制的是单个连接的速率,如果 nginx 同时打开两个连接到被代理服务器,总速率将是限定速率的两倍。
参数值可包含变量(1.17.0)。可根据不同条件做出不同限速:
map $slow $rate {
1 4k;
2 8k;
}
proxy_download_rate $rate;
12.3 proxy_upload_rate 限制读取客户端速率
Syntax: proxy_upload_rate rate;
Default: proxy_upload_rate 0;
Context: stream, server
This directive appeared in version 1.9.3.
限制每个连接从客户端读取数据的速率。速率以每秒字节数为单位。设为0时将禁用速率限制。该指令限制的是单个连接的速率,如果客户端同时打开两个连接到 nginx ,总速率将是限定速率的两倍。
参数值可包含变量(1.17.0)。可根据不同条件做出不同限速:
map $slow $rate {
1 4k;
2 8k;
}
proxy_upload_rate $rate;
13. proxy_cookie
13.1 proxy_cookie_domain
Syntax: proxy_cookie_domain off;
proxy_cookie_domain domain replacement;
Default: proxy_cookie_domain off;
Context: http, server, location
This directive appeared in version 1.1.15.
为代理响应头字段"Set-Cookie"的domain属性设置应替换的文本,匹配不区分大小写。假设被代理服务器返回的响应头"Set-Cookie "字段的domain属性为"domain=localhost",可以将该指令配置为
# 把localhost更改为实际域名返回给客户端
proxy_cookie_domain localhost example.org;
domain属性将被重写为“domain=example.org” 。
如果domain和replacement字符串以点"."开头,那么domain属性将被忽略。
# domain和replacement参数可包括变量。
proxy_cookie_domain www.$host $host;
该指令也可以使用正则表达式指定。此时domain应以“~”符号开头。正则表达式可以包含命名捕获和位置捕获,replacement可以引用它们:
proxy_cookie_domain ~\.(?P<sl_domain>[-0-9a-z]+\.[a-z]+)$ $sl_domain;
# 同一配置层可同时配置多个proxy_cookie_domain指令,如果一个 cookie 匹配到多个该指令,则选择第一个匹配到的。
proxy_cookie_domain localhost example.org;
proxy_cookie_domain ~\.([a-z]+\.[a-z]+)$ $1;
参数off表示禁用proxy_cookie_domain功能,且当前配置层级所有proxy_cookie_domain配置也会失效。
proxy_cookie_domain off;
proxy_cookie_domain localhost example.org;
proxy_cookie_domain www.example.org example.org;
13.2 proxy_cookie_flags
Syntax: proxy_cookie_flags off | cookie [flag ...];
Default: proxy_cookie_flags off;
Context: http, server, location
This directive appeared in version 1.19.3.
为 cookie 设置一个或多个flags。cookie 可以包含文本、变量及其组合。flag 可包含文本、变量及其组合(1.19.8)。secure、httponly、samesite=strict、samesite=lax、samesite=none 参数会添加相应的标志。nosecure、nohttponly、nosamesite 参数会删除相应标记。
也可以使用正则表达式指定 cookie,在这种情况下,cookie 应以"~"符号开头。
# 同一配置层可同时配置多个proxy_cookie_flags指令,如果一个cookie匹配到多个该指令,则选择第一个匹配到的。
# 表示将 httponly 标志添加到 cookie “one”中
proxy_cookie_flags one httponly;
# 而对于所有其他 cookie,则会添加 samesite=strict 标记,并删除 secure 标记。
proxy_cookie_flags ~ nosecure samesite=strict;
参数off表示禁止向cookie中添加flag,且不会继承上一层级的配置。
13.3 proxy_cookie_path
Syntax: proxy_cookie_path off;
proxy_cookie_path path replacement;
Default: proxy_cookie_path off;
Context: http, server, location
This directive appeared in version 1.1.15.
为代理响应头字段"Set-Cookie"的path属性设置应替换的文本。假设被代理服务器返回的响应头"Set-Cookie "字段的path属性为"path=/two/some/uri/",可以将该指令配置为
proxy_cookie_path /two/ /;
path属性将被重写为“path=/some/uri/” 。
# path和 replacement 参数可包含变量
proxy_cookie_path $uri /some$uri;
该指令也可以使用正则表达式指定。此时path应以"~"符号开头(区分大小写),或以"~*"符号开头(不区分大小写)。正则表达式可以包含命名捕获和位置捕获,replacement可以引用它们:
proxy_cookie_path ~*^/user/([^/]+) /u/$1;
# 同一配置层可同时配置多个proxy_cookie_path指令,如果一个cookie匹配到多个该指令,则选择第一个匹配到的。
proxy_cookie_path /one/ /;
proxy_cookie_path / /two/;
参数off表示禁用proxy_cookie_path功能,且当前配置层级所有proxy_cookie_path配置也会失效。
proxy_cookie_path off;
proxy_cookie_path /two/ /;
proxy_cookie_path ~*^/user/([^/]+) /u/$1;
14. proxy_force_ranges 强制range请求
Syntax: proxy_force_ranges on | off;
Default: proxy_force_ranges off;
Context: http, server, location
This directive appeared in version 1.7.7.
无论代理响应头中的"Accept-Ranges "字段值是什么,Nginx都可选择是否开启byte-range功能来缓存或不缓存响应数据,默认是不开启。
15. proxy_headers_hash_bucket_size
Syntax: proxy_headers_hash_bucket_size size;
Default: proxy_headers_hash_bucket_size 64;
Context: http, server, location
设置 proxy_hide_header 和 proxy_set_header 指令使用的哈希表的存储桶大小。
16. proxy_headers_hash_max_size
Syntax: proxy_headers_hash_max_size size;
Default: proxy_headers_hash_max_size 512;
Context: http, server, location
设置 proxy_hide_header 和 proxy_set_header 指令使用的哈希表的最大值。
17. proxy_intercept_errors 拦截error
Syntax: proxy_intercept_errors on | off;
Default: proxy_intercept_errors off;
Context: http, server, location
设置是否拦截被代理服务器返回的响应码大于300的响应,如果开启拦截则重定向到由Nginx配置的error_page页面,如果不拦截则直接返回原始响应给客户端。默认是不拦截,给客户端返回原始响应。
18. proxy_send_lowat
Syntax: proxy_send_lowat size;
Default: proxy_send_lowat 0;
Context: http, server, location
FreeBSD 系统中,设置Nginx使用 kqueue 方法时 socket 接口 SO_SNDLOWAT 选项的大小,尽量减少被代理服务器的外发连接的发送操作次数。
在Linux,Solaris 和 Windows 系统中,该指令无效。
19.可用参数
- $proxy_host:被代理服务器的名称和端口,如 proxy_pass 指令所指定;
- $proxy_port:proxy_pass 指令中指定的被代理服务器端口,或协议默认端口;
- $proxy_add_x_forwarded_for:客户端请求头中的 "X-Forwarded-For "字段,并附加 $remote_addr 变量,以逗号分隔。如果客户端请求头中没有 "X-Forwarded-For "字段,则 $proxy_add_x_forwarded_for 变量等于 $remote_addr 变量。