Nginx(十三) 配置文件详解 - 反向代理(超详细)

        本篇文章主要讲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

        设置代理服务器的协议和地址以及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/;
	}
  1. 原始请求为:http://47.**.**.80:8688/pages/test/mg.js

  2. 最终请求为:http://127.0.0.1:8688/test/test/mg.js。将原始请求中与location匹配的部分替换成指定的URI。

  3. 使用替换后的请求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;
	}
  1. 原始请求为:http://47.**.**.80:8688/pages/test/mg.js

  2. 最终请求为:http://127.0.0.1:8080/pages/test/mg.js。URI保持不变。

  3. 使用最终请求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/;
	}
  1. 原始请求为:http://47.**.**.80:8688/pages/test/mg.js

  2. 最终请求为:http://127.0.0.1:8080/test/mg.js。将原始请求中与location匹配的部分替换成空字符串(也可以理解成删除匹配部分)。

  3. 使用替换后的请求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信息,如果请求头中没有http_host字段,那么传递的内容为空
proxy_set_header Host       $http_host;
# 如果原始请求头总没有http_host字段,也可使用$host变量来传递host信息
proxy_set_header Host       $host;
host也可以和代理服务器端口一起传递
proxy_set_header Host       $host:$proxy_port;
# 向后端服务器传递客户端真实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

        设置是否缓存后端服务器返回的响应。默认开启缓存。

        启用缓存后,nginx 会尽快接收后端服务器的响应,并将其保存到由 proxy_buffer_size 和 proxy_buffers 指令设置的缓冲区中。如果整个响应无法存入内存,可以将其中一部分保存到磁盘上的临时文件中。临时文件的写入由 proxy_max_temp_file_size 和 proxy_temp_file_write_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从后端服务器读取单个连接响应数据的缓冲区数量和大小。默认情况下,缓冲区大小等于一个内存页。根据平台不同,缓冲区大小为 4K 或 8K。

2.3 proxy_buffer_size

Syntax:     proxy_buffer_size size;
Default:     proxy_buffer_size 4k|8k;
Context:    http, server, location

        该指令用于设置Nginx从后端服务器读取响应头数据的缓冲区大小,这个缓冲区通常存储一些较小的响应头信息。默认情况下,缓冲区大小等于一个内存页。根据平台的不同,缓冲区大小为 4K 或 8K。不过,它也可以变小。

2.4 proxy_busy_buffers_size

Syntax:     proxy_busy_buffers_size size;
Default:     proxy_busy_buffers_size 8k|16k;
Context:    http, server, location

        启用代理服务器响应缓冲后,将限制正在忙于给客户端发送响应而代理服务器响应尚未被完全读取的缓冲区总大小。在此期间,其余缓冲区可用于读取响应,并在必要时将部分响应缓冲到临时文件中。默认情况下,size 受 proxy_buffer_size 和 proxy_buffers 指令设置的两个缓冲区大小限制。

2.5 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.

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_ ***]:当缓存数据总大小超过缓存空间上限值或缓存可用空间不足时,系统会删除最近使用最少的数据。数据会在 manager_files、manager_threshold 和 manager_sleep 参数(1.11.5)配置的迭代中删除。在一次迭代中,删除的 manager_files 条目不会超过(默认为 100)。一次迭代的持续时间受 manager_threshold 参数限制(默认为 200 毫秒)。在两次迭代之间,会有一个由 manager_sleep 参数(默认为 50 毫秒)设置的暂停。启动一分钟后,特殊的 "缓存加载器 "进程被激活。它将以前存储在文件系统中的缓存数据信息加载到缓存区。加载也是迭代进行的。在一次迭代中,加载的加载器文件项不会超过 100 个(默认为 100 个)。此外,一次迭代的持续时间受 loader_threshold 参数的限制(默认为 200 毫秒)。在两次迭代之间,会有一个由 loader_sleep 参数(默认为 50 毫秒)设置的暂停。

  • [manager_files=number]:manager进程每次移除缓存文件数量的上限。
  • [manager_sleep=time]:manager进程每次移除缓存文件的时间上限。
  • [manager_threshold=time]:manager进程每次移除缓存后的间隔时间。
  • [loader_files=number]:重启Nginx载入缓存时,每次加载的个数,默认100。
  • [loader_sleep=time]:每次载入时,允许的最大时间上限,默认200ms。
  • [loader_threshold=time]:一次载入后,停顿的时间间隔,默认50ms。
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)从磁盘中删除与通配符匹配的缓存条目。将该参数设置为开(默认为关)将激活 "缓存清除器 "进程,永久遍历所有缓存条目并删除与通配符键匹配的条目。
  • [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请求的字节偏移量,单位是字节。如果超出偏移量,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 "字段来重新验证已过期的缓存内容是否仍有效。

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进行处理,并开启一个计时器,时间设定为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个,会尝试请求几次?

A:如果请求第一台服务器返回500,则转发请求给第二台服务器,如果第二台服务器还是返回500,则再请求第三台,无论第三台服务器返回结果是什么都会终止请求,并将结果返回给客户端。此时配置的proxy_next_upstream_timeout和proxy_next_upstream_tries将失效。也就是服务器不会被循环再次请求。

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向代后端服务器发送请求。

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

        如果将该指令设置为非零,nginx将尝试使用kqueue方法的NOTE_LOWAT标志,或指定大小的SO_SNDLOWAT套接字选项,尽量减少代理服务器的外发连接的发送操作次数。

        Linux,Solaris 和 Windows 系统会忽略该指令。

19. proxy_store 持久保存文件

Syntax:    proxy_store on | off | string;
Default:    proxy_store off;
Context:    http, server, location

        设置是否将文件保存到磁盘。如果设置为on,文件将保存到 alias 或 root 指令指定的路径下。另外,还可以使用带有变量的字符串明确设置文件名:

proxy_store /data/www$original_uri;

        文件的修改时间是根据接收到的 "Last-Modified "响应头字段设置的。首先将响应写入到临时文件,然后再重命名该文件。从 0.8.9 版开始,可以把临时文件和持久保存文件存放在不同的文件系统上。但要注意的是,在这种情况下,文件会在两个文件系统之间复制,而不是进行简单的重命名操作。因此,建议在任何给定位置,都将持久保存文件和由 proxy_temp_path 指令设置的临时文件目录放在同一个文件系统中。

        该指令可用于创建静态不可更改文件的本地副本

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;
}

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;

