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

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

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 版开始,可以把临时文件和缓存放在不同的文件系统上。但要注意的是,在这种情况下,文件会在两个文件系统之间复制,而不是进行简单的重命名操作。因此,建议在任何给定位置都将缓存和临时文件目录放在同一个文件系统中。临时文件的目录是根据 use_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可以选择是否要把旧缓存数据返回给客户端。

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_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.2 proxy_read_timeout 接收响应超时

Syntax:    proxy_read_timeout time;
Default:    proxy_read_timeout 60s;
Context:    http, server, location

        设置接收代理服务器响应的超时时间。这个超时并不是接收一个响应的用时时间,而是两次连续接收响应(read操作)的最大间隔时间。当接收完一个响应后,如果在proxy_read_timeout指定时间内未接收到第二次响应,Nginx将关闭该连接。

4.3 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 

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

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.

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.

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

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.

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.

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.

6.5 proxy_ssl_crl 

Syntax:    proxy_ssl_crl file;
Default:    —
Context:    http, server, location
This directive appeared in version 1.7.0.

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.

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.

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.

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.

6.10 proxy_ssl_session_reuse 

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

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.

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.

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.

7. proxy_method 代理请求方法

Syntax:    proxy_method method;
Default:    —
Context:    http, server, location

        指定转发到代理服务器的请求要使用的HTTP方法(GET/POST/DELETE/UPDATE),而不使用客户端请求中的方法。如果不指定,代理请求方法与客户端的请求方法保持一致。

8. 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;

9. proxy_ignore_headers 

Syntax:    proxy_ignore_headers field ...;
Default:    —
Context:    http, server, location

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

11. proxy_temp_file_write_size 

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

12. proxy_cookie 

12.1 proxy_cookie_domain  

Syntax:    proxy_cookie_flags off | cookie [flag ...];
Default:    proxy_cookie_flags off;
Context:    http, server, location
This directive appeared in version 1.19.3.

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

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

13. proxy_force_ranges 

Syntax:    proxy_force_ranges on | off;
Default:    proxy_force_ranges off;
Context:    http, server, location
This directive appeared in version 1.7.7.

14. proxy_headers_hash_bucket_size  

Syntax:    proxy_headers_hash_bucket_size size;
Default:    proxy_headers_hash_bucket_size 64;
Context:    http, server, location

15. proxy_headers_hash_max_size 

Syntax:    proxy_headers_hash_max_size size;
Default:    proxy_headers_hash_max_size 512;
Context:    http, server, location

16. proxy_ignore_client_abort 

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

17. proxy_intercept_errors 

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

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_socket_keepalive 

Syntax:    proxy_socket_keepalive on | off;
Default:    proxy_socket_keepalive off;
Context:    http, server, location
This directive appeared in version 1.15.6.

20. proxy_store 

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

21. proxy_store_access 

Syntax:    proxy_store_access users:permissions ...;
Default:    proxy_store_access user:rw;
Context:    http, server, location

22. proxy_max_temp_file_size 

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

23. proxy_temp_path 临时文件目录

Syntax:    proxy_temp_path path [level1 [level2 [level3]]];
Default:    proxy_temp_path proxy_temp;
Context:    http, server, location

你可能感兴趣的:(nginx,反向代理,proxy,nginx)