diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b48d6b4..4231352 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,8 +15,8 @@ $ git remote add source git@github.com:DocsHome/nginx-docs.git ```bash $ git add . -$ git commit -a "Fix issue #1: change helo to hello" -$ git push origin/master +$ git commit -am "Fix issue #1: change helo to hello" +$ git push origin master ``` * 在 GitHub 上提交 `pull request`。 diff --git a/README.md b/README.md index 7688d2b..e9e81e6 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,7 @@ -# Nginx 中文文档 - -[![GitHub stars](https://img.shields.io/github/stars/DocsHome/nginx-docs.svg?style=social&label=Stars)](https://github.com/DocsHome/nginx-docs) [![GitHub pull requests](https://img.shields.io/github/issues-pr/DocsHome/nginx-docs.svg)](https://github.com/DocsHome/nginx-docs) [![GitHub last commit](https://img.shields.io/github/last-commit/DocsHome/nginx-docs.svg)](https://github.com/DocsHome/nginx-docs) - -![Nginx logo](https://nginx.org/nginx.png) +
+ Nginx +

Nginx 中文文档

+
Nginx 官方文档中文翻译版,由本人在学习 nginx 时顺带翻译。因部分章节涉及到 Nginx Plus 或者其他内容,我将忽略该部分章节的内容。 @@ -34,6 +33,14 @@ gitbook install gitbook serve ``` +**生成 HTML 文件,存放在 `_book` 目录下** + +``` +gitbook build +``` + +更多操作命令,请参照 GitBook 命令。 + ## 项目状态 翻译中…… diff --git a/SUMMARY.md b/SUMMARY.md index 99d374e..3ddb327 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -87,14 +87,14 @@ - [ngx_http_upstream_conf_module](模块参考/http/ngx_http_upstream_conf_module.md) - [ngx_http_upstream_hc_module](模块参考/http/ngx_http_upstream_hc_module.md) - [ngx_http_userid_module](模块参考/http/ngx_http_userid_module.md) - - ngx_http_uwsgi_module - - ngx_http_v2_module - - ngx_http_xslt_module + - [ngx_http_uwsgi_module](模块参考/http/ngx_http_uwsgi_module.md) + - [ngx_http_v2_module](模块参考/http/ngx_http_v2_module.md) + - [ngx_http_xslt_module](模块参考/http/ngx_http_xslt_module.md) - Mail - - ngx_mail_core_module - - ngx_mail_auth_http_module - - ngx_mail_proxy_module - - ngx_mail_ssl_module + - [ngx_mail_core_module](模块参考/mail/ngx_mail_core_module.md) + - [ngx_mail_auth_http_module](模块参考/mail/ngx_mail_auth_http_module.md) + - [ngx_mail_proxy_module](模块参考/mail/ngx_mail_proxy_module.md) + - [ngx_mail_ssl_module](模块参考/mail/ngx_mail_ssl_module.md) - [ngx_mail_imap_module](模块参考/mail/ngx_mail_imap_module.md) - [ngx_mail_pop3_module](模块参考/mail/ngx_mail_pop3_module.md) - [ngx_mail_smtp_module](模块参考/mail/ngx_mail_smtp_module.md) @@ -104,17 +104,17 @@ - [ngx_stream_geo_module](模块参考/stream/ngx_stream_geo_module.md) - [ngx_stream_geoip_module](模块参考/stream/ngx_stream_geoip_module.md) - [ngx_stream_js_module](模块参考/stream/ngx_stream_js_module.md) - - ngx_stream_keyval_module + - [ngx_stream_keyval_module](模块参考/stream/ngx_stream_keyval_module.md) - [ngx_stream_limit_conn_module](模块参考/stream/ngx_stream_limit_conn_module.md) - [ngx_stream_log_module](模块参考/stream/ngx_stream_log_module.md) - ngx_stream_map_module - - ngx_stream_proxy_module + - [ngx_stream_proxy_module](模块参考/stream/ngx_stream_proxy_module.md) - [ngx_stream_realip_module](模块参考/stream/ngx_stream_realip_module.md) - [ngx_stream_return_module](模块参考/stream/ngx_stream_return_module.md) - [ngx_stream_split_clients_module](模块参考/stream/ngx_stream_split_clients_module.md) - ngx_stream_ssl_module - [ngx_stream_ssl_preread_module](模块参考/stream/ngx_stream_ssl_preread_module.md) - - ngx_stream_upstream_module + - [ngx_stream_upstream_module](模块参考/stream/ngx_stream_upstream_module.md) - ngx_stream_upstream_hc_module - ngx_stream_zone_sync_module - 其他 diff --git a/book.json b/book.json index cc0e0e1..d8b00c4 100644 --- a/book.json +++ b/book.json @@ -1,5 +1,5 @@ { - "title": "Nginx 文档中文译版", + "title": "Nginx中文文档", "author": "DocsHome", "language": "zh-hans", "links": { @@ -15,19 +15,26 @@ "favicon" ], "pluginsConfig": { + "github": { + "url": "https://github.com/DocsHome/nginx-docs" + }, "prism": { "css": [ "prismjs/themes/prism-solarizedlight.css" ] }, - "favicon": { - "shortcut": "favicon.ico", - "bookmark": "favicon.ico", - "appleTouch": "favicon.ico", - "appleTouchMore": { - "120x120": "favicon.ico", - "180x180": "favicon.ico" - } + "tbfed-pagefooter": { + "copyright": "Copyright © Oopsguy.com 2017", + "modify_label": "最后更新时间:", + "modify_format": "YYYY-MM-DD HH:mm:ss" + }, + "github-buttons": { + "repo": "DocsHome/nginx-docs", + "types": [ + "star", + "watch" + ], + "size": "small" } } } diff --git "a/\346\250\241\345\235\227\345\217\202\350\200\203/http/ngx_http_secure_link_module.md" "b/\346\250\241\345\235\227\345\217\202\350\200\203/http/ngx_http_secure_link_module.md" index 6b27e9e..07cd371 100644 --- "a/\346\250\241\345\235\227\345\217\202\350\200\203/http/ngx_http_secure_link_module.md" +++ "b/\346\250\241\345\235\227\345\217\202\350\200\203/http/ngx_http_secure_link_module.md" @@ -1,4 +1,4 @@ -# ngx_http_scgi_module +# ngx_http_secure_link_module - [指令](#directives) - [secure_link](#secure_link) diff --git "a/\346\250\241\345\235\227\345\217\202\350\200\203/http/ngx_http_upstream_module.md" "b/\346\250\241\345\235\227\345\217\202\350\200\203/http/ngx_http_upstream_module.md" index 7a23c35..df6b97a 100644 --- "a/\346\250\241\345\235\227\345\217\202\350\200\203/http/ngx_http_upstream_module.md" +++ "b/\346\250\241\345\235\227\345\217\202\350\200\203/http/ngx_http_upstream_module.md" @@ -18,9 +18,9 @@ - [random](#random) - [sticky](#sticky) - [sticky_cookie_insert](#sticky_cookie_insert) -- [内嵌变量](#embedded_variables) +- [内部变量](#embedded_variables) -`ngx_http_upstream_module` 模块用于定义可被 [proxy_pass](ngx_http_proxy_module.md#proxy_pass)、[fastcgi_pass](ngx_http_fastcgi_module.md#fastcgi_pass),[uwsgi_pass](ngx_http_uwsgi_module.md#uwsgi_pass),[scgi_pass](ngx_http_scgi_module.md#scgi_pass),[memcached_pass](ngx_http_memcached_module.md#memcached_pass) 和 [grpc_pass](ngx_http_grpc_module.md#grpc_pass) 指令引用的服务器组。 +`ngx_http_upstream_module` 模块用于定义可被 [proxy_pass](ngx_http_proxy_module.md#proxy_pass)、[fastcgi_pass](ngx_http_fastcgi_module.md#fastcgi_pass)、[uwsgi_pass](ngx_http_uwsgi_module.md#uwsgi_pass)、[scgi_pass](ngx_http_scgi_module.md#scgi_pass)、[memcached_pass](ngx_http_memcached_module.md#memcached_pass) 和 [grpc_pass](ngx_http_grpc_module.md#grpc_pass) 指令引用的服务器组。 @@ -43,7 +43,7 @@ server { } ``` -动态可配置组定期[健康检查](ngx_http_upstream_hc_module.md)作为我们[商业订阅](http://nginx.com/products/?_ga=2.192708585.259929927.1564163363-1186072494.1564163363)的一部分: +动态可配置组定期[健康检查](ngx_http_upstream_hc_module.md)为[商业订阅](http://nginx.com/products/?_ga=2.192708585.259929927.1564163363-1186072494.1564163363)部分: ```nginx resolver 10.0.0.1; @@ -81,7 +81,7 @@ server { |**默认**|——| |**上下文**|http| -定义一组服务器。服务器可以监听不同的端口。此外,可以混合侦听 TCP 和 UNIX 域套接字。 +定义一组服务器。服务器可以监听不同的端口。此外,可以混合监听 TCP 和 UNIX 域套接字。 例如: @@ -95,7 +95,7 @@ upstream backend { } ``` -默认情况下,使用加权轮询均衡算法在服务器间分配请求。在上面的示例中,每 7 个请求将按如下方式分发:5 个请求转到 `backend1.example.com`,另外 2 个请求分别转发给第二个和第三个服务器。如果在与服务器通信期间发生错误,请求将被传递到下一个服务器,依此类推,直到尝试完所有正常运行的服务器。如果无法从这些服务器中获得成功响应,则客户端将接收到与最后一个服务器的通信结果。 +默认情况下,使用加权轮询均衡算法在服务器间分配请求。在上面的示例中,每 7 个请求将按如下方式分发:5 个请求转到 `backend1.example.com`,另外 2 个请求分别转发给第二个和第三个服务器。如果在与服务器通信期间发生错误,请求将被传递到下一个服务器,依此类推,直到尝试完所有正常的服务器。如果无法从这些服务器中获得成功响应,则客户端将接收到与最后一个服务器的通信结果。 ### server @@ -115,36 +115,38 @@ upstream backend { - `max_conns=number` - 限制与代理服务器的最大并发活动连接数(`number`)(1.11.5)。默认值为零,表示没有限制。如果服务器组不驻留在[共享内存](ngx_http_upstream_module.md#zone)中,则每个工作进程的限制都有效。 + 限制与被代理服务器的最大并发活动连接数(`number`)(1.11.5)。默认值为零,表示没有限制。如果服务器组不驻留在[共享内存](ngx_http_upstream_module.md#zone)中,则每个worker 进程的限制都有效。 - > 如果启用了[空闲 keepalive](ngx_http_upstream_module.md#keepalive) 连接、多个[工作进程](../核心功能.md#worker_processes)和[共享内存](ngx_http_upstream_module.md#zone),则代理服务器的活动和空闲连接总数可能会超过 `max_conns` 的值。 + > 如果启用了[空闲 keepalive](ngx_http_upstream_module.md#keepalive) 连接、多个 [worker 进程](../核心功能.md#worker_processes)和[共享内存](ngx_http_upstream_module.md#zone),则被代理服务器的活动和空闲连接总数可能会超过 `max_conns` 的值。 - > 自 1.5.9 版本至 1.11.5 版本之前,此参数为我们的[商业订阅](http://nginx.com/products/?_ga=2.268156877.259929927.1564163363-1186072494.1564163363)的一部分提供。 + > 自 1.5.9 版本至 1.11.5 版本之前,此参数为[商业订阅](http://nginx.com/products/?_ga=2.268156877.259929927.1564163363-1186072494.1564163363)部分。 - `max_fails=number` - 设置在 `fail_timeout` 参数设置的时间内发生与服务器通信的失败重试最大次数,以考虑服务器在 `fail_timeout` 参数设置的时间内不可用。默认情况下,失败重试次数设置为 1。零值则禁止重试计数。被认为是失败的尝试由 [proxy_next_upstream](ngx_http_proxy_module.md#proxy_next_upstream)、[fastcgi_next_upstream](ngx_http_fastcgi_module.md#fastcgi_next_upstream)、[uwsgi_next_upstream](ngx_http_uwsgi_module.md#uwsgi_next_upstream)、[scgi_next_upstream](ngx_http_scgi_module.md#scgi_next_upstream)、[memcached_next_upstream](ngx_http_memcached_module.md#memcached_next_upstream) 和 [grpc_next_upstream](ngx_http_grpc_module.md#grpc_next_upstream) 指令定义。 + 设置在 `fail_timeout` 参数设置的时间内发生与服务器通信的失败重试最大次数,以考虑服务器在 `fail_timeout` 参数设置的时间内不可用。默认情况下,失败尝试次数设置为 1。零值则禁止重试计数。失败尝试由 [proxy_next_upstream](ngx_http_proxy_module.md#proxy_next_upstream)、[fastcgi_next_upstream](ngx_http_fastcgi_module.md#fastcgi_next_upstream)、[uwsgi_next_upstream](ngx_http_uwsgi_module.md#uwsgi_next_upstream)、[scgi_next_upstream](ngx_http_scgi_module.md#scgi_next_upstream)、[memcached_next_upstream](ngx_http_memcached_module.md#memcached_next_upstream) 和 [grpc_next_upstream](ngx_http_grpc_module.md#grpc_next_upstream) 指令定义。 - `fail_timeout=time` - - 考虑服务器不可用的情况,为最大失败重试次数设置时间范围 - - 设置服务器被视为不可用的时间段。 + 设置 + + - 在时间范围内与服务器通信的失败尝试达到指定次数,应将服务器视为不可用 + - 服务器被视为不可用的时长 默认情况下,参数设置为 10 秒。 - `backup` - 将服务器标记为备份服务器。当主服务器不可用时,它将接收请求。 + 将服务器标记为备用服务器。当主服务器不可用时,它将接收请求。 - `down` 将服务器标记为永久不可用。 -此外,以下参数为商业订阅部分: +此外,以下参数为[商业订阅](http://nginx.com/products/?_ga=2.99512918.99786210.1588592638-1615340879.1588592638)部分: - `resolve` - 监控与服务器域名对应的 IP 地址的变更,并自动修改上游配置,无需重新启动 nginx(1.5.12)。服务器组必须驻留在[共享内存](ngx_http_upstream_module.md#zone)中。 + 监控与服务器域名对应的 IP 地址的变更,并自动修改 upstream 配置,无需重新启动 nginx(1.5.12)。服务器组必须驻留在[共享内存](ngx_http_upstream_module.md#zone)中。 要使此参数起作用,必须在 [http](ngx_http_core_module.md#http) 块中指定 [resolver](ngx_http_core_module.md#resolver) 指令: @@ -206,7 +208,7 @@ upstream backend { |**上下文**|upstream| |**提示**|该指令在 1.9.0 版本中出现| -定义共享内存区域的名称(`name`)和大小(`size`),该区域在工作进程之间共享组配置和运行时状态。几个组可能共享同一个区域。在这种情况下,仅需指定一次大小(`size`)即可。 +定义共享内存区域的名称(`name`)和大小(`size`),该区域在 wo'r'kr之间共享组配置和运行时状态。几个组可能共享同一个区域。在这种情况下,仅需指定一次大小(`size`)即可。 此外,作为[商业订阅](http://nginx.com/products/?_ga=2.242046977.2090741542.1564472262-1186072494.1564163363)部分,此类组允许更改组成员身份或修改特定服务器的设置,无需重新启动 nginx。 可以通过 [API](ngx_http_api_module.md) 模块(1.13.3)访问配置。 @@ -230,7 +232,7 @@ state /var/lib/nginx/state/servers.conf; # path for Linux state /var/db/nginx/state/servers.conf; # path for FreeBSD ``` -该状态目前仅限于有参数的服务器列表。解析配置时会读取文件,每次[更改](ngx_http_api_module.md#http_upstreams_http_upstream_name_servers_)上游配置时都会更新该文件。应避免直接更改文件内容。该指令不能与 [server](ngx_http_upstream_module.md#server) 指令一起使用。 +该状态目前仅限于有参数的服务器列表。解析配置时会读取文件,每次[更改](ngx_http_api_module.md#http_upstreams_http_upstream_name_servers_) upstream 配置时都会更新该文件。应避免直接更改文件内容。该指令不能与 [server](ngx_http_upstream_module.md#server) 指令一起使用。 > [配置重新加载](../../介绍/控制nginx.md#reconfiguration)或[二进制升级](../../介绍/控制nginx.md#upgrade)期间所做的更改可能会丢失。 @@ -287,13 +289,13 @@ upstream backend { |**上下文**|upstream| |**提示**|该指令在 1.1.4 版本中出现| -激活缓存以连接到上游(upstream)服务器。 +激活缓存以连接到 upstream 服务器。 -`connections` 参数设置在每个工作进程(worker)的缓存中保留的上游服务器的最大空闲 keepalive 连接数。超过此数量时,将关闭最近最少使用的连接。 +`connections` 参数设置在每个 worker(worker)的缓存中保留的 upstream 服务器的最大空闲 keepalive 连接数。超过此数量时,将关闭最近最少使用的连接。 -> 需要特别注意的是,`keepalive` 指令不限制 nginx 工作进程可以打开的上游服务器的连接总数。`connections` 参数应设置为足够小的数字,以便上游服务器也可以处理新的传入连接。 +> 需要特别注意的是,`keepalive` 指令不限制 nginx worker 进程可以打开的 upstream 服务器的连接总数。`connections` 参数应设置为足够小的数字,以便 upstream 服务器也可以处理新的传入连接。 -使用 keepalive 连接的 memcached 上游示例配置: +使用 keepalive 连接的 memcached upstream 示例配置: ```nginx upstream memcached_backend { @@ -335,7 +337,7 @@ server { } ``` -> 或者,可以通过将 **Connection: Keep-Alive** header 字段传递给上游服务器来使用 HTTP/1.0 持久连接,但不建议使用此方法。 +> 或者,可以通过将 **Connection: Keep-Alive** header 字段传递给 upstream 服务器来使用 HTTP/1.0 持久连接,但不建议使用此方法。 对于 FastCGI 服务器,需要设置 [fastcgi_keep_conn](ngx_http_fastcgi_module.md#fastcgi_keep_conn) 才能使 keepalive 连接正常工作: @@ -370,7 +372,7 @@ server { |**上下文**|upstream| |**提示**|该指令在 1.15.3 版本中出现| -设置可通过一个 keepalive 连接提供的最大请求数。在发出最大请求数后,将关闭连接。 +设置可通过一个 keepalive 连接提供的最大请求数。在达到最大请求数后,连接将关闭。 ### keepalive_timeout @@ -381,7 +383,7 @@ server { |**上下文**|upstream| |**提示**|该指令在 1.15.3 版本中出现| -设置超时时间,在此期间与上游服务器的空闲 keepalive 连接将保持打开状态。 +设置超时时间,在此期间与 upstream 服务器的空闲 keepalive 连接将保持打开状态。 ### ntlm @@ -392,9 +394,9 @@ server { |**上下文**|upstream| |**提示**|该指令在 1.9.2 版本中出现| -允许使用 [NTLM 身份验证](https://en.wikipedia.org/wiki/Integrated_Windows_Authentication)代理请求。一旦客户端发送有以 `Negotiate` 或 `NTLM` 开头的 `Authorization` header 字段值的请求,上游连接将绑定到客户端连接。之后的客户端请求将通过相同的上游连接进行代理,从而保持身份验证上下文。 +允许使用 [NTLM 身份验证](https://en.wikipedia.org/wiki/Integrated_Windows_Authentication)代理请求。一旦客户端发送有以 `Negotiate` 或 `NTLM` 开头的 `Authorization` header 字段值的请求,upstream 连接将绑定到客户端连接。之后的客户端请求将通过相同的 upstream 连接进行代理,从而保持身份验证上下文。 -为了使 NTLM 身份验证生效,必须启用与上游服务器的 keepalive 连接。[proxy_http_version](ngx_http_proxy_module.md#proxy_http_version) 指令应设置为 `1.1`,并且应清除 **Connection** header 字段: +为了使 NTLM 身份验证生效,必须启用与 upstream 服务器的 keepalive 连接。[proxy_http_version](ngx_http_proxy_module.md#proxy_http_version) 指令应设置为 `1.1`,并且应清除 **Connection** header 字段: ```nginx upstream http_backend { @@ -456,7 +458,7 @@ server { |**上下文**|upstream| |**提示**|该指令在 1.5.12 版本中出现| -如果在处理请求时无法立即选择上游服务器,则请求将被放在队列中。该指令指定可以同时在队列中的最大请求数(`number`)。如果队列已满,或者在超时参数(`timeout`)指定的时间段内无法选择要传递请求的服务器,则会将 **502 (Bad Gateway)** 错误返回给客户端。 +如果在处理请求时无法立即选择 upstream 服务器,则请求将被放在队列中。该指令指定可以同时在队列中的最大请求数(`number`)。如果队列已满,或者在超时参数(`timeout`)指定的时间段内无法选择要传递请求的服务器,则会将 **502 (Bad Gateway)** 错误返回给客户端。 `timeout` 参数的默认值为 60 秒。 @@ -546,7 +548,7 @@ server { - `route` - 使用 `route` 方法时,代理服务器在收到第一个请求时为客户端分配路由。来自此客户端的所有后续请求将在 cookie 或 URI 中携带路由信息。此信息将与 [server](ngx_http_upstream_module.md#server) 指令的 `route` 参数进行比较,以标识应将请求代理到哪个服务器。如果未指定 `route` 参数,则路由名称将是 IP 地址和端口的 MD5 哈希值或 UNIX 域套接字路径的十六进制表示形式。如果指定的服务器无法处理请求,则使用配置的均衡策略选择新服务器,与请求中没有路由信息的情况处理方式一样。 + 使用 `route` 方法时,被代理服务器在收到第一个请求时为客户端分配路由。来自此客户端的所有后续请求将在 cookie 或 URI 中携带路由信息。此信息将与 [server](ngx_http_upstream_module.md#server) 指令的 `route` 参数进行比较,以标识应将请求代理到哪个服务器。如果未指定 `route` 参数,则路由名称将是 IP 地址和端口的 MD5 哈希值或 UNIX 域套接字路径的十六进制表示形式。如果指定的服务器无法处理请求,则使用配置的均衡策略选择新服务器,与请求中没有路由信息的情况处理方式一样。 `route` 方法的参数指定可能包含路由信息的变量。第一个非空变量用于查找匹配服务器。 @@ -573,7 +575,7 @@ server { - `learn` - 当使用 `learn` 方法(1.7.1)时,nginx 会分析上游服务器响应并了解经常在 HTTP cookie 中传递的服务器会话。 + 当使用 `learn` 方法(1.7.1)时,nginx 会分析 upstream 服务器响应并了解经常在 HTTP cookie 中传递的服务器会话。 ```nginx upstream backend { @@ -587,17 +589,17 @@ server { } ``` - 在该示例中,上游服务器通过在响应中设置 cookie `EXAMPLECOOKIE` 来创建会话。使用此 cookie 的其他请求将传递到同一服务器。如果服务器无法处理请求,则选择新服务器,与客户端尚未绑定特定服务器的情况一样。 + 在该示例中, upstream 服务器通过在响应中设置 cookie `EXAMPLECOOKIE` 来创建会话。使用此 cookie 的其他请求将传递到同一服务器。如果服务器无法处理请求,则选择新服务器,与客户端尚未绑定特定服务器的情况一样。 参数 `create` 和 `lookup` 分别指示如何创建新会话和搜索现有会话的变量。两个参数可以多次指定,在这种情况下使用第一个非空变量。 会话存储在共享内存区域中,其名称(`name`)和大小(`size`)由 `zone` 参数配置。一兆字节区域可以在 64 位平台上存储大约 4000 个会话。在 `timeout` 参数指定的时间内未访问的会话将从区域中删除。默认情况下,超时时间设置为 10 分钟。 - `header` 参数(1.13.1)允许在从上游服务器接收响应头之后立即创建会话。 + `header` 参数(1.13.1)允许在从 upstream 服务器接收响应头之后立即创建会话。 `sync` 参数(1.13.8)启用共享内存区域[同步](../stream/ngx_stream_zone_sync_module.md#zone_sync)。 - > 该指令作为[商业订阅](http://nginx.com/products/?_ga=2.25871412.860729840.1564753618-1186072494.1564163363)部分提供。 +> 该指令作为[商业订阅](http://nginx.com/products/?_ga=2.25871412.860729840.1564753618-1186072494.1564163363)部分提供。 ### sticky_cookie_insert @@ -607,7 +609,7 @@ server { |**默认**|——| |**上下文**|upstream| -从 1.5.7 版本开始,该指令已过时。应使用有新语法的 [sticky](ngx_http_upstream_module.md#sticky) 指令: +从 1.5.7 版本开始,该指令已过时。应使用新的 [sticky](ngx_http_upstream_module.md#sticky) 指令代替: ``` sticky cookie name [expires=time] [domain=domain] [path=path]; @@ -615,23 +617,23 @@ sticky cookie name [expires=time] [domain=domain] [path=path]; -## 内嵌变量 +## 内部变量 -`ngx_http_upstream_module` 模块支持以下内嵌变量: +`ngx_http_upstream_module` 模块支持以下内部变量: - `$upstream_addr` - 保存 IP 地址和端口,或上游服务器的 UNIX 域套接字的路径。如果在请求处理期间接触了多个服务器,则它们的地址用逗号分隔,例如 `192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock`。如果从一个服务器组到另一个服务器组的内部发生重定向,由 `X-Accel-Redirect` 或 `error_page` 发起,则来自不同组的服务器地址由冒号分隔,例如 `192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock : 192.168.10.1:80, 192.168.10.2:80`。 如果无法选择服务器,则变量将保留服务器组的名称。 + 保存 IP 地址和端口,或 upstream 服务器的 UNIX 域套接字的路径。如果在请求处理期间接触了多个服务器,则它们的地址用逗号分隔,例如 `192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock`。如果从一个服务器组到另一个服务器组的内部发生重定向,由 `X-Accel-Redirect` 或 `error_page` 发起,则来自不同组的服务器地址由冒号分隔,例如 `192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock : 192.168.10.1:80, 192.168.10.2:80`。 如果无法选择服务器,则变量将保留服务器组的名称。 - `$upstream_bytes_received` - 从上游服务器(1.11.4)接收的字节数。来自多个连接的值由逗号和冒号分隔,如 [$upstream_addr](#upstream_addr) 变量中的地址格式。 + 从 upstream 服务器(1.11.4)接收的字节数。来自多个连接的值由逗号和冒号分隔,参考 [$upstream_addr](#upstream_addr) 变量中的地址格式。 - `$upstream_bytes_sent` - 发送到上游服务器的字节数(1.15.8)。来自多个连接的值由逗号和冒号分隔,如 [$upstream_addr](#upstream_addr) 变量中的地址格式。 + 发送到 upstream 服务器的字节数(1.15.8)。来自多个连接的值由逗号和冒号分隔,参考 [$upstream_addr](#upstream_addr) 变量中的地址格式。 - `$upstream_cache_status` @@ -639,15 +641,15 @@ sticky cookie name [expires=time] [domain=domain] [path=path]; - `$upstream_connect_time` - 保存与上游服务器建立连接所花费的时间(1.9.1),时间以秒为单位,精度为毫秒。在 SSL 的情况下,包含握手时间。多个连接的时间用逗号和冒号分隔,如 [$upstream_addr](#upstream_addr) 变量中的地址格式。 + 保存与 upstream 服务器建立连接所花费的时间(1.9.1),时间以秒为单位,精度为毫秒。在 SSL 的情况下,包含握手时间。多个连接的时间用逗号和冒号分隔,参考 [$upstream_addr](#upstream_addr) 变量中的地址格式。 - `$upstream_cookie_name` - 上游服务器在 `Set-Cookie` 响应头字段(1.7.1)中发送的有指定名称的 cookie。仅保存最后一台服务器响应中的 cookie。 + upstream 服务器在 `Set-Cookie` 响应头字段(1.7.1)中发送的有指定名称的 cookie。仅保存最后一台服务器响应中的 cookie。 - `$upstream_header_time` - 保存从上游服务器接收响应头所花费的时间(1.7.10),时间以秒为单位,精度为毫秒。多个响应的时间用逗号和冒号分隔,如[$upstream_addr](#upstream_addr) 变量中的地址格式。 + 保存从 upstream 服务器接收响应头所花费的时间(1.7.10),时间以秒为单位,精度为毫秒。多个响应的时间用逗号和冒号分隔,参考 [$upstream_addr](#upstream_addr) 变量中的地址格式。 - `$upstream_http_name` @@ -655,23 +657,23 @@ sticky cookie name [expires=time] [domain=domain] [path=path]; - `$upstream_queue_time` - 保存请求在上游队列中花费的时间(1.13.9),时间以秒为单位,精度为毫秒。多个响应的时间用逗号和冒号分隔,如 [$upstream_addr](#upstream_addr) 变量中的地址格式。 + 保存请求在 upstream 队列中花费的时间(1.13.9),时间以秒为单位,精度为毫秒。多个响应的时间用逗号和冒号分隔,参考 [$upstream_addr](#upstream_addr) 变量中的地址格式。 - `$upstream_response_length` - 保存从上游服务器获得的响应长度(0.7.27),长度以字节为单位。多个响应的长度用逗号和冒号分隔,如 [$upstream_addr](#upstream_addr) 变量中的地址格式。 + 保存从 upstream 服务器获得的响应长度(0.7.27),长度以字节为单位。多个响应的长度用逗号和冒号分隔,参考 [$upstream_addr](#upstream_addr) 变量中的地址格式。 - `$upstream_response_time` - 保存从上游服务器接收响应所花费的时间,时间以秒为单位,精度为毫秒。多个响应的时间用逗号和冒号分隔,如 [$upstream_addr](#upstream_addr) 变量中的地址格式。 + 保存从 upstream 服务器接收响应所花费的时间,时间以秒为单位,精度为毫秒。多个响应的时间用逗号和冒号分隔,参考 [$upstream_addr](#upstream_addr) 变量中的地址格式。 - `$upstream_status` - 保存从上游服务器获得的响应的状态代码。多个响应的状态代码用逗号和冒号分隔,如 [$upstream_addr](#upstream_addr) 变量中的地址格式。如果没有服务器被选中,该变量的值将为 502 (Bad Gateway) 状态码。 + 保存从 upstream 服务器获得的响应的状态代码。多个响应的状态代码用逗号和冒号分隔,如 [$upstream_addr](#upstream_addr) 变量中的地址格式。如果没有服务器被选中,该变量的值将为 502 (Bad Gateway) 状态码。 - `$upstream_trailer_name` - 保存从上游服务器(1.13.10)获得的响应结束时的字段。 + 保存从 upstream 服务器(1.13.10)获得的响应结束时的字段。 ## 原文档 diff --git "a/\346\250\241\345\235\227\345\217\202\350\200\203/http/ngx_http_uwsgi_module.md" "b/\346\250\241\345\235\227\345\217\202\350\200\203/http/ngx_http_uwsgi_module.md" new file mode 100644 index 0000000..24d9456 --- /dev/null +++ "b/\346\250\241\345\235\227\345\217\202\350\200\203/http/ngx_http_uwsgi_module.md" @@ -0,0 +1,997 @@ +# ngx_http_uwsgi_module + +- [示例配置](#example_configuration) +- [指令](#directives) + - [uwsgi_bind](#uwsgi_bind) + - [uwsgi_buffer_size](#uwsgi_buffer_size) + - [uwsgi_buffering](#uwsgi_buffering) + - [uwsgi_buffers](#uwsgi_buffers) + - [uwsgi_busy_buffers_size](#uwsgi_busy_buffers_size) + - [uwsgi_cache](#uwsgi_cache) + - [uwsgi_cache_background_update](#uwsgi_cache_background_update) + - [uwsgi_cache_bypass](#uwsgi_cache_bypass) + - [uwsgi_cache_key](#uwsgi_cache_key) + - [uwsgi_cache_lock](#uwsgi_cache_lock) + - [uwsgi_cache_lock_age](#uwsgi_cache_lock_age) + - [uwsgi_cache_lock_timeout](#uwsgi_cache_lock_timeout) + - [uwsgi_cache_max_range_offset](#uwsgi_cache_max_range_offset) + - [uwsgi_cache_methods](#uwsgi_cache_methods) + - [uwsgi_cache_min_uses](#uwsgi_cache_min_uses) + - [uwsgi_cache_path](#uwsgi_cache_path) + - [uwsgi_cache_purge](#uwsgi_cache_purge) + - [uwsgi_cache_revalidate](#uwsgi_cache_revalidate) + - [uwsgi_cache_use_stale](#uwsgi_cache_use_stale) + - [uwsgi_cache_valid](#uwsgi_cache_valid) + - [uwsgi_connect_timeout](#uwsgi_connect_timeout) + - [uwsgi_force_ranges](#uwsgi_force_ranges) + - [uwsgi_hide_header](#uwsgi_hide_header) + - [uwsgi_ignore_client_abort](#uwsgi_ignore_client_abort) + - [uwsgi_ignore_headers](#uwsgi_ignore_headers) + - [uwsgi_intercept_errors](#uwsgi_intercept_errors) + - [uwsgi_limit_rate](#uwsgi_limit_rate) + - [uwsgi_max_temp_file_size](#uwsgi_max_temp_file_size) + - [uwsgi_modifier1](#uwsgi_modifier1) + - [uwsgi_modifier2](#uwsgi_modifier2) + - [uwsgi_next_upstream](#uwsgi_next_upstream) + - [uwsgi_next_upstream_timeout](#uwsgi_next_upstream_timeout) + - [uwsgi_next_upstream_tries](#uwsgi_next_upstream_tries) + - [uwsgi_no_cache](#uwsgi_no_cache) + - [uwsgi_param](#uwsgi_param) + - [uwsgi_pass](#uwsgi_pass) + - [uwsgi_pass_header](#uwsgi_pass_header) + - [uwsgi_pass_request_body](#uwsgi_pass_request_body) + - [uwsgi_pass_request_headers](#uwsgi_pass_request_headers) + - [uwsgi_read_timeout](#uwsgi_read_timeout) + - [uwsgi_request_buffering](#uwsgi_request_buffering) + - [uwsgi_send_timeout](#uwsgi_send_timeout) + - [uwsgi_socket_keepalive](#uwsgi_socket_keepalive) + - [uwsgi_ssl_certificate](#uwsgi_ssl_certificate) + - [uwsgi_ssl_certificate_key](#uwsgi_ssl_certificate_key) + - [uwsgi_ssl_ciphers](#uwsgi_ssl_ciphers) + - [uwsgi_ssl_crl](#uwsgi_ssl_crl) + - [uwsgi_ssl_name](#uwsgi_ssl_name) + - [uwsgi_ssl_password_file](#uwsgi_ssl_password_file) + - [uwsgi_ssl_protocols](#uwsgi_ssl_protocols) + - [uwsgi_ssl_server_name](#uwsgi_ssl_server_name) + - [uwsgi_ssl_session_reuse](#uwsgi_ssl_session_reuse) + - [uwsgi_ssl_trusted_certificate](#uwsgi_ssl_trusted_certificate) + - [uwsgi_ssl_verify](#uwsgi_ssl_verify) + - [uwsgi_ssl_verify_depth](#uwsgi_ssl_verify_depth) + - [uwsgi_store](#uwsgi_store) + - [uwsgi_store_access](#uwsgi_store_access) + - [uwsgi_temp_file_write_size](#uwsgi_temp_file_write_size) + - [uwsgi_temp_path](#uwsgi_temp_path) + +`ngx_http_uwsgi_module` 模块允许将请求传递到 uwsgi 服务器。 + + + +## 示例配置 + +```nginx +location / { + include uwsgi_params; + uwsgi_pass localhost:9000; +} +``` + + + +## 指令 + +### uwsgi_bind + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_bind** `address [transparent]` | `off`;| +|**默认**|——| +|**上下文**|http、server、location| + +使到 uwsgi 服务器的传出连接源自有一个可选端口(1.11.2)的指定本地 IP 地址。参数值可以包含变量(1.3.12)。特殊值 `off`(1.3.12)取消从先前的配置级别继承的 `uwsgi_bind` 指令的作用,这使系统可以自动分配本地 IP 地址和端口。 + +`transparent` 参数(1.11.0)允许到 uwsgi 服务器的传出连接来自非本地 IP 地址,例如,来自客户端的真实 IP 地址: + +```nginx +uwsgi_bind $remote_addr transparent; +``` + +为了使该参数起作用,通常必须使用[超级用户](../核心功能.md#user)特权运行 nginx 工作进程。在 Linux 上不需要这样做(1.13.8),就像指定了 `transparent` 参数一样,工作进程从主进程继承 `CAP_NET_RAW` 功能。还必须配置内核路由表以拦截来自 uwsgi 服务器的网络流量。 + +### uwsgi_buffer_size + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_buffer_size** `size`;| +|**默认**|uwsgi_buffer_size 4k|8k;| +|**上下文**|http、server、location| + +设置用于读取从 uwsgi 服务器接收到的响应的第一部分的缓冲区的大小(`size`)。这部分通常包含一个小的响应头。默认情况下,缓冲区大小等于一个内存页。根据平台的不同,它可以是 4K 或 8K。但是,它可以更小。 + +### uwsgi_buffering + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_buffering** `on` | `off`;| +|**默认**|uwsgi_buffering on;| +|**上下文**|http、server、location| + +启用或禁用来自 uwsgi 服务器的响应缓冲。 + +启用缓冲后,nginx 会尽快从 uwsgi 服务器收到响应,并将其保存到 [uwsgi_buffer_size](#uwsgi_buffer_size) 和 [uwsgi_buffers](#uwsgi_buffers) 指令设置的缓冲区中。如果整个响应都无法容纳到内存中,则可以将一部分响应保存到磁盘上的临时文件中。写入临时文件由 [uwsgi_max_temp_file_size](#uwsgi_max_temp_file_size) 和 [uwsgi_temp_file_write_size](#uwsgi_temp_file_write_size) 指令控制。 + +禁用缓冲后,一旦收到响应就立即同步传递到客户端。nginx 不会尝试从 uwsgi 服务器读取整个响应。nginx 一次可以从服务器接收的最大数据大小由 [uwsgi_buffer_size](#uwsgi_buffer_size) 指令设置。 + +也可以通过在 `X-Accel-Buffering` 响应头字段中传递 `yes` 或 `no` 来启用或禁用缓冲。可以使用 [uwsgi_ignore_headers](#uwsgi_ignore_headers) 指令禁用此功能。 + +### uwsgi_buffers + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_buffers** `number size`;| +|**默认**|uwsgi_buffers 8 4k|8k;| +|**上下文**|http、server、location| + +为单个连接设置用于从 uwsgi 服务器读取响应的缓冲区的数量和大小。默认情况下,缓冲区大小等于一个内存页。根据平台的不同,它可以是 4K 或 8K。 + +### uwsgi_busy_buffers_size + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_busy_buffers_size** `size`;| +|**默认**|uwsgi_busy_buffers_size 8k|16k;| +|**上下文**|http、server、location| + +当启用来自 uwsgi 服务器的响应[缓冲](#uwsgi_buffering)后,将限制在尚未完全读取响应时正忙于向客户端发送响应的缓冲区的总大小。同时,其余的缓冲区可用于读取响应,并在需要时将响应的一部分缓冲到临时文件中。默认情况下,大小受 [uwsgi_buffer_size](#uwsgi_buffer_size) 和 [uwsgi_buffers](#uwsgi_buffers) 指令设置的两个缓冲区的大小限制。 + +### uwsgi_cache + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_cache** `on` | `off`;| +|**默认**|uwsgi_cache off;| +|**上下文**|http、server、location| + +定义用于缓存的共享内存区域。同一区域可以在多个地方使用。参数值可以包含变量(1.7.9)。`off` 参数禁用从先前配置级别继承的缓存配置。 + +### uwsgi_cache_background_update + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_cache_background_update** `on` | `off`;| +|**默认**|uwsgi_cache_background_update off;| +|**上下文**|http、server、location| +|**提示**|该指令在 1.11.10 版本中出现| + +允许启动后台子请求以更新过期的缓存项,同时将陈旧的缓存响应返回给客户端。请注意,有必要在更新时[允许](#uwsgi_cache_use_stale_updating)使用过期的缓存响应。 + +### uwsgi_cache_bypass + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_cache_bypass** `string ...`;| +|**默认**|——| +|**上下文**|http、server、location| +|**提示**|该指令在 1.11.10 版本中出现| + +定义不从缓存获取响应的条件。如果字符串参数中有一个值不为空且不等于 `0`,则不会从缓存中获取响应: + +```nginx +uwsgi_cache_bypass $cookie_nocache $arg_nocache$arg_comment; +uwsgi_cache_bypass $http_pragma $http_authorization; +``` + +可以与 [uwsgi_no_cache](#uwsgi_no_cache) 指令一起使用。 + +### uwsgi_cache_key + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_cache_key** `string`;| +|**默认**|——| +|**上下文**|http、server、location| + +定义用于缓存的 key,例如 + +```nginx +uwsgi_cache_key localhost:9000$request_uri; +``` + +### uwsgi_cache_lock + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_cache_lock** `on` | `off`;| +|**默认**|uwsgi_cache_lock off;| +|**上下文**|http、server、location| +|**提示**|该指令在 1.1.12 版本中出现| + +启用后,一次仅允许一个请求通过将请求传递给 uwsgi 服务器来填充根据 [uwsgi_cache_key](#uwsgi_cache_key) 指令标识的新缓存元素。在 [uwsgi_cache_lock_timeout](#uwsgi_cache_lock_timeout) 指令设置的时间之前,同一缓存元素的其他请求将等待响应出现在缓存中,或者等待缓存锁定释放该元素。 + +### uwsgi_cache_lock_age + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_cache_lock_age** `time`;| +|**默认**|uwsgi_cache_lock_age 5s;| +|**上下文**|http、server、location| +|**提示**|该指令在 1.7.8 版本中出现| + +如果最后一次传递给 uwsgi 服务器用于填充新缓存元素的请求在指定时间(`time`)内未完成,则可能再有一个请求传递给 uwsgi 服务器。 + +### uwsgi_cache_lock_timeout + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_cache_lock_timeout** `time`;| +|**默认**|uwsgi_cache_lock_timeout 5s;| +|**上下文**|http、server、location| +|**提示**|该指令在 1.1.12 版本中出现| + +为 [uwsgi_cache_lock](#uwsgi_cache_lock) 设置超时时间。时间到时,请求将被传递到 uwsgi 服务器,但响应将不会被缓存。 + +> 在 1.7.8 版本之前,可以缓存响应。 + +### uwsgi_cache_max_range_offset + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_cache_max_range_offset** `number`;| +|**默认**|——| +|**上下文**|http、server、location| +|**提示**|该指令在 1.11.6 版本中出现| + +设置字节范围(byte-range)请求的字节偏移量。如果范围超出偏移量,则范围请求将传递到 uwsgi 服务器,并且不会缓存响应。 + +### uwsgi_cache_methods + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_cache_methods** `GET` | `HEAD` | `POST ...`;| +|**默认**|uwsgi_cache_methods GET HEAD;| +|**上下文**|http、server、location| + +如果此指令中列出了客户端的请求方法,则将缓存响应。建议显式指定 `GET` 和 `HEAD` 方法,虽然它们始终添加在列表中。另请参见 [uwsgi_no_cache](#uwsgi_no_cache) 指令。 + +### uwsgi_cache_min_uses + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_cache_min_uses** `number`;| +|**默认**|uwsgi_cache_min_uses 1;| +|**上下文**|http、server、location| + +设置请求数(`number`),之后将缓存响应。 + +### uwsgi_cache_path + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_cache_path** `path [levels=levels] [use_temp_path=on\|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on\|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time]`;| +|**默认**|——| +|**上下文**|http| + +设置缓存的路径和其他参数。缓存数据存储在文件中。缓存中的文件名是将[缓存 key](#uwsgi_cache_key) 经过 MD5 计算后得到。`levels` 参数定义缓存的层次结构级别:从 1 到 3,每个级别接受值 1 或 2。例如,在以下配置中 + +```nginx +uwsgi_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m; +``` + +缓存中的文件名如下所示: + +``` +/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c +``` + +首先将缓存的响应写入临时文件,然后重命名该文件。从 0.8.9 版本开始,临时文件和缓存可以放在不同的文件系统上。但请注意,在这种情况下,文件跨越了两个文件系统复制,而不是简单的重命名操作。因此,建议对于任何给定位置,将缓存和临时文件保存目录都放在同一文件系统上。基于 `use_temp_path` 参数(1.7.10)设置临时文件的目录,如果省略此参数或将其设置为 `on` 值,则将使用 [uwsgi_temp_path](#uwsgi_temp_path) 指令指定的目录。如果将该值设置为 `off`,则临时文件将直接放置在缓存目录中。 + +此外,所有活跃的 key 和有关数据的信息都存储在共享存储区中,该存储区的 `name` 和 `size` 由 `keys_zone` 参数配置。一个 1 兆字节的区域可以存储大约 8000 个 key。 + +> 作为[商业订阅](http://nginx.com/products/?_ga=2.150468402.507616449.1577517222-1105498734.1571247330)部分,共享内存区域还存储缓存扩展信息,因此,需要为相同数量的 key 指定更大的区域大小。例如,一个 1MB 的区域可以存储大约 4000 个 key。 + +在 `inactive` 参数指定的时间内未访问的缓存数据,无论其新鲜度如何,都将从缓存中删除。默认情况下,`inactive` 设置为 10 分钟。 + +特殊的「缓存管理器」(cache manager)进程监视的最大缓存大小由 `max_size` 参数设置。当超过此大小时,它将删除最近最少使用的数据。在由 `manager_files`、`manager_threshold` 和 `manager_sleep` 参数(1.11.5)配置的迭代中删除数据。在一次迭代中,最多删除 `manager_files` 项(默认为 100)。一次迭代的持续时间受 `manager_threshold` 参数限制(默认情况下为 200 毫秒)。在迭代之间,将执行由 `manager_sleep` 参数配置的间隔时间(默认情况下为 50 毫秒)。 + +启动后一分钟,「缓存加载器」(cache loader)进程被激活。它将有关存储在文件系统上的先前缓存数据的信息加载到缓存区域中。加载也以迭代方式完成。在一次迭代中,最多加载 `loader_files` 项(默认情况下为 100)。此外,一次迭代的持续时间受 `loader_threshold` 参数限制(默认为 200 毫秒)。在迭代之间,将执行由 `loader_sleep` 参数配置的暂停时间(默认为 50 毫秒)。 + +此外,以下参数作为我们的[商业订购部分](http://nginx.com/products/?_ga=2.138998711.507616449.1577517222-1105498734.1571247330): + +- `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 毫秒。 + +> 在 1.7.3、1.7.7 和 1.11.10 版本中,缓存头格式已更改。升级到较新的 nginx 版本后,以前缓存的响应将被视为无效。 + +### uwsgi_cache_purge + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_cache_purge** `string ...`;| +|**默认**|——| +|**上下文**|http、server、location| +|**提示**|该指令在 1.5.7 版本中出现| + +定义将请求视为缓存清除请求的条件。如果字符串参数中有一个值不为空且不等于 `0`,则将删除有相应缓存键的缓存条目。返回 204(No Content)响应指示成功操作的结果。 + +如果清除请求的缓存键以星号(`*`)结尾,则所有与通配符匹配的缓存条目都将从缓存中删除。但是,这些条目将保留在磁盘上,直到因不活跃而将其删除或由缓存清除程序(1.7.12)处理或客户端尝试访问它们为止。 + +配置示例: + +```nginx +uwsgi_cache_path /data/nginx/cache keys_zone=cache_zone:10m; + +map $request_method $purge_method { + PURGE 1; + default 0; +} + +server { + ... + location / { + uwsgi_pass backend; + uwsgi_cache cache_zone; + uwsgi_cache_key $uri; + uwsgi_cache_purge $purge_method; + } +} +``` + +> 此功能是我们的[商业订阅](http://nginx.com/products/?_ga=2.115863554.507616449.1577517222-1105498734.1571247330)的一部分内容。 + +### uwsgi_cache_revalidate + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_cache_revalidate** `on` | `off`;| +|**默认**|uwsgi_cache_revalidate off;| +|**上下文**|http、server、location| +|**提示**|该指令在 1.5.7 版本中出现| + +启用使用带有 `If-Modified-Since` 和 `If-None-Match` 头字段的条件请求重新验证过期缓存项。 + +### uwsgi_cache_use_stale + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_cache_use_stale** `uwsgi_cache_use_stale error \| timeout \| invalid_header \| updating \| http_500 \| http_503 \| http_403 \| http_404 \| http_429 \| off ...`;| +|**默认**|uwsgi_cache_use_stale off;| +|**上下文**|http、server、location| + +确定在与 uwsgi 服务器通信期间发生错误时在什么情况下可以使用过时的缓存响应。该指令的参数与 [uwsgi_next_upstream](#uwsgi_next_upstream) 指令的参数匹配。 + +如果无法选择 uwsgi 服务器来处理请求,则 `error` 参数还允许使用过时的缓存响应。 + +此外,如果当前正在更新 `updating` 参数,则允许使用过时的缓存响应。这样可以在更新缓存的数据时最大程度地减少对 uwsgi 服务器的访问次数。 + +在响应过时(1.11.10)之后,还可以在响应头中直接启用使用过时的缓存响应并指定的秒数。与使用指令参数相比,它的优先级较低。 + +- 如果 `Cache-Control` 头字段的 [stale-while-revalidate](https://tools.ietf.org/html/rfc5861#section-3) 扩展当前正在更新,则允许使用过时的缓存响应。 +- `Cache-Control` 头字段的 [stale-if-error](https://tools.ietf.org/html/rfc5861#section-4) 扩展允许在发生错误的情况下使用过期缓存的响应。 + +为了在填充新的缓存元素时最大程度地减少对 uwsgi 服务器的访问次数,可以使用 [uwsgi_cache_lock](#uwsgi_cache_lock) 指令。 + +### uwsgi_cache_valid + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_cache_valid** `[code ...] time`;| +|**默认**|——| +|**上下文**|http、server、location| + +设置不同响应状态码的缓存时间。例如以下指令: + +```nginx +uwsgi_cache_valid 200 302 10m; +uwsgi_cache_valid 404 1m; +``` + +为状态码为 200 和 302 的响应设置 10 分钟的缓存时长,为状态码为 404 的响应设置 1 分钟缓存时长。 + +如果仅指定缓存时间: + +```nginx +uwsgi_cache_valid 5m; +``` + +那么仅缓存状态码为 200、301 和 302 的响应。 + +另外,可以指定 `any` 参数来缓存任何响应: + +```nginx +uwsgi_cache_valid 200 302 10m; +uwsgi_cache_valid 301 1h; +uwsgi_cache_valid any 1m; +``` + +缓存参数也可以直接在响应头中设置。这比使用指令设置缓存时间具有更高的优先级。 + +- `X-Accel-Expires` 头字段以秒为单位设置响应的缓存时间。零值禁用缓存响应。如果该值以 `@` 前缀开头,则它设置自 Epoch 以来的绝对时间(以秒为单位),直到此时间为止,响应都可以被缓存。 +- 如果头不包括 `X-Accel-Expires` 字段,则可以在头字段 `Expires` 或 `Cache-Control` 中设置缓存参数。 +- 如果头中包含 `Set-Cookie` 字段,则不会缓存此类响应。 +- 如果头包含带有特殊值 `*` 的 `Vary` 字段,则不会缓存此类响应(1.7.7)。如果头包含带有另一个值的 `Vary` 字段,则将考虑使用该请求头字段(1.7.7)来缓存此类响应。 + +可以使用 [uwsgi_ignore_headers](#uwsgi_ignore_headers) 指令禁用对这些响应头字段中的一个或多个的处理。 + +### uwsgi_connect_timeout + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_connect_timeout** `time`;| +|**默认**|uwsgi_connect_timeout 60s;| +|**上下文**|http、server、location| + +定义用于与 uwsgi 服务器建立连接的超时时间。请注意,此超时时间通常不能超过 75 秒。 + +### uwsgi_force_ranges + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_force_ranges** `on` | `off`;| +|**默认**|uwsgi_force_ranges off;| +|**上下文**|http、server、location| +|**提示**|该指令在 1.7.7 版本中出现| + +对来自 uwsgi 服务器的缓存和未缓存响应均启用字节范围(byte-range)支持,忽略这些响应中的 `Accept-Ranges` 字段。 + +### uwsgi_hide_header + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_hide_header** `field`;| +|**默认**|——| +|**上下文**|http、server、location| + +默认情况下,nginx 不会将 uwsgi 服务器的响应中的头字段 `Status` 和 `X-Accel-...` 传递给客户端。`uwsgi_hide_header` 指令设置了不会传递的其他字段。相反,如果需要允许传递字段,则可以使用 [uwsgi_pass_header](#uwsgi_pass_header) 指令。 + +### uwsgi_ignore_client_abort + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_ignore_client_abort** `on` | `off`;| +|**默认**|uwsgi_ignore_client_abort off;| +|**上下文**|http、server、location| + +确定在客户端不等待响应就关闭连接时是否应关闭与 uwsgi 服务器的连接。 + +### uwsgi_ignore_headers + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_ignore_headers** `field ...`;| +|**默认**|——| +|**上下文**|http、server、location| + +禁用来自 uwsgi 服务器的某些响应标头字段的处理。可以忽略以下字段:`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` 设置响应的所需字符集 + +### uwsgi_intercept_errors + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_intercept_errors** `on` | `off`;| +|**默认**|uwsgi_intercept_errors off;| +|**上下文**|http、server、location| + +确定是否应将有大于或等于 300 的状态码的 uwsgi 服务器响应传递给客户端,或者应将其拦截并重定向到 nginx 以使用 [error_page](ngx_http_core_module.md#error_page) 指令进行处理。 + +### uwsgi_limit_rate + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_limit_rate** `rate`;| +|**默认**|uwsgi_limit_rate 0;| +|**上下文**|http、server、location| +|**提示**|该指令在 1.7.7 版本中出现| + +限制从 uwsgi 服务器读取响应的速度。该速率以每秒字节数指定。零值禁用速率限制。该限制是按请求设置的,因此,如果 nginx 同时打开两个与 uwsgi 服务器的连接,则总速率将是指定限制的两倍。仅当启用了来自 uwsgi 服务器的响应[缓冲](#uwsgi_buffering)时,此限制才有效。 + +### uwsgi_max_temp_file_size + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_max_temp_file_size** `size`;| +|**默认**|uwsgi_max_temp_file_size 1024m;| +|**上下文**|http、server、location| + +如果启用了来自 uwsgi 服务器的响应[缓冲](#uwsgi_buffering),并且整个响应不适合 [uwsgi_buffer_size](#uwsgi_buffer_size) 和 [uwsgi_buffers](#uwsgi_buffers) 指令设置的缓冲区,则可以将一部分响应保存到临时文件中。该指令设置临时文件的最大大小。一次写入临时文件的数据大小由 [uwsgi_temp_file_write_size](#uwsgi_temp_file_write_size) 指令设置。 + +零值禁用对临时文件的响应缓冲。 + +> 此限制不适用于将被[缓存](#uwsgi_cache)或[存储](#uwsgi_store)在磁盘上的响应。 + +### uwsgi_modifier1 + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_modifier1** `number`;| +|**默认**|uwsgi_modifier1 0;| +|**上下文**|http、server、location| + +设置 [uwsgi 数据包头](http://uwsgi-docs.readthedocs.org/en/latest/Protocol.html#uwsgi-packet-header)中的 `modify1` 字段的值。 + +### uwsgi_modifier2 + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_modifier2** `number`;| +|**默认**|uwsgi_modifier2 0;| +|**上下文**|http、server、location| + +设置 [uwsgi 数据包头](http://uwsgi-docs.readthedocs.org/en/latest/Protocol.html#uwsgi-packet-header)中的 `modify2` 字段的值。 + +### uwsgi_next_upstream + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_next_upstream** `error \| timeout \| invalid_header \| http_500 \| http_503 \| http_403 \| http_404 \| http_429 \| non_idempotent \| off ...`;| +|**默认**|uwsgi_next_upstream error timeout;| +|**上下文**|http、server、location| + +指定在哪种情况下将请求传递到下一个服务器: + +- `error` + + 与服务器建立连接,向服务器传递请求或读取响应头时发生错误 + +- `timeout` + + 与服务器建立连接,向服务器传递请求或读取响应标头时发生超时 + +- `invalid_header` + + 服务器返回了空的或无效的响应 + +- `http_500` + + 服务器返回状态码为 500 的响应 + +- `http_503` + + 服务器返回响应,状态码为 503 + +- `http_403` + + 服务器返回响应,状态码为 403 + +- `http_404` + + 服务器返回了状态码为 404 的响应 + +- `http_429` + + 服务器返回响应,状态码为 429(1.11.13) + +- `non_idempotent` + + 通常,如果请求已发送到上游服务器,则[非等幂](https://tools.ietf.org/html/rfc7231#section-4.2.2)方法(`POST`、`LOCK`、`PATCH`)的请求不会传递到下一服务器(1.9.13);明确启用此选项将允许重试此类请求 + +- `off` + + 禁止将请求传递到下一个服务器 + +应该记住的是,只有在还没有任何内容发送给客户端的情况下,才有可能将请求传递给下一台服务器。即,如果在响应的传输过程中发生错误或超时,则无法解决该问题。 + +该指令还定义了与服务器通信的一个[失败尝试](ngx_http_upstream_module.md#max_fails)。`error`、`timeout` 和 `invalid_header` 的情况始终被认为是失败尝试,即使未在指令中指定它们也是如此。仅当在指令中指定了 `http_500`、`http_503` 和 `http_429` 的情况时,它们才被认为是失败尝试。永远不会将 `http_403` 和 `http_404` 的情况视为失败尝试。 + +将请求传递到下一台服务器可能受到[尝试次数](#uwsgi_next_upstream_tries)和[时间](#uwsgi_next_upstream_timeout)的限制。 + +### uwsgi_next_upstream_timeout + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_next_upstream_timeout** `time`;| +|**默认**|uwsgi_next_upstream_timeout 0;| +|**上下文**|http、server、location| +|**提示**|该指令在 1.7.5 版本中出现| + +限制将请求传递到[下一个服务器]((#uwsgi_next_upstream))的超时时间。`0` 值关闭此限制。 + +### uwsgi_next_upstream_tries + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_next_upstream_tries** `number`;| +|**默认**|uwsgi_next_upstream_tries 0;| +|**上下文**|http、server、location| +|**提示**|该指令在 1.7.5 版本中出现| + +限制将请求传递到[下一个服务器](#uwsgi_next_upstream)的可能尝试次数。`0` 值关闭此限制。 + +### uwsgi_no_cache + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_no_cache** `string ...`;| +|**默认**|——| +|**上下文**|http、server、location| + +定义不将响应保存到缓存的条件。如果字符串参数中存在一个值不为空且不等于 `0`,则将不保存响应: + +```nginx +uwsgi_no_cache $cookie_nocache $arg_nocache$arg_comment; +uwsgi_no_cache $http_pragma $http_authorization; +``` + +可以与 [uwsgi_cache_bypass](#uwsgi_cache_bypass) 指令一起使用。 + +### uwsgi_param + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_param** `parameter value [if_not_empty]`;| +|**默认**|——| +|**上下文**|http、server、location| + +设置一个应该传递给 uwsgi 服务器的参数(`parameter`)。该值可以包含文本、变量及其组合。当且仅当当前级别上没有定义 uwsgi_param 指令时,这些指令才从上一级继承。 + +标准 [CGI 环境变量](https://tools.ietf.org/html/rfc3875#section-4.1)应作为 uwsgi 头提供,请参阅发行版中提供的 `uwsgi_params` 文件: + +```nginx +location / { + include uwsgi_params; + ... +} +``` + +如果使用 `if_not_empty`(1.1.11)指定了指令,则仅当其值不为空时,此类参数才会传递给服务器: + +```nginx +uwsgi_param HTTPS $https if_not_empty; +``` + +### uwsgi_pass + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_pass** `[protocol://]address`;| +|**默认**|——| +|**上下文**|http、server、location| + +设置 uwsgi 服务器的协议和地址。`protocol` 可以指定 `uwsgi` 或 `suwsgi`(安全的 uwsgi,基于 SSL 的 uwsgi)。地址(`address`)可以指定为域名或 IP 地址以及端口: + +```nginx +uwsgi_pass localhost:9000; +uwsgi_pass uwsgi://localhost:9000; +uwsgi_pass suwsgi://[2001:db8::1]:9090; +``` + +或为 UNIX 域套接字路径: + +```nginx +uwsgi_pass unix:/tmp/uwsgi.socket; +``` + +如果一个域名解析为多个地址,则所有这些地址都将以轮询方式使用。另外,可以将地址指定为一个[服务器组](ngx_http_upstream_module.md)。 + +参数值可以包含变量。在这种情况下,如果将地址指定为域名,则在描述的[服务器组](ngx_http_upstream_module.md)中搜索该名称,如果找不到,则使用[解析器](ngx_http_core_module.md#resolver)确定该名称。 + +> 从 1.5.8 版本开始支持安全的 uwsgi 协议。 + +### uwsgi_pass_header + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_pass_header** `field`;| +|**默认**|——| +|**上下文**|http、server、location| + +允许将[原本已禁用](#uwsgi_hide_header)的头字段从 uwsgi 服务器传递到客户端。 + +### uwsgi_pass_request_body + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_pass_request_body** `on` | `off`;| +|**默认**|uwsgi_pass_request_body on;| +|**上下文**|http、server、location| + +指示是否将原始请求体传递到 uwsgi 服务器。另请参见 [uwsgi_pass_request_headers](#uwsgi_pass_request_headers) 指令。 + +### uwsgi_pass_request_headers + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_pass_request_headers** `on` | `off`;| +|**默认**|uwsgi_pass_request_headers on;| +|**上下文**|http、server、location| + +指示是否将原始请求的头字段传递到 uwsgi 服务器。另请参见 [uwsgi_pass_request_body](#uwsgi_pass_request_body) 指令。 + +### uwsgi_read_timeout + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_read_timeout** `time`;| +|**默认**|uwsgi_read_timeout 60s;| +|**上下文**|http、server、location| + +为从 uwsgi 服务器读取响应定义一个超时时间。超时时间仅在两次连续的读取操作之间计算,而不是整个传输响应。如果 uwsgi 服务器在此时间内未传输任何内容,则连接已关闭。 + +### uwsgi_request_buffering + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_request_buffering** `on` | `off`;| +|**默认**|uwsgi_request_buffering on;| +|**上下文**|http、server、location| +|**提示**|该指令在 1.7.11 版本中出现| + +启用或禁用客户端请求体缓冲。 + +启用缓冲后,在将请求发送到 uwsgi 服务器之前,将从客户端[读](#client_body_buffer_size)取整个请求体。 + +禁用缓冲后,请求体将在收到请求后立即发送到 uwsgi 服务器。在这种情况下,如果 ngin 已经开始发送请求体,则该请求无法传递到[下一个服务器](#uwsgi_next_upstream)。 + +当使用 HTTP/1.1 分块传输编码发送原始请求正文时,无论指令值如何,都将对请求正文进行缓冲。 + +### uwsgi_send_timeout + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_send_timeout** `time`;| +|**默认**|uwsgi_send_timeout 60s;| +|**上下文**|http、server、location| + +设置将请求传输到 uwsgi 服务器的超时时间。超时时间仅在两个连续的写操作之间计算,而不是整个请求的传输。如果 uwsgi 服务器在此时间内未收到任何信息,则连接已关闭。 + +### uwsgi_socket_keepalive + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_socket_keepalive** `on` | `off`;| +|**默认**|uwsgi_socket_keepalive off;| +|**上下文**|http、server、location| +|**提示**|该指令在 1.15.6 版本中出现| + +为与 uwsgi 服务器的传出连接配置 **TCP keepalive** 行为。默认情况下,操作系统的设置对套接字有效。如果指令设置为 `on` 值,则将为套接字打开 `SO_KEEPALIVE` 套接字选项。 + +### uwsgi_ssl_certificate + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_ssl_certificate** `file`;| +|**默认**|——| +|**上下文**|http、server、location| +|**提示**|该指令在 1.7.8 版本中出现| + +指定一个PEM 格式的证书文件,用于对受保护的 uwsgi 服务器进行身份验证。 + +### uwsgi_ssl_certificate_key + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_ssl_certificate_key** `file`;| +|**默认**|——| +|**上下文**|http、server、location| +|**提示**|该指令在 1.7.8 版本中出现| + +指定一个PEM 格式的密钥文件,用于对受保护的 uwsgi 服务器进行身份验证。 + +可以指定值 `engine:name:id` 来代替文件(`file`)(1.7.9),该文件从 OpenSSL 引擎名称(`name`)中加载有指定 ID 的密钥。 + +### uwsgi_ssl_ciphers + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_ssl_ciphers** `ciphers`;| +|**默认**|uwsgi_ssl_ciphers DEFAULT;| +|**上下文**|http、server、location| +|**提示**|该指令在 1.5.8 版本中出现| + +为对受保护的 uwsgi 服务器的请求指定启用密码。密码以 OpenSSL 库可以理解的格式指定。 + +可以使用 `openssl ciphers` 命令查看完整列表。 + +### uwsgi_ssl_crl + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_ssl_crl** `file`;| +|**默认**|——| +|**上下文**|http、server、location| +|**提示**|该指令在 1.7.0 版本中出现| + +指定一个 PEM 格式带有吊销证书(CRL)的文件,用于[验证](#uwsgi_ssl_verify)受保护的 uwsgi 服务器的证书。 + +### uwsgi_ssl_name + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_ssl_name** `name`;| +|**默认**|uwsgi_ssl_name host from uwsgi_pass;| +|**上下文**|http、server、location| +|**提示**|该指令在 1.7.0 版本中出现| + +允许覆盖用于[验证](#uwsgi_ssl_verify)受保护的 uwsgi 服务器的证书的服务器名称,并在与受保护的 uwsgi 服务器建立连接时[通过 SNI 传递](#uwsgi_ssl_server_name)。 + +默认情况下,使用 [uwsgi_pass](#uwsgi_pass) 的主机部分。 + +### uwsgi_ssl_password_file + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_ssl_password_file** `file`;| +|**默认**|——| +|**上下文**|http、server、location| +|**提示**|该指令在 1.7.8 版本中出现| + +指定一个带有[密钥](#uwsgi_ssl_certificate_key)的文件,每个口令在单独的行上指定。加载密钥时依次尝试。 + +### uwsgi_ssl_protocols + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_ssl_protocols** `[SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3]`;| +|**默认**|uwsgi_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;| +|**上下文**|http、server、location| +|**提示**|该指令在 1.5.8 版本中出现| + +当请求一个受保护的 uwsgi 服务器时,启用指定协议。 + +### uwsgi_ssl_server_name + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_ssl_server_name** `on` | `off`;| +|**默认**|uwsgi_ssl_server_name off;| +|**上下文**|http、server、location| +|**提示**|该指令在 1.7.0 版本中出现| + +与受保护的 uwsgi 服务器建立连接时,启用或禁用通过 [TLS 服务器名称指示扩展(SNI,RFC 6066)传递服务器名称](http://en.wikipedia.org/wiki/Server_Name_Indication)。 + +### uwsgi_ssl_session_reuse + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_ssl_session_reuse** `on` | `off`;| +|**默认**|uwsgi_ssl_session_reuse on;| +|**上下文**|http、server、location| +|**提示**|该指令在 1.5.8 版本中出现| + +确定在使用受保护的 uwsgi 服务器时是否可以重用 SSL 会话。如果日志中出现错误 `SSL3_GET_FINISHED:digest check failed`,请尝试禁用会话重用。 + +### uwsgi_ssl_trusted_certificate + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_ssl_trusted_certificate** `file`;| +|**默认**|——| +|**上下文**|http、server、location| +|**提示**|该指令在 1.7.0 版本中出现| + +指定一个 PEM 格式的受信任 CA 证书文件(`file`),该证书用于[验证](#uwsgi_ssl_verify)受保护的 uwsgi 服务器的证书。 + +### uwsgi_ssl_verify + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_ssl_verify** `on` | `off`;| +|**默认**|uwsgi_ssl_verify off;| +|**上下文**|http、server、location| +|**提示**|该指令在 1.7.0 版本中出现| + +启用或禁用对受保护的 uwsgi 服务器证书的验证。 + +### uwsgi_ssl_verify_depth + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_ssl_verify_depth** `number`;| +|**默认**|uwsgi_ssl_verify_depth 1;| +|**上下文**|http、server、location| +|**提示**|该指令在 1.7.0 版本中出现| + +在受保护的 uwsgi 服务器证书链中设置验证深度。 + +### uwsgi_store + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_store** `on` | `off` | `string`;| +|**默认**|uwsgi_store off;| +|**上下文**|http、server、location| + +允许将文件保存到磁盘。`on` 参数保存文件的路径相对于 [alias](../核心功能.md#alias) 或 [root](../核心功能.md#root) 指令。`off` 参数禁用文件保存。另外,可以使用带有变量的字符串来显式设置文件名: + +```nginx +uwsgi_store /data/www$original_uri; +``` + +根据收到的 **Last-Modified** 响应头字段设置文件的修改时间。首先将响应写入临时文件,然后重命名该文件。从 0.8.9 版本开始,可以将临时文件和持久存储放在不同的文件系统上。但请注意,在这种情况下,文件需要跨两个文件系统复制,而不是简单的重命名操作。因此,建议将 [uwsgi_temp_path](#uwsgi_temp_path) 指令设置的文件保存目录和临时文件保存目录放在同一文件系统上。 + +该指令可用于创建静态不可更改文件的本地副本,例如: + +```nginx +location /images/ { + root /data/www; + error_page 404 = /fetch$uri; +} + +location /fetch/ { + internal; + + uwsgi_pass backend:9000; + ... + + uwsgi_store on; + uwsgi_store_access user:rw group:rw all:r; + uwsgi_temp_path /data/temp; + + alias /data/www/; +} +``` + +### uwsgi_store_access + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_store_access** `users:permissions ...`;| +|**默认**|uwsgi_store_access user:rw;| +|**上下文**|http、server、location| + +设置新创建的文件和目录的访问权限,例如: + +```nginx +uwsgi_store_access user:rw group:rw all:r; +``` + +如果指定了任何 `group` 或 `all` 访问权限,则可以忽略 `user` 权限: + +```nginx +uwsgi_store_access group:rw all:r; +``` + +### uwsgi_temp_file_write_size + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_temp_file_write_size** `size`;| +|**默认**|uwsgi_temp_file_write_size 8k|16k;| +|**上下文**|http、server、location| + +当启用从 uwsgi 服务器到临时文件的响应缓冲时,限制一次写入临时文件的数据大小(`size`)。默认情况下,大小受 [uwsgi_buffer_size](#uwsgi_buffer_size) 和 [uwsgi_buffers](#uwsgi_buffers) 指令设置的两个缓冲区的限制。临时文件的最大大小由 [uwsgi_max_temp_file_size](#uwsgi_max_temp_file_size) 指令设置。 + +### uwsgi_temp_path + +|\-|说明| +|:------|:------| +|**语法**|**uwsgi_temp_path** `path [level1 [level2 [level3]]]`;| +|**默认**|uwsgi_temp_path uwsgi_temp;| +|**上下文**|http、server、location| + +定义一个目录,用于存储从 uwsgi 服务器接收到的数据的临时文件。在指定目录下最多可以使用三级子目录层次结构。例如以下配置: + +```nginx +uwsgi_temp_path /spool/nginx/uwsgi_temp 1 2; +``` + +临时文件可能如下: + +``` +/spool/nginx/uwsgi_temp/7/45/00000123457 +``` + +另请参见 [uwsgi_cache_path](#uwsgi_cache_path) 指令的 `use_temp_path` 参数。 + +## 原文档 + +- [http://nginx.org/en/docs/http/ngx_http_uwsgi_module.html](http://nginx.org/en/docs/http/ngx_http_uwsgi_module.html) diff --git "a/\346\250\241\345\235\227\345\217\202\350\200\203/http/ngx_http_v2_module.md" "b/\346\250\241\345\235\227\345\217\202\350\200\203/http/ngx_http_v2_module.md" new file mode 100644 index 0000000..fb5a77c --- /dev/null +++ "b/\346\250\241\345\235\227\345\217\202\350\200\203/http/ngx_http_v2_module.md" @@ -0,0 +1,198 @@ +# ngx_http_v2_module + +- [已知问题](#issues) +- [示例配置](#example_configuration) +- [指令](#directives) + - [http2_body_preread_size](#http2_body_preread_size) + - [http2_chunk_size](#http2_chunk_size) + - [http2_idle_timeout](#http2_idle_timeout) + - [http2_max_concurrent_pushes](#http2_max_concurrent_pushes) + - [http2_max_concurrent_streams](#http2_max_concurrent_streams) + - [http2_max_field_size](#http2_max_field_size) + - [http2_max_header_size](#http2_max_header_size) + - [http2_max_requests](#http2_max_requests) + - [http2_push](#http2_push) + - [http2_push_preload](#http2_push_preload) + - [http2_recv_buffer_size](#http2_recv_buffer_size) + - [http2_recv_timeout](#http2_recv_timeout) +- [内嵌变量](#embedded_variables) + +`ngx_http_v2_module` 模块(1.9.5)提供对 [HTTP/2](https://tools.ietf.org/html/rfc7540) 的支持并取代了 [ngx_http_spdy_module](ngx_http_spdy_module.md) 模块。 + +默认不构建此模块,可使用 `--with-http_v2_module` 配置参数启用。 + + + +## 已知问题 + +在 1.9.14 版本之前,无论 [proxy_request_buffering](ngx_http_proxy_module.md#proxy_request_buffering)、[fastcgi_request_buffering](ngx_http_fastcgi_module.md#fastcgi_request_buffering)、[uwsgi_request_buffering](ngx_http_uwsgi_module.md#uwsgi_request_buffering) 和 [scgi_request_buffering](ngx_http_scgi_module.md#scgi_request_buffering) 指令值如何设置,都无法禁用客户端请求体缓冲。 + + + +## 示例配置 + +```nginx +server { + listen 443 ssl http2; + + ssl_certificate server.crt; + ssl_certificate_key server.key; +} +``` + +请注意,通过 TLS 接受 HTTP/2 连接需要「应用层协议协商」(Application-Layer Protocol Negotiation,ALPN)TLS 扩展支持,该支持仅在 [OpenSSL](http://www.openssl.org/) 1.0.2 版本之后可用。使用「次协议协商」(Next Protocol Negotiation,NPN)TLS 扩展(自 OpenSSL 1.0.1 版本起可用)不能保证生效。 + +另外,如果 [ssl_prefer_server_ciphers](ngx_http_ssl_module.md#ssl_prefer_server_ciphers) 指令设置为 `on` 值,则应将密码配置为符合 [RFC 7540 中的附录 A 黑名单](https://tools.ietf.org/html/rfc7540#appendix-A) 并由客户端支持。 + + + +## 指令 + +### http2_body_preread_size + +|\-|说明| +|:------|:------| +|**语法**|**http2_body_preread_size** `size`;| +|**默认**|http2_body_preread_size 64k;| +|**上下文**|http、server| +|**提示**|该指令在 1.11.0 版本中出现| + +设置在开始处理之前可能被保存的请求体中的每个请求的缓冲区大小(`size`)。 + +### http2_chunk_size + +|\-|说明| +|:------|:------| +|**语法**|**http2_chunk_size** `size`;| +|**默认**|http2_chunk_size 8k;| +|**上下文**|http、server、location| + +设置响应体切片的最大大小(`size`)。值太低会导致更高的开销。由于 [HOL 阻塞](http://en.wikipedia.org/wiki/Head-of-line_blocking),过高的值会破坏优先级。 + +### http2_idle_timeout + +|\-|说明| +|:------|:------| +|**语法**|**http2_idle_timeout** `time`;| +|**默认**|http2_idle_timeout 3m;| +|**上下文**|http、server| + +设置连接关闭后的不活动超时时间。 + +### http2_max_concurrent_pushes + +|\-|说明| +|:------|:------| +|**语法**|**http2_max_concurrent_pushes** `number`;| +|**默认**|http2_max_concurrent_pushes 10;| +|**上下文**|http、server| +|**提示**|该指令在 1.13.9 版本中出现| + +限制一个连接的最大并发[推送](#http2_push)请求数。 + +### http2_max_concurrent_streams + +|\-|说明| +|:------|:------| +|**语法**|**http2_max_concurrent_streams** `number`;| +|**默认**|http2_max_concurrent_streams 128;| +|**上下文**|http、server| + +设置一个连接的最大并发 HTTP/2 流数量。 + +### http2_max_field_size + +|\-|说明| +|:------|:------| +|**语法**|**http2_max_field_size** `size`;| +|**默认**|http2_max_field_size 4k;| +|**上下文**|http、server| + +限制 [HPACK](https://tools.ietf.org/html/rfc7541) 压缩的请求头字段的最大大小(`size`)。该限制同样适用于字段名和值。请注意,如果使用了霍夫曼编码,则解压缩后的字段名和值字符串的实际大小可能会更大。对于大多数请求,默认限制应该足够。 + +### http2_max_header_size + +|\-|说明| +|:------|:------| +|**语法**|**http2_max_header_size** `size`;| +|**默认**|http2_max_header_size 16k;| +|**上下文**|http、server| + +限制 [HPACK](https://tools.ietf.org/html/rfc7541) 解压缩后整个请求头列表的最大大小(`size`)。对于大多数请求,默认限制应该足够。 + +### http2_max_requests + +|\-|说明| +|:------|:------| +|**语法**|**http2_max_requests** `number`;| +|**默认**|http2_max_requests 1000;| +|**上下文**|http、server| +|**提示**|该指令在 1.11.6 版本中出现| + +设置可以通过一个 HTTP/2 连接提供服务的最大请求数量(`number`)(包括[推送](#http2_push)请求),之后下一个客户端请求将导致连接关闭以及需要建立新连接。 + +要释放每个连接的内存分配,必须定期关闭连接。因此,设置过多的最大请求数可能会导致内存使用过多,因此不建议这样做。 + +### http2_push + +|\-|说明| +|:------|:------| +|**语法**|**http2_push** `uri` | `off`;| +|**默认**|http2_push off;| +|**上下文**|http、server、location| +|**提示**|该指令在 1.13.9 版本中出现| + +抢先向指定的 `uri` 发送([推送](https://tools.ietf.org/html/rfc7540#section-8.2))请求以及对原始请求响应。仅处理有绝对路径的相对 URI,例如: + +```nginx +http2_push /static/css/main.css; +``` + +`uri` 值可以包含变量。 + +可以在同一配置级别上指定几个 `http2_push` 指令。`off` 参数取消从其他配置级别继承的 `http2_push` 指令的作用。 + +### http2_push_preload + +|\-|说明| +|:------|:------| +|**语法**|**http2_push_preload** `on` | `off`;| +|**默认**|http2_push_preload off;| +|**上下文**|http、server、location| +|**提示**|该指令在 1.13.9 版本中出现| + +启用将 **Link** 响应头字段中指定的[预加载链接](https://www.w3.org/TR/preload/#server-push-http-2)自动转换为[推送](https://tools.ietf.org/html/rfc7540#section-8.2)请求的功能。 + +### http2_recv_buffer_size + +|\-|说明| +|:------|:------| +|**语法**|**http2_recv_buffer_size** `size`;| +|**默认**|http2_recv_buffer_size 256k;| +|**上下文**|http| + +设置每个[工作进程](../核心功能.md#worker_processes)输入缓冲区的大小(`size`)。 + +### http2_recv_timeout + +|\-|说明| +|:------|:------| +|**语法**|**http2_recv_timeout** `time`;| +|**默认**|http2_recv_timeout 30s;| +|**上下文**|http、server| + +设置超时时间以从客户端获得更多数据,然后关闭连接。 + + + +## 内嵌变量 + +`ngx_http_userid_module` 模块支持以下内嵌变量: + +- `$http2` + + 协商的协议标识符:`h2` 用于 TLS HTTP/2,`h2c` 用于在明文 TCP HTTP/2,否则为空字符串。 + +## 原文档 + +- [http://nginx.org/en/docs/http/ngx_http_v2_module.html](http://nginx.org/en/docs/http/ngx_http_v2_module.html) diff --git "a/\346\250\241\345\235\227\345\217\202\350\200\203/http/ngx_http_xslt_module.md" "b/\346\250\241\345\235\227\345\217\202\350\200\203/http/ngx_http_xslt_module.md" new file mode 100644 index 0000000..0aa7563 --- /dev/null +++ "b/\346\250\241\345\235\227\345\217\202\350\200\203/http/ngx_http_xslt_module.md" @@ -0,0 +1,128 @@ +# ngx_http_xslt_module + +- [示例配置](#example_configuration) +- [指令](#directives) + - [xml_entities](#xml_entities) + - [xslt_last_modified](#xslt_last_modified) + - [xslt_param](#xslt_param) + - [xslt_string_param](#xslt_string_param) + - [xslt_stylesheet](#xslt_stylesheet) + - [xslt_types](#xslt_types) + +`ngx_http_xslt_module`(0.7.8+)是一个过滤器,可使用一个或多个 XSLT 样式表来转换 XML 响应。 + +默认不构建此模块,可在构建时使用 `--with-http_xslt_module` 配置参数启用。 + +> 该模块雨来 [libxml2](http://xmlsoft.org/) 和 [libxslt](http://xmlsoft.org/XSLT/) 库。 + + + +## 示例配置 + +```nginx +location / { + xml_entities /site/dtd/entities.dtd; + xslt_stylesheet /site/xslt/one.xslt param=value; + xslt_stylesheet /site/xslt/two.xslt; +} +``` + + + +## 指令 + +### xml_entities + +|\-|说明| +|:------|:------| +|**语法**|**xml_entities** `path`;| +|**默认**|——| +|**上下文**|http、server、location| + +指定声明字符实体的 DTD 文件。该文件在配置阶段编译。出于技术原因,该模块无法在已处理的 XML 中使用外部子集声明,因此将其忽略,可使用专门定义的文件。该文件不应描述 XML 结构。仅声明所需的字符实体就足够了,例如: + +``` + +``` + +### xslt_last_modified + +|\-|说明| +|:------|:------| +|**语法**|**xslt_last_modified** `on` | `off`;| +|**默认**|xslt_last_modified off;| +|**上下文**|http、server、location| +|**提示**|该指令在 1.5.1 版本中出现| + +允许在 XSLT 转换期间保留原始响应中的 `Last-Modified` 头字段,以方便响应缓存。 + +默认情况下,在转换期间修改响应的内容时,将删除头字段,并且该头字段可能包含动态生成的元素或片段,这些元素或片段独立于原始响应更改。 + +### xslt_param + +|\-|说明| +|:------|:------| +|**语法**|**xslt_param** `parameter value`;| +|**默认**|——| +|**上下文**|http、server、location| +|**提示**|该指令在 1.1.18 版本中出现| + +定义 XSLT 样式表的参数。该值(`value`)为 XPath 表达式。`value` 可以包含变量。要将字符串值传递给样式表,可使用 [xslt_string_param](#xslt_string_param) 指令。 + +可以有多个 `xslt_param` 指令。当且仅当当前级别上没有定义 `xslt_param` 和 [xslt_string_param](#xslt_string_param) 指令时,这些指令才从上一级继承。 + +### xslt_string_param + +|\-|说明| +|:------|:------| +|**语法**|**xslt_string_param** `parameter value`;| +|**默认**|——| +|**上下文**|http、server、location| +|**提示**|该指令在 1.1.18 版本中出现| + +定义 XSLT 样式表的字符串参数。`value` 中的 XPath 表达式不会被解释。`value` 可以包含变量。 + +可以有多个 `xslt_string_param` 指令。当且仅当当前级别上没有定义 [xslt_param](#xslt_param) 和 `xslt_string_param` 指令时,这些指令才从上一级继承。 + +### xslt_stylesheet + +|\-|说明| +|:------|:------| +|**语法**|**xslt_stylesheet** `stylesheet [parameter=value ...]`;| +|**默认**|——| +|**上下文**|http、server、location| + +定义 XSLT 样式表及其可选参数。在配置阶段将编译样式表。 + +可以单独指定参数,也可以使用 `:` 定界符将其分组在一行中。如果参数包含 `:` 字符,则应将其转义为 `%3A`。另外,`libxslt` 要求将包含非字母数字字符的参数括在单引号或双引号中,例如: + +``` +param1='http%3A//www.example.com':param2=value2 +``` + +参数描述可以包含变量,例如,整行参数可以取自单个变量: + +```nginx +location / { + xslt_stylesheet /site/xslt/one.xslt + $arg_xslt_params + param1='$value1':param2=value2 + param3=value3; +} +``` + +可以指定多个样式表。它们将按指定顺序应用。 + +### xslt_types + +|\-|说明| +|:------|:------| +|**语法**|**xslt_types** `mime-type ...`;| +|**默认**|xslt_types text/xml;| +|**上下文**|http、server、location| + +除了 `text/xml` 之外,还启用有指定 MIME 类型的响应的转换。特殊值 `*` 与任何 MIME 类型(0.8.29)匹配。如果转换结果是 HTML 响应,则其 MIME 类型将更改为 `text/html`。 + +## 原文档 + +- [http://nginx.org/en/docs/http/ngx_http_xslt_module.html](http://nginx.org/en/docs/http/ngx_http_xslt_module.html) diff --git "a/\346\250\241\345\235\227\345\217\202\350\200\203/mail/ngx_mail_auth_http_module.md" "b/\346\250\241\345\235\227\345\217\202\350\200\203/mail/ngx_mail_auth_http_module.md" new file mode 100644 index 0000000..2f6356b --- /dev/null +++ "b/\346\250\241\345\235\227\345\217\202\350\200\203/mail/ngx_mail_auth_http_module.md" @@ -0,0 +1,186 @@ +# ngx_mail_auth_http_module + +- [指令](#directives) + - [auth_http](#auth_http) + - [auth_http_header](#auth_http_header) + - [auth_http_pass_client_cert](#auth_http_pass_client_cert) + - [auth_http_timeout](#auth_http_timeout) +- [协议](#protocol) + + + +## 指令 + +### auth_http + +|\-|说明| +|:------|:------| +|**语法**|**auth_http** `URL`;| +|**默认**|——| +|**上下文**|mail、server| + +设置 HTTP 认证服务器的 URL。协议描述[如下](#protocol)。 + +### auth_http_header + +|\-|说明| +|:------|:------| +|**语法**|**auth_http_header** `header value`;| +|**默认**|——| +|**上下文**|mail、server| + +将指定的头附加到发送到身份验证服务器的请求。该头可以用作共享密钥,以验证请求来自 nginx。例如: + +```nginx +auth_http_header X-Auth-Key "secret_string"; +``` + +### auth_http_pass_client_cert + +|\-|说明| +|:------|:------| +|**语法**|**auth_http_pass_client_cert** `on` | `off`;| +|**默认**|auth_http_pass_client_cert off;| +|**上下文**|mail、server| +|**提示**|该指令在 1.7.11 版本中出现| + +将 **Auth-SSL-Cert** 头和 PEM 格式(已编码)的[客户端](./ngx_mail_ssl_module.md#ssl_verify_client)证书附加到发送到身份验证服务器的请求。 + +### auth_http_timeout + +|\-|说明| +|:------|:------| +|**语法**|**auth_http_timeout** `time`| +|**默认**|auth_http_timeout 60s;| +|**上下文**|mail、server| + +设置与认证服务器通信的超时时间。 + + + +## 协议 + +HTTP 协议用于与身份验证服务器进行通信。响应正文中的数据将被忽略,信息仅在头中传递。 + +请求和响应的示例: + +请求: + +``` +GET /auth HTTP/1.0 +Host: localhost +Auth-Method: plain # plain/apop/cram-md5/external +Auth-User: user +Auth-Pass: password +Auth-Protocol: imap # imap/pop3/smtp +Auth-Login-Attempt: 1 +Client-IP: 192.0.2.42 +Client-Host: client.example.org +``` + +好的响应: + +``` +HTTP/1.0 200 OK +Auth-Status: OK +Auth-Server: 198.51.100.1 +Auth-Port: 143 +``` + +坏的响应: + +``` +HTTP/1.0 200 OK +Auth-Status: Invalid login or password +Auth-Wait: 3 +``` + +如果没有 **Auth-Wait** 头,则将返回错误并关闭连接。当前实现为每次身份验证尝试分配内存。仅在会话结束时才释放内存。因此,必须限制单个会话中无效身份验证尝试的次数 — 服务器必须在 10-20 次尝试后响应不带 **Auth-Wait** 头(尝试次数在 **Auth-Login-Attempt** 头中传递)。 + +使用 APOP 或 CRAM-MD5 时,请求-响应如下所示: + +``` +GET /auth HTTP/1.0 +Host: localhost +Auth-Method: apop +Auth-User: user +Auth-Salt: <238188073.1163692009@mail.example.com> +Auth-Pass: auth_response +Auth-Protocol: imap +Auth-Login-Attempt: 1 +Client-IP: 192.0.2.42 +Client-Host: client.example.org +``` + +好的响应: + +``` +HTTP/1.0 200 OK +Auth-Status: OK +Auth-Server: 198.51.100.1 +Auth-Port: 143 +Auth-Pass: plain-text-pass +``` + +如果响应中存在 **Auth-User** 头,它将覆盖用于与后端进行身份验证的用户名。 + +对于 SMTP,响应还考虑了 **Auth-Error-Code** 头 — 如果存在,则在发生错误时用作响应代码。否则,将 535 5.7.0 代码添加到 **Auth-Status** 头中。 + +例如,如果从身份验证服务器收到以下响应: + +``` +HTTP/1.0 200 OK +Auth-Status: Temporary server problem, try again later +Auth-Error-Code: 451 4.3.0 +Auth-Wait: 3 +``` + +则 SMTP 客户端将收到错误 + +``` +451 4.3.0 Temporary server problem, try again later +``` + +如果代理 SMTP 不需要身份验证,则请求将如下所示: + +``` +GET /auth HTTP/1.0 +Host: localhost +Auth-Method: none +Auth-User: +Auth-Pass: +Auth-Protocol: smtp +Auth-Login-Attempt: 1 +Client-IP: 192.0.2.42 +Client-Host: client.example.org +Auth-SMTP-Helo: client.example.org +Auth-SMTP-From: MAIL FROM: <> +Auth-SMTP-To: RCPT TO: +``` + +对于 SSL/TLS 客户端连接(1.7.11),添加了 **Auth-SSL** 头,并且 **Auth-SSL-Verify** 将包含客户端证书验证的结果(如果[启用](ngx_mail_ssl_module.md#ssl_verify_client)):`SUCCESS`、`FAILED:reason` 和 `NONE`(如果不存在证书)。 + +> 在 1.11.7 版本之前,`FAILED` 结果不包含原因字符串。 + +存在客户端证书时,其详细信息将在以下请求头中传递:**Auth-SSL-Subject**、**Auth-SSL-Issuer**、**Auth-SSL-Serial** 和 **Auth-SSL-Fingerprint**。如果启用了 [auth_http_pass_client_cert](#auth_http_pass_client_cert),则证书本身将在 **Auth-SSL-Cert** 头中传递。该请求将如下所示: + +``` +GET /auth HTTP/1.0 +Host: localhost +Auth-Method: plain +Auth-User: user +Auth-Pass: password +Auth-Protocol: imap +Auth-Login-Attempt: 1 +Client-IP: 192.0.2.42 +Auth-SSL: on +Auth-SSL-Verify: SUCCESS +Auth-SSL-Subject: /CN=example.com +Auth-SSL-Issuer: /CN=example.com +Auth-SSL-Serial: C07AD56B846B5BFF +Auth-SSL-Fingerprint: 29d6a80a123d13355ed16b4b04605e29cb55a5ad +``` + +## 原文档 + +- [http://nginx.org/en/docs/mail/ngx_mail_auth_http_module.html](http://nginx.org/en/docs/mail/ngx_mail_auth_http_module.html) diff --git "a/\346\250\241\345\235\227\345\217\202\350\200\203/mail/ngx_mail_core_module.md" "b/\346\250\241\345\235\227\345\217\202\350\200\203/mail/ngx_mail_core_module.md" new file mode 100644 index 0000000..68e214d --- /dev/null +++ "b/\346\250\241\345\235\227\345\217\202\350\200\203/mail/ngx_mail_core_module.md" @@ -0,0 +1,249 @@ +# ngx_mail_core_module + +- [示例配置](#example_configuration) +- [指令](#directives) + - [listen](#listen) + - [mail](#mail) + - [protocol](#protocol) + - [resolver](#resolver) + - [resolver_timeout](#resolver_timeout) + - [server](#server) + - [server_name](#server_name) + - [timeout](#timeout) + +默认不构建此模块,可使用 `--with-mail` 配置参数启用。 + + + +## 示例配置 + +```nginx +worker_processes 1; + +error_log /var/log/nginx/error.log info; + +events { + worker_connections 1024; +} + +mail { + server_name mail.example.com; + auth_http localhost:9000/cgi-bin/nginxauth.cgi; + + imap_capabilities IMAP4rev1 UIDPLUS IDLE LITERAL+ QUOTA; + + pop3_auth plain apop cram-md5; + pop3_capabilities LAST TOP USER PIPELINING UIDL; + + smtp_auth login plain cram-md5; + smtp_capabilities "SIZE 10485760" ENHANCEDSTATUSCODES 8BITMIME DSN; + xclient off; + + server { + listen 25; + protocol smtp; + } + server { + listen 110; + protocol pop3; + proxy_pass_error_message on; + } + server { + listen 143; + protocol imap; + } + server { + listen 587; + protocol smtp; + } +} +``` + + + +## 指令 + +### listen + +|\-|说明| +|:------|:------| +|**语法**|**listen** `address:port [ssl] [backlog=number] [rcvbuf=size] [sndbuf=size] [bind] [ipv6only=on\|off] [so_keepalive=on\|off\|[keepidle]:[keepintvl]:[keepcnt]]`;| +|**默认**|——| +|**上下文**|server| + +为将接受请求的服务器的套接字设置地址(`address`)和端口(`port`)。可以仅指定端口。地址也可以是主机名,例如: + +```nginx +listen 127.0.0.1:110; +listen *:110; +listen 110; # same as *:110 +listen localhost:110; +``` + +IPv6 地址在方括号中指定(0.7.58): + +```nginx +listen [::1]:110; +listen [::]:110; +``` + +UNIX 域套接字使用 `unix:` 前缀指定(1.3.5): + +```nginx +listen unix:/var/run/nginx.sock; +``` + +不同的服务器必须侦听不同的 `address:port` 对,不能重复。 + +`ssl` 参数指定该端口上接受的所有连接均应以 SSL 模式工作。 + +`listen` 指令可以指定几个额外的参数给套接字相关的系统调用。 + +- `backlog=number` + + 在 `listen()` 调用中设置 `backlog` 参数,该参数限制挂起的连接队列的最大长度(1.9.2)。默认情况下,在 FreeBSD、DragonFly BSD 和 mac OS上,`backlog` 设置为 -1,而在其他平台上则设置为 511。 + +- `rcvbuf=size` + + 设置侦听套接字的接收缓冲区大小(`SO_RCVBUF` 选项)(1.11.13)。 + +- `sndbuf=size` + + 设置侦听套接字的发送缓冲区大小(`SO_SNDBUF` 选项)(1.11.13)。 + +- `bind` + + 此参数指示对给定的 `address:port` 对进行单独的 `bind()` 调用。事实上,如果有多个有相同端口但地址不同的 `listen` 指令,并且其中一个 `listen` 指令在给定端口(`*:port`)的所有地址上监听,nginx 只会将绑定(`bind()`)到 `*:port`。要注意的是,这种情况下将进行 `getsockname()` 系统调用,以确定接受连接的地址。如果使用 `ipv6only` 或 `so_keepalive` 参数,则对于给定的 `address:port` 对,将始终进行单独的 `bind()` 调用。 + +- `ipv6only=on|off` + + 此参数确定(通过 `IPV6_V6ONLY` 套接字选项)监听通配符地址 `[::]` 的 IPv6 套接字是否仅接受 IPv6 连接,还是接受 IPv6 和 IPv4 连接。默认情况下,此参数是打开的。启动时只能设置一次。 + +- `so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]` + + 此参数为监听套接字配置「TCP keepalive」行为。如果省略此参数,则套接字的操作系统设置将生效。如果将其设置为值 `on`,则会为套接字打开 `SO_KEEPALIVE` 选项。如果将其设置为值 `off`,则将关闭套接字 `SO_KEEPALIVE` 选项。某些操作系统支持使用 `TCP_KEEPIDLE`、`TCP_KEEPINTVL` 和 `TCP_KEEPCNT` 套接字选项在每个套接字的基础上设置 TCP Keepalive 参数。在此类系统(当前为 Linux 2.4+、NetBSD 5+ 和 FreeBSD 9.0-STABLE)上,可以使用 `keepidle`、`keepintvl` 和 `keepcnt` 参数进行配置。可以省略一个或两个参数,在这种情况下,相应套接字选项的系统默认设置将生效。例如, + + ```nginx + so_keepalive=30m::10 + ``` + + 会将闲置超时时间(`TCP_KEEPIDLE`)设置为 30 分钟,将探测间隔(`TCP_KEEPINTVL`)保留为系统默认值,并将探测计数(`TCP_KEEPCNT`)设置为 10 个探测。 + + +### mail + +|\-|说明| +|:------|:------| +|**语法**|**mail** `{ ... }`;| +|**默认**|——| +|**上下文**|main| + +在指定的邮件服务器指令中提供配置文件上下文。 + +### protocol + +|\-|说明| +|:------|:------| +|**语法**|**protocol** `imap` | `pop3` | `smtp`;| +|**默认**|——| +|**上下文**|server| + +设置代理服务器的协议。支持的协议有 [IMAP](./ngx_mail_imap_module.md)、[POP3](./ngx_mail_pop3_module.md) 和 [SMTP](ngx_mail_smtp_module.md)。 + +如果未设置该指令,则可以基于 [listen](#listen) 指令中指定的为人熟知的默认端口来自动检测协议: + +- `imap`:143、993 +- `pop3`:110、995 +- `smtp`:25、587、465 + +可以使用[配置](../../How-To/从源码构建nginx.md)参数 `--without-mail_imap_module`、`--without-mail_pop3_module` 和 `--without-mail_smtp_module` 禁用不必要的协议。 + +### resolver + +|\-|说明| +|:------|:------| +|**语法**|**resolver** `address ... [valid=time] [ipv6=on\|off] [status_zone=zone]`;
**resolver** `off`| +|**默认**|resolver off;| +|**上下文**|mail、server| + +配置用于查找客户端主机名以将其传递给[身份验证服务器](./ngx_mail_auth_http_module.md)的名称服务器,以及代理 SMTP 时的 [XCLIENT](ngx_mail_proxy_module.md#xclient) 命令。 例如: + +```nginx +resolver 127.0.0.1 [::1]:5353; +``` + +可以使用可选端口(1.3.1、1.2.2)将地址指定为域名或 IP 地址。如果未指定端口,则使用端口 53。以轮询方式查询名称服务器。 + +> 在 1.1.7 版本之前,只能配置一个名称服务器。从 1.3.1 和 1.2.2 版本开始,支持使用 IPv6 地址指定名称服务器。 + +默认情况下,nginx 将在解析时同时查找 IPv4 和 IPv6 地址。如果不需要查找 IPv6 地址,则可以指定 `ipv6=off` 参数。 + +> 从 1.5.8 版本开始,支持将名称解析为 IPv6 地址。 + +默认情况下,nginx 使用响应的 TTL 值缓存应答。可选的 `valid` 参数可覆盖它: + +```nginx +resolver 127.0.0.1 [::1]:5353 valid=30s; +``` + +> 在1.1.9 版本之前,无法调整缓存时间,nginx 始终将应答缓存 5 分钟。 + +> 为防止 DNS 欺骗,建议在适当安全的受信任本地网络中配置 DNS 服务器。 + +可选的 `status_zone` 参数(1.17.1)启用对指定区域中的请求和响应的 DNS 服务器统计信息的[收集]功能(../http/ngx_http_api_module.md#resolvers_)。该参数为我们的[商业订阅](http://nginx.com/products/?_ga=2.151996858.282650095.1578660485-1105498734.1571247330)部分。 + +特殊值 `off` 禁用解析。 + +### resolver_timeout + +|\-|说明| +|:------|:------| +|**语法**|**resolver_timeout** `time`;| +|**默认**|resolver_timeout 30s;| +|**上下文**|mail、server| + +设置 DNS 操作的超时时间,例如: + +```nginx +resolver_timeout 5s; +``` + +### server + +|\-|说明| +|:------|:------| +|**语法**|**server** `{ ... }`;| +|**默认**|——| +|**上下文**|mail| + +设置服务器的配置。 + +### server_name + +|\-|说明| +|:------|:------| +|**语法**|**server_name** `name`;| +|**默认**|server_name hostname;| +|**上下文**|mail、server| + +设置服务器名称,在以下场景中使用的: + +- 最开始的 POP3/SMTP 服务器问候语中 +- SASL CRAM-MD5 身份验证中的盐值中 +- 如果启用了 [XCLIENT](ngx_mail_proxy_module.md#xclient) 命令的传递,则在连接到 SMTP 后端时,在 `EHLO` 命令中 + +如果未指定指令,则使用计算机的主机名。 + +### timeout + +|\-|说明| +|:------|:------| +|**语法**|**timeout** `time`;| +|**默认**|timeout 60s;| +|**上下文**|mail、server| + +设置超时时间,在代理到后端开始之前使用。 + +## 原文档 + +- [http://nginx.org/en/docs/mail/ngx_mail_core_module.html](http://nginx.org/en/docs/mail/ngx_mail_core_module.html) diff --git "a/\346\250\241\345\235\227\345\217\202\350\200\203/mail/ngx_mail_imap_module.md" "b/\346\250\241\345\235\227\345\217\202\350\200\203/mail/ngx_mail_imap_module.md" index 3feb73f..fe95cd1 100644 --- "a/\346\250\241\345\235\227\345\217\202\350\200\203/mail/ngx_mail_imap_module.md" +++ "b/\346\250\241\345\235\227\345\217\202\350\200\203/mail/ngx_mail_imap_module.md" @@ -53,7 +53,7 @@ |\-|说明| |------:|------| |**语法**|**imap_client_buffer** `size`;| -|**默认**|imap_client_buffer 4k|8k;| +|**默认**|imap_client_buffer 4k|8k;| |**上下文**|mail、server| 设置 IMAP 命令读取缓冲区大小。默认情况下,缓冲区大小等于一个内存页面。4K 或 8K,取决于平台。 diff --git "a/\346\250\241\345\235\227\345\217\202\350\200\203/mail/ngx_mail_proxy_module.md" "b/\346\250\241\345\235\227\345\217\202\350\200\203/mail/ngx_mail_proxy_module.md" new file mode 100644 index 0000000..d60fd67 --- /dev/null +++ "b/\346\250\241\345\235\227\345\217\202\350\200\203/mail/ngx_mail_proxy_module.md" @@ -0,0 +1,69 @@ +# ngx_mail_proxy_module + +- [指令](#directives) + - [proxy_buffer](#proxy_buffer) + - [proxy_pass_error_message](#proxy_pass_error_message) + - [proxy_timeout](#proxy_timeout) + - [xclient](#xclient) + + + +## 指令 + +### proxy_buffer + +|\-|说明| +|:------|:------| +|**语法**|**proxy_buffer** `size`;| +|**默认**|proxy_buffer 4k|8k| +|**上下文**|mail、server| + +设置用于代理的缓冲区的大小。默认情况下,缓冲区大小等于一个内存页。根据平台的不同,它可以是 4K 或 8K。 + +### proxy_pass_error_message + +|\-|说明| +|:------|:------| +|**语法**|**proxy_pass_error_message** `on` | `off`;| +|**默认**|proxy_pass_error_message off;| +|**上下文**|mail、server| + +指示是否将后端身份验证期间获得的错误消息传递给客户端。 + +通常,如果 nginx 中的身份验证成功,则后端无法返回错误。如果仍然返回错误,则表示发生了一些内部错误。在这种情况下,后端消息可能包含不应显示给客户端的信息。但是,对于某些 POP3 服务器,响应一个密码错误信息是正常现象。例如,CommuniGatePro 通过定期输出[身份验证错误](http://www.stalker.com/CommuniGatePro/POP.html#Alerts)来通知用户[邮箱溢出](http://www.stalker.com/CommuniGatePro/Alerts.html#Quota)或其他事件。在这种情况下,应启用该指令。 + +### proxy_timeout + +|\-|说明| +|:------|:------| +|**语法**|**proxy_timeout** `timeout`;| +|**默认**|proxy_timeout 24h;| +|**上下文**|mail、server| + +设置客户端或代理服务器连接上两次连续的读取或写入操作之间的超时(`timeout`)。如果在此时间内没有数据传输,则连接将关闭。 + +### xclient + +|\-|说明| +|:------|:------| +|**语法**|**xclient** `on` | `off`;| +|**默认**|xclient on;| +|**上下文**|mail、server| + +连接到 SMTP 后端时,启用或禁用 [XCLIENT](http://www.postfix.org/XCLIENT_README.html) 命令与客户端参数的传递。 + +借助 `XCLIENT`,MTA 能够将客户端信息写入日志并基于此数据应用各种限制。 + +如果启用了 `XCLIENT`,则 nginx 在连接到后端时会传递以下命令: + +- 附带[服务器名称](ngx_mail_core_module.md#server_name)的 EHLO +- `XCLIENT` +- 由客户传递的 `EHLO` 或 `HELO` + +如果客户端 IP 地址[找到](ngx_mail_core_module.md#resolver)的名称指向相同的地址,则会在 `XCLIENT` 命令的 `NAME` 参数中传递该名称。如果找不到名称、指向其他地址或未指定[解析器](ngx_mail_core_module.md#resolver),则在 `NAME` 参数中传递 `[UNAVAILABLE]`。如果在解析过程中发生错误,则使用 `[TEMPUNAVAIL]` 值。 + +如果禁用了 `XCLIENT`,则如果客户端已通过 `EHLO`,则 nginx 在连接到后端时将使用[服务器名称](ngx_mail_core_module.md#server_name)传递 EHLO 命令;否则,使用服务器名称传递 `HELO`。 + +## 原文档 + +- [http://nginx.org/en/docs/mail/ngx_mail_proxy_module.html](http://nginx.org/en/docs/mail/ngx_mail_proxy_module.html) diff --git "a/\346\250\241\345\235\227\345\217\202\350\200\203/mail/ngx_mail_ssl_module.md" "b/\346\250\241\345\235\227\345\217\202\350\200\203/mail/ngx_mail_ssl_module.md" new file mode 100644 index 0000000..906e16f --- /dev/null +++ "b/\346\250\241\345\235\227\345\217\202\350\200\203/mail/ngx_mail_ssl_module.md" @@ -0,0 +1,399 @@ +# ngx_mail_ssl_module + +- [示例配置](#example_configuration) +- [指令](#directives) + - [ssl](#ssl) + - [ssl_certificate](#ssl_certificate) + - [ssl_certificate_key](#ssl_certificate_key) + - [ssl_ciphers](#ssl_ciphers) + - [ssl_client_certificate](#ssl_client_certificate) + - [ssl_crl](#ssl_crl) + - [ssl_dhparam](#ssl_dhparam) + - [ssl_ecdh_curve](#ssl_ecdh_curve) + - [ssl_password_file](#ssl_password_file) + - [ssl_prefer_server_ciphers](#ssl_prefer_server_ciphers) + - [ssl_protocols](#ssl_protocols) + - [ssl_session_cache](#ssl_session_cache) + - [ssl_session_ticket_key](#ssl_session_ticket_key) + - [ssl_session_tickets](#ssl_session_tickets) + - [ssl_session_timeout](#ssl_session_timeout) + - [ssl_trusted_certificate](#ssl_trusted_certificate) + - [ssl_verify_client](#ssl_verify_client) + - [ssl_verify_depth](#ssl_verify_depth) + - [starttls](#starttls) + +`ngx_mail_ssl_module` 模块可让邮件代理服务器支持 SSL/TLS 协议。 + +默认情况下不构建此模块,可在构建时使用 `--with-mail_ssl_module` 配置参数启用它。 + +> 该模块依赖 [OpenSSL](http://www.openssl.org/) 库。 + + + +## 示例配置 + +为了减轻处理器负载,建议: + +- 将 [worker 进程](../核心功能.md#worker_processes)数设置为与处理器数量相等 +- 启用[共享](#ssl_session_cache_shared)会话缓存 +- 禁用[内置](#ssl_session_cache_builtin)的会话缓存 +- 可以延长会话的[生命周期](#ssl_session_timeout)(默认为 5 分钟) + +```nginx +worker_processes auto; + +mail { + + ... + + server { + listen 993 ssl; + + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5; + ssl_certificate /usr/local/nginx/conf/cert.pem; + ssl_certificate_key /usr/local/nginx/conf/cert.key; + ssl_session_cache shared:SSL:10m; + ssl_session_timeout 10m; + + ... + } +``` + + + +## 指令 + +### ssl + +|\-|说明| +|:------|:------| +|**语法**|**ssl** `on` | `off`;| +|**默认**|ssl off;| +|**上下文**|mail、server| + +该指令在 1.15.0 版本中已废弃,请改用 [listen](./ngx_mail_core_module.md#listen) 指令的 `ssl` 参数。 + +### ssl_certificate + +|\-|说明| +|:------|:------| +|**语法**|**ssl_certificate** `file`;| +|**默认**|——| +|**上下文**|mail、server| + +为给定服务器指定一个 PEM 格式的证书文件(`file`)。如果除主证书之外还要指定中间证书,则应在同一文件中按以下顺序指定它们:首先是主证书,然后是中间证书。PEM 格式的密钥可以放在同一文件中。 + +从 1.11.0 版开始,可以多次声明该指令来加载不同类型的证书,例如 RSA 和 ECDSA: + +```nginx +server { + listen 993 ssl; + + ssl_certificate example.com.rsa.crt; + ssl_certificate_key example.com.rsa.key; + + ssl_certificate example.com.ecdsa.crt; + ssl_certificate_key example.com.ecdsa.key; + + ... +} +``` + +> 仅 OpenSSL 1.0.2 或更高版本支持不同证书的独立证书链。对于较旧的版本,只能使用一个证书链。 + +可以指定 `data:certificate` 值来代替 `file`(1.15.10),无需使用文件即可加载证书。请注意,错误使用此语法可能会带来安全隐患,例如将密钥数据写入[错误日志](../核心功能.md#error_log)。 + +### ssl_certificate_key + +|\-|说明| +|:------|:------| +|**语法**|**ssl_certificate_key** `file`;| +|**默认**|——| +|**上下文**|mail、server| + +给服务器指定一个 PEM 格式的密钥文件(`file`)。 + +可以指定 `engine:name:id` 来代替 `file`(1.7.9),Nginx 将从名称为 `name` 的 OpenSSL 引擎中中加载 id 为 `id` 的密钥。 + +可以指定 `data:key` 值来代替 `file`(1.15.10),无需使用文件就可以加载密钥。请注意,错误使用此语法可能会带来安全隐患,例如将密钥数据写入[错误日志](../核心功能.md#error_log)。 + +### ssl_ciphers + +|\-|说明| +|:------|:------| +|**语法**|**ssl_ciphers** `ciphers`| +|**默认**|ssl_ciphers HIGH:!aNULL:!MD5;| +|**上下文**|mail、server| + +指定启用的加密算法。仅可指定 OpenSSL 库支持的算法,例如: + +``` +ssl_ciphers ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; +``` + +> 可以使用 `openssl ciphers` 命令查看完整列表。 + +默认情况下,早期版本的 nginx 使用了[不同](../../介绍/配置HTTPS服务器.md#compatibility)的加密算法。 + +### ssl_client_certificate + +|\-|说明| +|:------|:------| +|**语法**|**ssl_client_certificate** `file`;| +|**默认**|——| +|**上下文**|mail、server| +|**提示**|该指令在 1.7.11 版本中出现| + +指定一个 PEM 格式的受信任 CA 证书文件,用于[验证](#ssl_verify_client)客户端证书。 + +证书列表将发送给客户端。如果不希望这样做,则可以使用 [ssl_trusted_certificate ](#ssl_trusted_certificate) 指令配置。 + +### ssl_crl + +|\-|说明| +|:------|:------| +|**语法**|**ssl_crl** `file`;| +|**默认**|——| +|**上下文**|mail、server| +|**提示**|该指令在 1.7.11 版本中出现| + +指定一个 PEM 格式的吊销证书(CRL)文件,用于[验证](#ssl_verify_client)客户端证书。 + +### ssl_dhparam + +|\-|说明| +|:------|:------| +|**语法**|**ssl_dhparam** `file`;| +|**默认**|——| +|**上下文**|mail、server| +|**提示**|该指令在 0.7.2 版本中出现| + +指定一个带有 DHE 密码的 DH 参数的文件(`file`)。 + +默认情况下,不设置任何参数,因此不使用 DHE 密码。 + +> 在 1.11.0 版之前,默认情况下使用内置参数。 + +### ssl_ecdh_curve + +|\-|说明| +|:------|:------| +|**语法**|**ssl_ecdh_curve** `curve`;| +|**默认**|ssl_ecdh_curve auto;| +|**上下文**|mail、server| +|**提示**|该指令在 1.1.0 和 1.0.6 版本中出现| + +为 ECDHE 算法指定一个椭圆曲线方案(`curve`)。 + +使用 OpenSSL 1.0.2 或更高版本时,可以指定多个曲线(1.11.0),例如: + +```nginx +ssl_ecdh_curve prime256v1:secp384r1; +``` + +当使用 OpenSSL 1.0.2 或更高版本或带有较旧版本的 `prime256v1` 时,特殊值 `auto`(1.11.0)指示 nginx 使用内置在 OpenSSL 库中的列表。 + +> 在 1.11.0 版之前,默认使用 `prime256v1` 曲线。 + +### ssl_password_file + +|\-|说明| +|:------|:------| +|**语法**|**ssl_password_file** `file`;| +|**默认**|——| +|**上下文**|mail、server| +|**提示**|该指令在 1.7.3 版本中出现| + +指定一个保存有[密钥](#ssl_certificate_key)密码的文件,每个密码独占一行。 加载密钥时依次尝试使用这些密码。 + +例: + +```nginx +mail { + ssl_password_file /etc/keys/global.pass; + ... + + server { + server_name mail1.example.com; + ssl_certificate_key /etc/keys/first.key; + } + + server { + server_name mail2.example.com; + + # named pipe can also be used instead of a file + ssl_password_file /etc/keys/fifo; + ssl_certificate_key /etc/keys/second.key; + } +} +``` + +### ssl_prefer_server_ciphers + +|\-|说明| +|:------|:------| +|**语法**|**ssl_prefer_server_ciphers** `on` | `off`;| +|**默认**|ssl_prefer_server_ciphers off;| +|**上下文**|mail、server| + +指定当使用 SSLv3 和 TLS 协议时,服务器加密算法应优先于客户端加密算法。 + +### ssl_protocols + +|\-|说明| +|:------|:------| +|**语法**|**ssl** `[SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3]`;| +|**默认**|sssl_protocols TLSv1 TLSv1.1 TLSv1.2;| +|**上下文**|mail、server| + +启用指定的协议。 + +> `TLSv1.1` 和 `TLSv1.2` 参数(1.1.13、1.0.12)仅在使用 OpenSSL 1.0.1 或更高版本时有效。 + +> `TLSv1.3` 参数(1.13.0)仅在 OpenSSL 1.1.1 构建时使用了 TLSv1.3 支持有效。 + + +### ssl_session_cache + +|\-|说明| +|:------|:------| +|**语法**|**ssl_session_cache** `on` | `none` | `[builtin[:size]] [shared:name:size]`;| +|**默认**|ssl_session_cache none;| +|**上下文**|mail、server| + +设置存储会话参数的缓存的类型和大小。缓存可以是以下任何类型: + +- `off` + + 严格禁止使用会话缓存:nginx 明确告知客户端禁止重复使用会话。 + +- `none` + + 禁止使用会话缓存:nginx 告诉客户端会话可以重用,但实际上并没有在缓存中存储会话参数。 + +- `builtin` + + 内置的 OpenSSL 缓存,仅由一个 worker 进程使用。缓存大小在会话中指定。如果未指定大小,则默认为 20480 个会话。使用内置缓存可能导致内存碎片。 + +- `shared` + + 所有 worker 进程之间共享的缓存。缓存大小以字节为单位,一兆字节可以存储大约 4000 个会话。每个共享缓存都有一个任意的名称。相同名称的缓存可以在多个服务器中使用。 + +两种缓存类型可以同时使用,例如: + +```nginx +ssl_session_cache builtin:1000 shared:SSL:10m; +``` + +但仅使用共享缓存而不使用内置缓存,效率会更高。 + +### ssl_session_ticket_key + +|\-|说明| +|:------|:------| +|**语法**|**ssl_session_ticket_key** `file`;| +|**默认**|——| +|**上下文**|mail、server| +|**提示**|该指令在 1.5.7 版本中出现| + +设置一个带有用于加密和解密 TLS 会话票证的密钥文件。如果必须在多个服务器之间共享同一密钥,则该指令是必需的。默认情况下,使用随机生成的密钥。 + +如果指定了多个密钥,仅第一个密钥被用于加密 TLS 会话票证。可配置 key 轮转,例如: + +```nginx +ssl_session_ticket_key current.key; +ssl_session_ticket_key previous.key; +``` + +该文件(`file`)必须包含 80 或 48 个字节的随机数据,可以使用以下命令创建: + +``` +openssl rand 80> ticket.key +``` + +根据文件大小,使用 AES256(针对 80 字节的 key,1.11.8)或 AES128(针对 48 字节的 key)进行加密。 + +### ssl_session_tickets + +|\-|说明| +|:------|:------| +|**语法**|**ssl_session_tickets** `on` | `off`;| +|**默认**|ssl_session_tickets on;| +|**上下文**|mail、server| +|**提示**|该指令在 1.5.9 版本中出现| + +通过 [TLS 会话票证](https://tools.ietf.org/html/rfc5077)启用或禁用会话复用。 + +### ssl_session_timeout + +|\-|说明| +|:------|:------| +|**语法**|**ssl_session_timeout** `time`;| +|**默认**|ssl_session_timeout 5m;| +|**上下文**|mail、server| + +指定客户端可以重用会话参数的时间。 + +### ssl_trusted_certificate + +|\-|说明| +|:------|:------| +|**语法**|**ssl_trusted_certificate** `file`;| +|**默认**|——| +|**上下文**|mail、server| +|**提示**|该指令在 1.7.11 版本中出现| + +指定一个带有用于[验证](#ssl_verify_client)客户端证书的 PEM 格式的受信任 CA 证书文件。 + +与 [ssl_client_certificate](#ssl_client_certificate) 设置的证书相反,这些证书的列表不会发送给客户端。 + +### ssl_verify_client + +|\-|说明| +|:------|:------| +|**语法**|**ssl_verify_client** `on` | `none` | `optional` | `optional_no_ca`;| +|**默认**|ssl_verify_client off;| +|**上下文**|mail、server| +|**提示**|该指令在 1.7.11 版本中出现| + +启用客户端证书的验证。验证结果在[身份验证](ngx_mail_auth_http_module.md#auth_http)请求的 **Auth-SSL-Verify** 头中传递。 + +`optional` 参数请求客户端证书并验证该证书是否存在。 + +`optional_no_ca` 参数请求客户端证书,但不需要由受信任的 CA 证书对其进行签名,适合在 nginx 外部的服务执行实际证书验证的情况下使用。通过[发送](ngx_mail_auth_http_module.md#auth_http_pass_client_cert)到身份验证服务器的请求可以访问证书的内容。 + +### ssl_verify_depth + +|\-|说明| +|:------|:------| +|**语法**|**ssl_verify_depth** `number`;| +|**默认**|ssl_verify_depth 1;| +|**上下文**|mail、server| +|**提示**|该指令在 1.7.11 版本中出现| + +设置客户端证书链的验证深度。 + +### starttls + +|\-|说明| +|:------|:------| +|**语法**|**starttls** `on` | `off` | `only`;| +|**默认**|starttls off;| +|**上下文**|mail、server| + +- `on` + + 允许对 POP3 使用 `STLS` 命令,对 IMAP 和 SMTP 使用 `STARTTLS` 命令 + +- `off` + + 拒绝使用 `STLS` 和 `STARTTLS` 命令 + +- `only` + + 要求初步的 TLS 转换 + +## 原文档 + +- [http://nginx.org/en/docs/mail/ngx_mail_ssl_module.html](http://nginx.org/en/docs/mail/ngx_mail_ssl_module.html) diff --git "a/\346\250\241\345\235\227\345\217\202\350\200\203/stream/ngx_stream_keyval_module.md" "b/\346\250\241\345\235\227\345\217\202\350\200\203/stream/ngx_stream_keyval_module.md" new file mode 100644 index 0000000..cfaa327 --- /dev/null +++ "b/\346\250\241\345\235\227\345\217\202\350\200\203/stream/ngx_stream_keyval_module.md" @@ -0,0 +1,91 @@ +# ngx_stream_keyval_module + +- [示例配置](#example_configuration) +- [指令](#directives) + - [keyval](#keyval) + - [keyval_zone](#keyval_zone) + +`ngx_stream_keyval_module` 模块(1.13.7)可用于创建变量,变量的值从由 [API](ngx_http_api_module.md#stream_keyvals_) 管理的键值对中获取。 + +> 此模块为[商业订阅](http://nginx.com/products/?_ga=2.203887064.99786210.1588592638-1615340879.1588592638)部分。 + + + +## 示例配置 + +```nginx +http { + + server { + ... + location /api { + api write=on; + } + } +} + +stream { + + keyval_zone zone=one:32k state=one.keyval; + keyval $ssl_server_name $name zone=one; + + server { + listen 12345 ssl; + proxy_pass $name; + ssl_certificate /usr/local/nginx/conf/cert.pem; + ssl_certificate_key /usr/local/nginx/conf/cert.key; + } +} +``` + + + +## 指令 + +### keyval + +|\-|说明| +|:------|:------| +|**语法**|**keyval** `key $variable zone=name`;| +|**默认**|——| +|**上下文**|stream| + +创建一个新的 `$variable`,其值在键值数据库中通过 key 查找。匹配规则由 [keyval_zone](#keyval_zone) 指令的 [type](#keyval_type) 参数定义。数据库存储在 `zone` 参数指定的共享内存区域中。 + +### keyval_zone + +|\-|说明| +|:------|:------| +|**语法**|**keyval_zone** `zone=name:size [state=file] [timeout=time] [type=string\|ip\|prefix] [sync]`;| +|**默认**|——| +|**上下文**|stream| + +设置维持键值数据库的共享内存区域的名称(`name`)和大小(`size`)。键值对通过 [API](ngx_http_api_module.md#stream_keyvals_) 进行管理。 + +可选的 `state` 参数指定一个文件(`file`),该文件以 JSON 格式保存键值数据库的当前状态,并在重新启动 nginx 时保持不变。 + +可选的 `timeout` 参数(1.15.0)设置将键值对从区域中删除的时间。 + +可选的 `type` 参数(1.17.1)激活一个额外的索引,该索引针对某种类型的键匹配进行了优化,匹配规则在计算[键值](#keyval) `$variable` 时定义。 + +> 索引存储在相同的共享存储区中,因此需要额外的存储。 + +- `type=string` + + 默认配置,不启用索引;使用记录 key 和一个搜索 key 的完全匹配来执行变量查找 + +- `type=ip` + + 搜索 key 是 IPv4 或 IPv6 地址或 CIDR 范围的文字表示;要匹配记录 key,搜索 key 必须属于记录 key 指定的子网或与 IP 地址完全匹配 + +- `type=prefix` + + 使用记录 key 和搜索 key 的前缀匹配(1.17.5)执行变量查找;要与记录 key 匹配,记录 key 必须是搜索 key 的前缀 + +可选的 `sync` 参数(1.15.0)启用共享内存区域[同步](ngx_stream_zone_sync_module.md#zone_sync)。同步要求设置超时(`timeout`)参数。 + +> 如果启用了同步,则将仅在目标群集节点上执行键值对(无论是[一个](ngx_http_api_module.md#patchStreamKeyvalZoneKeyValue)还是[全部](ngx_http_api_module.md#deleteStreamKeyvalZoneData))的删除操作。经过 `timeout` 时间后,将删除其他群集节点上相同的键值对。 + +## 原文档 + +- [http://nginx.org/en/docs/stream/ngx_stream_keyval_module.html](http://nginx.org/en/docs/stream/ngx_stream_keyval_module.html) diff --git "a/\346\250\241\345\235\227\345\217\202\350\200\203/stream/ngx_stream_proxy_module.md" "b/\346\250\241\345\235\227\345\217\202\350\200\203/stream/ngx_stream_proxy_module.md" new file mode 100644 index 0000000..1e3bffe --- /dev/null +++ "b/\346\250\241\345\235\227\345\217\202\350\200\203/stream/ngx_stream_proxy_module.md" @@ -0,0 +1,420 @@ +# ngx_stream_proxy_module + +- [示例配置](#example_configuration) +- [指令](#directives) + - [proxy_bind](#proxy_bind) + - [proxy_buffer_size](#proxy_buffer_size) + - [proxy_connect_timeout](#proxy_connect_timeout) + - [proxy_download_rate](#proxy_download_rate) + - [proxy_next_upstream](#proxy_next_upstream) + - [proxy_next_upstream_timeout](#proxy_next_upstream_timeout) + - [proxy_next_upstream_tries](#proxy_next_upstream_tries) + - [proxy_pass](#proxy_pass) + - [proxy_protocol](#proxy_protocol) + - [proxy_requests](#proxy_requests) + - [proxy_responses](#proxy_responses) + - [proxy_session_drop](#proxy_session_drop) + - [proxy_socket_keepalive](#proxy_socket_keepalive) + - [proxy_ssl](#proxy_ssl) + - [proxy_ssl_certificate](#proxy_ssl_certificate) + - [proxy_ssl_certificate_key](#proxy_ssl_certificate_key) + - [proxy_ssl_ciphers](#proxy_ssl_ciphers) + - [proxy_ssl_crl](#proxy_ssl_crl) + - [proxy_ssl_name](#proxy_ssl_name) + - [proxy_ssl_password_file](#proxy_ssl_password_file) + - [proxy_ssl_protocols](#proxy_ssl_protocols) + - [proxy_ssl_server_name](#proxy_ssl_server_name) + - [proxy_ssl_session_reuse](#proxy_ssl_session_reuse) + - [proxy_ssl_trusted_certificate](#proxy_ssl_trusted_certificate) + - [proxy_ssl_verify](#proxy_ssl_verify) + - [proxy_ssl_verify_depth](#proxy_ssl_verify_depth) + - [proxy_timeout](#proxy_timeout) + - [proxy_upload_rate](#proxy_upload_rate) + +`ngx_stream_proxy_module` 模块(1.9.0)允许通过 TCP、UDP(1.9.13)和 UNIX 域套接字代理数据流。 + + + +## 示例配置 + +```nginx +server { + listen 127.0.0.1:12345; + proxy_pass 127.0.0.1:8080; +} + +server { + listen 12345; + proxy_connect_timeout 1s; + proxy_timeout 1m; + proxy_pass example.com:12345; +} + +server { + listen 53 udp reuseport; + proxy_timeout 20s; + proxy_pass dns.example.com:53; +} + +server { + listen [::1]:12345; + proxy_pass unix:/tmp/stream.socket; +} +``` + + + +## 指令 + +### proxy_bind + +|\-|说明| +|------:|------| +|**语法**|**proxy_bind** `address [transparent]` | `off`;| +|**默认**|——| +|**上下文**|stream、server| +|**提示**|该指令在 1.9.2 版本中出现| + +使到被代理服务器的出站连接源自指定的本地 IP 地址(`address`)。参数值可以包含变量(1.11.2)。特殊值 `off` 指定不继承上级 `proxy_bind` 指令配置,这使系统可以自动分配本地 IP 地址。 + +`transparent` 参数(1.11.0)允许到被代理服务器的出站连接源自非本地 IP 地址,例如,来自一个客户端的真实 IP 地址: + +```nginx +proxy_bind $remote_addr transparent; +``` + +为了使此参数生效,通常必须使用[超级用户特权](../核心功能.md#user)运行 nginx worker 进程。在 Linux上,如果指定了 `transparent` 则不需要(1.13.8),worker 进程从 master 进程继承 `CAP_NET_RAW` 能力。还需要配置内核路由表以拦截来自被代理服务器的网络流量。 + +### proxy_buffer_size + +|\-|说明| +|------:|------| +|**语法**|**limit_conn_log_level** `size`;| +|**默认**|proxy_buffer_size 16k;| +|**上下文**|stream、server| +|**提示**|该指令在 1.9.4 版本中出现| + +设置读取被代理服务器数据的缓冲区的大小(`size`)。也用于设置读取客户端数据的缓冲区的大小(`size`)。 + +### proxy_connect_timeout + +|\-|说明| +|------:|------| +|**语法**|**proxy_connect_timeout** `time`;| +|**默认**|proxy_connect_timeout 60s;| +|**上下文**|stream、server| + +设置与被代理服务器建立连接的超时时间。 + +### proxy_download_rate + +|\-|说明| +|------:|------| +|**语法**|**proxy_download_rate** `rate`;| +|**默认**|proxy_download_rate 0;| +|**上下文**|stream、server| +|**提示**|该指令在 1.9.3 版本中出现| + +限制读取被代理服务器数据的速率。`rate` 以每秒字节数指定。零值禁用速率限制。该限制是针对每个连接设置的,因此,如果 nginx 同时打开两个与被代理服务器的连接,则总速率将是指定限制速率的两倍。 + +参数值可以包含变量(1.17.0)。如果需要根据特定条件限制速率,可参考以下配置示例: + +```nginx +map $slow $rate { + 1 4k; + 2 8k; +} + +proxy_download_rate $rate; +``` + +### proxy_next_upstream + +|\-|说明| +|------:|------| +|**语法**|**proxy_next_upstream** `on` | `off`;| +|**默认**|proxy_next_upstream on;| +|**上下文**|stream、server| + +当连接无法与某个被代理服务器建立连接时,是否将客户端连接传递给下一个服务器。 + +将连接传递到下一个服务器可能会受到[尝试次数](#proxy_next_upstream_tries)和[时间](#proxy_next_upstream_timeout)的限制。 + +### proxy_next_upstream_timeout + +|\-|说明| +|------:|------| +|**语法**|**proxy_next_upstream_timeout** `time`;| +|**默认**|proxy_next_upstream_timeout 0;| +|**上下文**|stream、server| + +设置将连接传递到[下一个服务器](#proxy_next_upstream)的超时时间。`0` 值关闭此限制。 + +### proxy_next_upstream_tries + +|\-|说明| +|------:|------| +|**语法**|**proxy_next_upstream_tries** `number`;| +|**默认**|proxy_next_upstream_tries 0;| +|**上下文**|stream、server| + +设置将连接传递到[下一个服务器](#proxy_next_upstream)的尝试次数。`0` 值关闭此限制。 + +### proxy_pass + +|\-|说明| +|------:|------| +|**语法**|**proxy_pass** `address`;| +|**默认**|——| +|**上下文**|server| + +设置被代理服务器的地址。该地址可以指定为一个域名或 IP 地址以及端口: + +```nginx +proxy_pass localhost:12345; +``` + +或作为 UNIX 域套接字路径: + +```nginx +proxy_pass unix:/tmp/stream.socket; +``` + +如果一个域名解析为多个地址,则所有这些地址都将以轮询的方式使用。另外,可以将地址指定为一个[服务器组](ngx_stream_upstream_module.md)。 + +也可以使用变量(1.11.3)指定地址: + +```nginx +proxy_pass $upstream; +``` + +在这种情况下,在配置的[服务器组](ngx_stream_upstream_module.md)中查找服务器名称,如果找不到,则使用一个 [resolver](ngx_stream_core_module.md#resolver)确定服务器名称。 + +### proxy_protocol + +|\-|说明| +|------:|------| +|**语法**|**proxy_protocol** `on` | `off`;| +|**默认**|proxy_protocol off;| +|**上下文**|stream、server| +|**提示**|该指令在 1.9.2 版本中出现| + +为到被代理服务器的连接启用 [PROXY 协议](http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt)。 + +### proxy_requests + +|\-|说明| +|------:|------| +|**语法**|**proxy_requests** `number`;| +|**默认**|proxy_requests 0;| +|**上下文**|stream、server| +|**提示**|该指令在 1.15.7 版本中出现| + +设置丢弃客户端和现有 UDP 流会话之间绑定的客户端数据报的数量。在收到指定数量的数据报后,来自同一客户端的下一个数据报将启动一个新会话。当所有客户端数据报都发送到被代理服务器并接收到预期的[响应](#proxy_responses)数时,或者达到[超时时间](#proxy_timeout)时,会话将终止。 + +### proxy_responses + +|\-|说明| +|------:|------| +|**语法**|**proxy_responses** `number`;| +|**默认**|——| +|**上下文**|stream、server| +|**提示**|该指令在 1.9.13 版本中出现| + +如果使用 [UDP](ngx_stream_core_module.md#udp) 协议,设置响应客户端数据报中来自被代理服务器的数据报期望数。该数字用作会话终止的提示。默认情况下,数据报的数量不受限制。 + +如果指定零值,则不会响应。但如果收到响应并且会话仍未完成,则该响应将被处理。 + +### proxy_session_drop + +|\-|说明| +|------:|------| +|**语法**|**proxy_session_drop** `on` | `off`;| +|**默认**|proxy_session_drop off;| +|**上下文**|stream、server| +|**提示**|该指令在 1.15.8 版本中出现| + +设置在将被代理服务器从组中删除或标记为永久不可用后,是否可以终止与被代理服务器的所有会话。在[重新解析](#resolver)或使用了 API [`DELETE`](ngx_http_api_module.md#deleteStreamUpstreamServer) 命令时,可能会发生这种情况。如果服务器处于[不健康](ngx_stream_upstream_hc_module.md#health_check)状态或使用 API [PATCH](ngx_http_api_module.md#patchStreamUpstreamServer) 命令修改,服务器可标记为永久不可用。当为客户端或被代理服务器处理下一个读取或写入事件时,每个会话都会终止。 + +> 该指令为[商业订阅](http://nginx.com/products/?_ga=2.125901509.99786210.1588592638-1615340879.1588592638)部分。 + +### proxy_socket_keepalive + +|\-|说明| +|------:|------| +|**语法**|**proxy_socket_keepalive** `on` | `off`;| +|**默认**|proxy_socket_keepalive off;| +|**上下文**|stream、server| +|**提示**|该指令在 1.15.6 版本中出现| + +为到被代理服务器的出站连接配置 **TCP keepalive** 行为。默认情况下,操作系统的设置影响到套接字。如果指令设置为 `on` 值,则将为套接字打开 `SO_KEEPALIVE` 套接字选项。 + +### proxy_ssl + +|\-|说明| +|------:|------| +|**语法**|**proxy_ssl** `on` | `off`;| +|**默认**|proxy_ssl off;| +|**上下文**|stream、server| + +为到被代理服务器的连接启用 SSL/TLS 协议。 + +### proxy_ssl_certificate + +|\-|说明| +|------:|------| +|**语法**|**proxy_ssl_certificate** `file`;| +|**默认**|——| +|**上下文**|stream、server| + +指定一个 PEM 格式的证书文件,用于验证被代理服务器的身份。 + +### proxy_ssl_certificate_key + +|\-|说明| +|------:|------| +|**语法**|**proxy_ssl_certificate_key** `file`;| +|**默认**|——| +|**上下文**|stream、server| + +指定一个 PEM 格式的私钥文件,用于验证被代理服务器的身份。 + +### proxy_ssl_ciphers + +|\-|说明| +|------:|------| +|**语法**|**proxy_ssl_ciphers** `ciphers`;| +|**默认**|proxy_ssl_ciphers DEFAULT;| +|**上下文**|stream、server| + +指定连接到被代理服务器启用的密码算法。密码算法需要 OpenSSL 库支持。 + +可以使用 `openssl ciphers` 命令查看完整的算法支持列表。 + +### proxy_ssl_crl + +|\-|说明| +|------:|------| +|**语法**|**proxy_ssl_crl** `file`;| +|**默认**|——| +|**上下文**|stream、server| + +指定一个 PEM 格式的吊销证书(CRL)文件,用于[验证](#proxy_ssl_verify)被代理服务器的证书。 + +### proxy_ssl_name + +|\-|说明| +|------:|------| +|**语法**|**proxy_ssl_name** `name`;| +|**默认**|proxy_ssl_name 来自 proxy_pass 的 host;| +|**上下文**|stream、server| + +允许覆盖用于[验证](#proxy_ssl_verify)被代理服务器证书的服务器名称,并在与被代理服务器建立连接时[通过 SNI 传递](#proxy_ssl_server_name)。也可以使用变量(1.11.3)指定服务器名称。 + +默认情况下,使用 [proxy_pass](#proxy_pass) 地址的主机部分。 + +### proxy_ssl_password_file + +|\-|说明| +|------:|------| +|**语法**|**proxy_ssl_password_file** `file`;| +|**默认**|——| +|**上下文**|stream、server| + +指定一个保存有[密钥](#proxy_ssl_certificate_key)密码的文件,每个密码独占一行。加载密钥时依次尝试使用这些密码。 + +### proxy_ssl_protocols + +|\-|说明| +|------:|------| +|**语法**|**proxy_ssl_protocols** `[SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3]`;| +|**默认**|proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;| +|**上下文**|stream、server| + +为到被代理服务器的连接启用指定协议。 + +### proxy_ssl_server_name + +|\-|说明| +|------:|------| +|**语法**|**proxy_ssl_server_name** `on` | `off`;| +|**默认**|proxy_ssl_server_name off;| +|**上下文**|stream、server| + +与被代理服务器建立连接时,启用或禁用通过 [TLS 服务器名称指示扩展](http://en.wikipedia.org/wiki/Server_Name_Indication)(SNI、RFC 6066)传递服务器名称。 + +### proxy_ssl_session_reuse + +|\-|说明| +|------:|------| +|**语法**|**proxy_ssl_session_reuse** `on` | `off`;| +|**默认**|proxy_ssl_session_reuse on;| +|**上下文**|stream、server| + +在使用被代理服务器时是否可以重用 SSL 会话。如果日志中出现错误 `SSL3_GET_FINISHED:digest check failed`,请尝试禁用会话重用。 + +### proxy_ssl_trusted_certificate + +|\-|说明| +|------:|------| +|**语法**|**proxy_ssl_trusted_certificate** `file`;| +|**默认**|——| +|**上下文**|stream、server| + +指定一个 PEM 格式的可信 CA 证书文件,该证书用于[验证](#proxy_ssl_verify)被代理服务器的证书。 + +### proxy_ssl_verify + +|\-|说明| +|------:|------| +|**语法**|**proxy_ssl_verify** `on` | `off`;| +|**默认**|proxy_ssl_verify off;| +|**上下文**|stream、server| + +启用或禁用被代理服务器证书验证。 + +### proxy_ssl_verify_depth + +|\-|说明| +|------:|------| +|**语法**|**proxy_ssl_verify_depth** `number`;| +|**默认**|proxy_ssl_verify_depth 1;| +|**上下文**|stream、server| + +设置被代理服务器证书链验证深度。 + +### proxy_timeout + +|\-|说明| +|------:|------| +|**语法**|**proxy_timeout** `timeout`;| +|**默认**|proxy_timeout 10m;| +|**上下文**|stream、server| + +设置客户端或被代理服务器连接两次连续读取或写入操作之间的超时时间(`timeout`)。如果在此时间内没有数据传输,则连接将关闭。 + +### proxy_upload_rate + +|\-|说明| +|------:|------| +|**语法**|**proxy_upload_rate** `rate`;| +|**默认**|proxy_upload_rate 0;| +|**上下文**|stream、server| +|**提示**|该指令在 1.9.3 版本中出现| + +限制读取客户端数据的速率。该速率以每秒字节数指定。零值禁用速率限制。该限制只针对单个连接,因此,如果客户端同时打开两个连接,则总速率将是指定限制速率的两倍。 + +参数值可以包含变量(1.17.0)。如果需要根据特定条件设置限制速率,可参考以下配置示例: + +```nginx +map $slow $rate { + 1 4k; + 2 8k; +} + +proxy_upload_rate $rate; +``` + +## 原文档 + +[http://nginx.org/en/docs/stream/ngx_stream_proxy_module.html](http://nginx.org/en/docs/stream/ngx_stream_proxy_module.html) \ No newline at end of file diff --git "a/\346\250\241\345\235\227\345\217\202\350\200\203/stream/ngx_stream_upstream_module.md" "b/\346\250\241\345\235\227\345\217\202\350\200\203/stream/ngx_stream_upstream_module.md" new file mode 100644 index 0000000..63d35cb --- /dev/null +++ "b/\346\250\241\345\235\227\345\217\202\350\200\203/stream/ngx_stream_upstream_module.md" @@ -0,0 +1,350 @@ +# ngx_stream_upstream_module + +- [示例配置](#example_configuration) +- [指令](#directives) + - [upstream](#upstream) + - [server](#server) + - [zone](#zone) + - [state](#state) + - [hash](#hash) + - [least_conn](#least_conn) + - [least_time](#least_time) + - [random](#random) + - [resolver](#resolver) + - [resolver_timeout](#resolver_timeout) +- [内部变量](#embedded_variables) + +`ngx_stream_upstream_module` 模块(1.9.0)用于定义可以由 [proxy_pass](ngx_stream_proxy_module.md#proxy_pass) 指令引用的服务器组。 + + + +## 示例配置 + +```nginx +upstream backend { + hash $remote_addr consistent; + + server backend1.example.com:12345 weight=5; + server backend2.example.com:12345; + server unix:/tmp/backend3; + + server backup1.example.com:12345 backup; + server backup2.example.com:12345 backup; +} + +server { + listen 12346; + proxy_pass backend; +} +``` + +拥有定期运行[健康检查](ngx_stream_upstream_hc_module.md)的动态可配置组为[商业订阅](http://nginx.com/products/?_ga=2.130645319.99786210.1588592638-1615340879.1588592638)部分: + +```nginx +resolver 10.0.0.1; + +upstream dynamic { + zone upstream_dynamic 64k; + + server backend1.example.com:12345 weight=5; + server backend2.example.com:12345 fail_timeout=5s slow_start=30s; + server 192.0.2.1:12345 max_fails=3; + server backend3.example.com:12345 resolve; + server backend4.example.com service=http resolve; + + server backup1.example.com:12345 backup; + server backup2.example.com:12345 backup; +} + +server { + listen 12346; + proxy_pass dynamic; + health_check; +} +``` + + + +## 指令 + +### upstream + +|\-|说明| +|------:|------| +|**语法**|**upstream** `name { ... }`;| +|**默认**|——| +|**上下文**|stream| + +定义一组服务器。服务器可以在不同的端口上监听。此外,可以将监听 TCP 和 UNIX 域套接字的服务器混合使用。 + +示例: + +```nginx +upstream backend { + server backend1.example.com:12345 weight=5; + server 127.0.0.1:12345 max_fails=3 fail_timeout=30s; + server unix:/tmp/backend2; + server backend3.example.com:12345 resolve; + + server backup1.example.com:12345 backup; +} +``` + +默认使用加权轮询均衡算法在服务器间分配连接。在上面的示例中,每 7 个连接将如下分配:5 个连接转到 `backend1.example.com:12345`,一个连接到第二个和第三个服务器。如果在与服务器通信期间发生错误,则连接将被传递到下一个服务器,依此类推,直到尝试完所有正常运行的服务器为止。如果与所有服务器的通信都失败,则连接将关闭。 + +### server + +|\-|说明| +|------:|------| +|**语法**|**server** `address [parameters]`;| +|**默认**|——| +|**上下文**|upstream| + +定义服务器的地址(`address`)和其他参数。该地址可以指定为带有端口的域名或 IP 地址,也可以指定前缀为 `unix` 的 UNIX 域套接字路径。解析为多个 IP 地址的域名一次定义了多个服务器。 + +可以定义以下参数: + +- `weight=number` + + 设置服务器的权重,默认情况下为 1。 + +- `max_conns=number` + + 限制到被代理服务器的最大同时连接数(1.11.5)。默认值为零,表示没有限制。如果服务器组未驻留在[共享内存](#zone)中,则此限制在每个 worker 进程中均有效。 + + > 在 1.11.5 版本之前,此参数作为[商业订阅](http://nginx.com/products/?_ga=2.208745946.99786210.1588592638-1615340879.1588592638)部分。 + +- `max_fails=number` + + 设置在 `fail_timeout` 参数设置的时间内与服务器通信的失败尝试次数,以便认定服务器在 `fail_timeout` 参数设置的时间内不可用。默认情况下,失败尝试的次数设置为 1。零值将禁用尝试记录。在这里,当与服务器正在建立连接中,失败尝试将是一个错误或超时。 + +- `fail_timeout=time` + + 设置 + + - 在时间范围内与服务器通信的失败尝试达到指定次数,应将服务器视为不可用 + - 服务器被视为不可用的时长 + + 默认情况下,该参数设置为 10 秒。 + +- `backup` + + 将服务器标记为备用服务器。当主服务器不可用时,连接将传递到备用服务器。 + + > 该参数不能与 [hash](#hash) 和 [random](#random) 负载均衡算法一起使用。 + +- `down` + + 将服务器标记为永久不可用。 + +此外,以下参数作为[商业订阅](http://nginx.com/products/?_ga=2.134173126.99786210.1588592638-1615340879.1588592638)部分提供: + +- `resolve` + + 监视与服务器域名相对应的 IP 地址的更改,并自动修改 upstream 配置,而无需重新启动 nginx。服务器组必须驻留在[共享内存](#zone)中。 + + 为了使此参数生效,必须在 [stream](ngx_stream_core_module.md#resolver) 块或相应的 [upstream](#resolver) 块中指定 `resolver` 指令。 + +- `service=name` + + 启用 DNS [SRV](https://tools.ietf.org/html/rfc2782) 记录的解析并设置服务名称(1.9.13)。为了使此参数生效,必须为服务器指定 [resolve](#resolve) 参数,并指定不带端口号的主机名。 + + 如果服务名称不包含点(`.`),则构造符合 [RFC](https://tools.ietf.org/html/rfc2782) 的名称,并将 TCP 协议添加到服务前缀。例如,要查找 `_http._tcp.backend.example.com` SRV 记录,必须指定指令: + + 如果服务名称包含一个或多个点(`.`),则通过将服务前缀和服务器名称结合在一起来构造名称。例如,要查找 `_http._tcp.backend.example.com` 和 `server1.backend.example.com` SRV 记录,必须指定指令: + + ```nginx + server backend.example.com service=_http._tcp resolve; + server example.com service=server1.backend resolve; + ``` + + 最高优先级的 SRV 记录(具有相同的最低优先级值的记录)被解析为主服务器,其余的 SRV 记录被解析为备用服务器。如果为服务器指定了 [backup](#backup) 参数,则将高优先级 SRV 记录解析为备用服务器,其余的 SRV 记录将被忽略。 + +- `slow_start=time` + + 设置当服务器从非健康状态转为健康状态或一段时间[不可用](#fail_timeout)后转为可用状态,服务器将其权重从 0 恢复到原值的时间(`time`)。默认值为零,即禁用此功能。 + + > 该参数不能与 [hash](#hash) 和 [random](#random) 负载均衡算法一起使用。 + +如果组中只有一台服务器,则将忽略 `max_fails`、`fail_timeout` 和 `slow_start` 参数,这样的服务器将永远不会被视为不可用。 + +### zone + +|\-|说明| +|------:|------| +|**语法**|**zone** `name [size]`;| +|**默认**|——| +|**上下文**|upstream| + +定义共享内存区域的名称(`name`)和大小(`size`),以存储 worker 进程之间共享的组配置和运行时状态。多个组可共享同一区域。在这种情况下,仅指定一次大小就足够了。 + +另外,在[商业订阅](http://nginx.com/products/?_ga=2.171473384.99786210.1588592638-1615340879.1588592638)部分中,此类组允许更改组成员身份或修改特定服务器的设置,而无需重新启动 nginx。可通过 [API](../http/ngx_http_api_module.md) 模块(1.13.3)访问该配置。 + +> 在 1.13.3 版本之前,只能访问特殊的 location 来通过 [upstream_conf](../http/ngx_http_upstream_conf_module.md#upstream_conf) 处理。 + +### state + +|\-|说明| +|------:|------| +|**语法**|**state** `file`;| +|**默认**|——| +|**上下文**|upstream| +|**提示**|该指令在 1.9.7 版本中出现| + +指定一个文件用于保存动态可配置组的状态。 + +示例: + +```nginx +state /var/lib/nginx/state/servers.conf; # path for Linux +state /var/db/nginx/state/servers.conf; # path for FreeBSD +``` + +当前状态仅限于带有参数的服务器列表。解析配置时会读取该文件,并且每次更改 upstream 配置时都会[更新](../http/ngx_http_api_module.md#stream_upstreams_stream_upstream_name_servers_)该文件。应避免直接更改文件内容。该指令不能与 [server](#server) 指令一起使用。 + +> 在[配置重新加载](../../介绍/控制nginx.md#reconfiguration)或[二进制升级](../../介绍/控制nginx.md#upgrade)期间所做的更改可能会丢失。 + +> 该指令为[商业订阅](http://nginx.com/products/?_ga=2.128922308.99786210.1588592638-1615340879.1588592638)部分。 + +### hash + +|\-|说明| +|------:|------| +|**语法**|**hash** `key [consistent]`;| +|**默认**|——| +|**上下文**|upstream| + +指定服务器组的负载均衡算法,在该服务器组中,客户端——服务器的映射基于哈希键值(key/value)。key 可以包含文本、变量及其组合(1.11.2)。 用法示例: + +```nginx +hash $remote_addr; +``` + +请注意,从组中添加或删除服务器可能会导致大量 key 重新映射到其他服务器。该方法与 [Cache::Memcached](https://metacpan.org/pod/Cache::Memcached) Perl 库兼容。 + +如果指定了 `consistent` 参数,则将使用 [ketama](https://www.metabrew.com/article/libketama-consistent-hashing-algo-memcached-clients) 一致性哈希算法。该方法可确保在将服务器添加到组中或从组中删除服务器时,只有很少的 key 被重新映射到不同的服务器。这有助于缓存服务器实现更高的缓存命中率。该方法与 `ketama_points` 参数设置为 160 的 [Cache::Memcached::Fast](https://metacpan.org/pod/Cache::Memcached::Fast) Perl 库兼容。 + +### least_conn + +|\-|说明| +|------:|------| +|**语法**|**least_conn**;| +|**默认**|——| +|**上下文**|upstream| + +指定组使用的负载均衡算法,其将连接传递到活动连接数最少的服务器,同时要考虑服务器的权重。如果有多个这样的服务器,则依次使用加权轮询均衡算法进行尝试。 + +### least_time + +|\-|说明| +|------:|------| +|**语法**|**least_time** `connect` | `first_byte` | `last_byte` `[inflight]`;| +|**默认**|——| +|**上下文**|upstream| + +指定组应使用的负载均衡算法,其将连接传递到平均时间最少且活动连接数最少的服务器,同时考虑服务器的权重。如果有多个这样的服务器,则依次使用加权轮询均衡算法进行尝试。 + +如果指定了 `connect` 参数,则使用[连接](#var_upstream_connect_time)到 upstream 服务器的时间。如果指定了 `first_byte` 变量,则使用接收数据的[首字节](#var_upstream_first_byte_time)的时间。如果指定了 `last_byte`,则使用接收数据[尾字节](#var_upstream_session_time)的时间。如果指定了 `inflight` 参数(1.11.6),还将考虑不完整连接。 + +> 在 1.11.6 版本之前,默认情况下会考虑不完整的连接。 + +> 该指令作为[商业订阅](http://nginx.com/products/?_ga=2.162551156.99786210.1588592638-1615340879.1588592638)部分。 + +### random + +|\-|说明| +|------:|------| +|**语法**|**random** `[two [method]]`;| +|**默认**|——| +|**上下文**|upstream| +|**提示**|该指令在 1.15.1 版本中出现| + +指定组应使用的负载均衡算法,其将连接传递到随机选择的服务器,同时要考虑服务器的权重。 + +可选的两个参数指示 nginx 随机选择[两个](https://homes.cs.washington.edu/~karlin/papers/balls.pdf)服务器,然后使用指定的算法(`method`)选择一个服务器。默认方法是 `minimum_conn`,它将连接传递到活动连接数最少的服务器。 + +`minimum_time` 算法将连接传递到平均时间最少且活动连接数最少的服务器。如果指定了 `least_time=connect` 参数,则使用[连接](#var_upstream_connect_time)到 upstream 服务器的时间。如果指定了 `least_time=first_byte` 参数,则使用接收数据的[首字节](#var_upstream_first_byte_time)的时间。如果指定了 `least_time=last_byte`,如果指定了 `last_byte`,则使用接收数据[尾字节](#var_upstream_session_time)的时间。 + +> `least_time` 算法是[商业订阅](http://nginx.com/products/?_ga=2.200372710.99786210.1588592638-1615340879.1588592638)部分。 + +### resolver + +|\-|说明| +|------:|------| +|**语法**|**resolver** `address ... [valid=time] [ipv6=on\|off] [status_zone=zone]`;| +|**默认**|——| +|**上下文**|upstream| +|**提示**|该指令在 1.17.5 版本中出现| + +配置用于将 upstream 服务器的名称解析为地址的名称服务器,例如: + +```nginx +resolver 127.0.0.1 [::1]:5353; +``` + +可以将地址指定为域名或 IP 地址,配置一个可选端口。如果未指定端口,则使用 53 端口。以轮询算法查找名称服务器。 + +默认情况下,nginx 在解析时将同时查找 IPv4 和 IPv6 地址。如果不需要查找 IPv6 地址,则可以指定 `ipv6=off` 参数。 + +默认情况下,nginx 使用响应的 TTL 值缓存回复。可选的 `valid` 参数覆盖默认行为: + +```nginx +resolver 127.0.0.1 [::1]:5353 valid=30s; +``` + +> 为防止 DNS 欺骗,建议在一个受到保护的可信本地网络中配置 DNS 服务器。 + +可选的 `status_zone` 参数启用对指定区域中请求和响应的 DNS 服务器统计信息的[收集](../../http/ngx_http_api_module.md#resolvers_)。 + +> 该指令为[商业订阅](http://nginx.com/products/?_ga=2.175591914.99786210.1588592638-1615340879.1588592638)部分。 + +### resolver_timeout + +|\-|说明| +|------:|------| +|**语法**|**resolver_timeout** `time`;| +|**默认**|resolver_timeout 30s;| +|**上下文**|upstream| +|**提示**|该指令在 1.17.5 版本中出现| + +为名称解析设置一个超时时间,例如: + +```nginx +resolver_timeout 5s; +``` + +> 该指令为[商业订阅](http://nginx.com/products/?_ga=2.133192262.99786210.1588592638-1615340879.1588592638)部分。 + + + +## 内部变量 + +`ngx_stream_upstream_module` 模块支持以下内部变量: + +- `$upstream_addr` + + 保留 IP 地址和端口或 upstream 服务器的 UNIX 域套接字(1.11.4)路径。如果在代理过程中联系了多个服务器,则它们的地址用逗号分隔,例如 `192.168.1.1:12345, 192.168.1.2:12345, unix:/tmp/sock`。如果无法选择服务器,则该变量将保留服务器组的名称。 + +- `$upstream_bytes_received` + + 从 upstream 服务器收到的字节数(1.11.4)。来自多个连接的值使用逗号分隔,参考 `$upstream_addr` 变量中的地址。 + +- `$upstream_bytes_sent` + + 发送到 upstream 服务器的字节数(1.11.4)。来自多个连接的值使用逗号分隔,参考 `$upstream_addr` 变量中的地址。 + +- `$upstream_connect_time` + + 连接 upstream 服务器的时间(1.11.4),时间以毫秒为单位,以秒为单位。多个连接的时间用逗号分隔,参考 `$upstream_addr` 变量中的地址。 + +- `$upstream_first_byte_time` + + 接收数据的第一个字节的时间(1.11.4),时间以毫秒为单位,以秒为单位。多个连接的时间用逗号分隔,参考 `$upstream_addr` 变量中的地址。 + +- `$upstream_session_time` + + 会话持续时间,以毫秒为单位,以毫秒为单位(1.11.4)。多个连接的时间用逗号分隔,参考 `$upstream_addr` 变量中的地址。 + +## 原文档 + +[http://nginx.org/en/docs/stream/ngx_stream_upstream_module.html](http://nginx.org/en/docs/stream/ngx_stream_upstream_module.html) \ No newline at end of file