21. proxy_temp_file_write_size 单次最多写入

Syntax:    proxy_temp_file_write_size size;
Default:    proxy_temp_file_write_size 8k|16k;
Context:    http, server, location

        当启用将代理服务器响应数据写入临时文件(use_temp_path=on)时,该指令用于限制每次写入临时文件的数据大小。默认情况下,大小受 proxy_buffer_size 和 proxy_buffers 指令设置的两个缓冲区限制。临时文件的最大大小由 proxy_max_temp_file_size 指令设置。

22. proxy_max_temp_file_size 临时文件最大值

Syntax:    proxy_max_temp_file_size size;
Default:    proxy_max_temp_file_size 1024m;
Context:    http, server, location

        限制临时文件的最大值,默认是1024M。

23. 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参数。

24.可用参数

  • $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 变量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/287317.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【模拟电路】模拟集成电路之神-NE555

一、集成电路NE555简介 二、功能框图与引脚说明 三、比较器&#xff08;运放&#xff09; 四、反相门&#xff08;非门&#xff09; 五、或非门 六、双稳态触发器 七、NE555的工作原理 集成电路NE555的芯片手册 C5157696 一、集成电路NE555简介 NE555起源于上个世纪70年代&a…

element-ui Tree 树形控件 过滤保留子级并获取过滤后的数据

本示例基于vue2 element-ui element-ui 的官网demo是只保留到过滤值一级的&#xff0c;并不会保留其子级 目标 1、Tree 树形控件 保留过滤值的子级 2、在第一次过滤数据的基础上进行第二次过滤 先看效果 Tree 树形控件 保留过滤值的子级 <el-treeclass"filter-t…

宝藏推荐:其实,这些工具一点不输Intercom-

在当今快节奏的商业环境中&#xff0c;提供优质的客户服务和支持是每个企业都追求的目标。为了实现这一目标&#xff0c;许多企业都在寻找可以帮助他们提供高效和个性化客户支持的工具。Intercom是一个非常受欢迎的客户支持工具&#xff0c;但它并不是唯一的选择。在本文中&…

玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— 编译构建及此过程中的踩坑填坑(1)

接前一篇文章&#xff1a;玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— 代码下载&#xff08;2&#xff09; 本文主要参考&#xff1a; BQ3588C_代码下载 上一回完成了代码下载&#xff0c;本回开始进行编译构建。 1. 编译构建 &#xff08;1&#xff09;执行prebuilts 在源…

用 MATLAB 产生单位抽样序列、单位阶跃序列、矩形序列、正弦序列和复指数序列

%% 单位抽样&#xff08;脉冲&#xff09;序列&#xff08;冲激函数&#xff09; % 参数设置 n -10:10; % 定义时间范围 delta (n 0); % 生成单位抽样序列% 绘图 figure; stem(n, delta); title(单位抽样序列); xlabel(n); ylabel(delta[n]);%% 单位阶跃序列 % 参数设置 n …

LanChatRoom局域网聊天室

CPP已经结课&#xff0c;我提交的项目是Qt的入门项目&#xff0c;局域网聊天室LanChatRoom。 这个代码重构了很多遍。第一遍是照着明哥推荐到书&#xff0c;把代码抄了一遍。 但抄下来之后&#xff0c;各种问题&#xff0c;而且是清朝老代码。抄了一遍之后&#xff0c;对代码的…

深度学习 Day23——J3DenseNet算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 文章目录 前言1 我的环境2 pytorch实现DenseNet算法2.1 前期准备2.1.1 引入库2.1.2 设…

JavaScript中alert、prompt 和 confirm区别及使用【通俗易懂】

✨前言✨   本篇文章主要在于&#xff0c;让我们看几个与用户交互的函数&#xff1a;alert&#xff0c;prompt 和confirm的使用及区别 &#x1f352;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f352;博主将持续更新学习记录收获&…

HarmonyOS页面和自定义组件生命周期

页面和自定义组件生命周期 在开始之前&#xff0c;我们先明确自定义组件和页面的关系&#xff1a; 自定义组件&#xff1a;Component装饰的UI单元&#xff0c;可以组合多个系统组件实现UI的复用。页面&#xff1a;即应用的UI页面。可以由一个或者多个自定义组件组成&#xff…

【算法每日一练]-数论 (保姆级教程 篇2 )#行列式 #甜甜花研究 #约数个数 #模数 #数树 #盒子与球

目录 今日知识点&#xff1a; 辗转相减法化下三角求行列式 组合数动态规划打表 约数个数等于质因数的次方1的乘积 求一个模数 将n个不同的球放入r个不同的盒子&#xff1a;f[i][j]f[i-1][j-1]f[i-1][j]*j 行列式 甜甜花的研究 约数个数 模数 数树 盒子与球 行列…

LinkedList与ArrayList的比较

1.LinkedList 基于双向链表&#xff0c;无需连续内存 随机访问慢&#xff08;要沿着链表遍历&#xff09; 头尾插入删除性能高 占用内存多 2.ArrayList 基于数组&#xff0c;需要连续内存 随机访问快&#xff08;指根据下标访问&#xff09; 尾部插入、删除性能可以&…

西门子宣布SIMATIC S-300停产?找找理想替代品——钡铼BL30x系列工控机

1994年&#xff0c;西门子发布了S7系列的第一批产品&#xff0c;其中包括S7-300。SIMATIC S7的推出也见证了新的现场总线标准Profibus的发布&#xff0c;以及率先使用工业总线来促进自动化设备之间的通信。S7-300 CPU系列的巨大成功也帮助西门子进一步巩固了其全球自动化技术领…

格局初现:京东阿里都瞄准了这个万亿级的大市场

核 心 要 点 ▪ 企业采购有哪些痛点和解决方案&#xff1f;行业的关键赛点是什么&#xff1f; ▪ 现行格局是何情况&#xff1f;代表性玩家各自有何特点&#xff1f; ▪ 未来企业采购将往何处去&#xff1f; 当这样一组数据摆在眼前的时候&#xff0c;你或许会感到难以置…

Gitee

Gitee码云 0. 笔记说明1. Gitee概述2. Gitee和GitHub3. 创建Git远程仓库4. 分享已有项目到Gitee5. 文件恢复和合并6. 文件push或pull冲突7. 添加项目成员 0. 笔记说明 该笔记以IDEA 2023专业版进行操作需提前注册好个人gitee账号安装好IDEA的相关gitee插件或者安装Git Bash软件…

C语言:二分查找查找有序数组中的元素

前言 在我们学习C语言的过程中&#xff0c;如果要查找一个数组当中是否存在某一个元素&#xff0c;我们可能会遍历整个数组&#xff0c;来依次判断是否存在这个函数&#xff0c;但这么做是效率极低的&#xff0c;如果数组中有很多个元素&#xff0c;那么我们要查找半天 二分查…

【CASS精品教程】CASS11计算城镇建筑密度

CASS中可以很方便计算建筑密度。 文章目录 一、建筑密度介绍二、CASS计算建筑密度1. 绘制宗地范围2. 绘制建筑物3. 计算建筑密度三、注意事项一、建筑密度介绍 建筑密度(building density;building coverage ratio),指在一定范围内,建筑物的基底面积总和与占用地面积的比…

CTFshow web入门web128-php特性31

开启环境: 一个新的姿势&#xff0c;当php扩展目录下有php_gettext.dll时&#xff1a; _()是一个函数。 _()gettext() 是gettext()的拓展函数&#xff0c;开启text扩展get_defined_vars — 返回由所有已定义变量所组成的数组。 call_user_func — 把第一个参数作为回调函数调…

JAVAEE初阶相关内容第二十弹--HTTP协议

写在前&#xff1a;2024年啦&#xff01;新的一年要努力学习啦 本篇博客围绕HTTP协议&#xff0c;对HTTP协议进行了解&#xff0c;需要理解其工作过程&#xff0c;对HTTP协议格式要清楚&#xff0c;通过抓包工具进行协议分析&#xff0c;认识“方法”、“请求报头”&#xff0c…

阿里云迁移AWS视频点播技术攻坚

文章目录 &#x1f437; 背景&#x1f9a5; 简述&#x1f425; Aws服务&#x1f99c; AWS CloudFormation&#x1f41e; 问题&#x1f409; 落地方案&#x1f989; Aws vs Aliyun&#x1f344; 避坑指南 &#x1f437; 背景 由于AWS整体成本略低于阿里云&#xff0c;公司决定将…

一个项目的上线全过程

营业执照 个体户&#xff08;700执照、2年财务代理 4000&#xff09; 一张一类卡&#xff0c;转卡专用&#xff08;个人卡&#xff09; 120w 45%企业资质&#xff08;个体户&#xff09; 企业微信&#xff08;300元/年、公众号、小程序&#xff09; 相关手续 备案域名去申请支付…