nginx中文文档-ngx_http_proxy_module(S-T)

此页面版本:2016-06-08
本文档包含以下指令:proxy_send_lowat、proxy_send_timeout、proxy_set_body、proxy_set_header、proxy_ssl_certificate、proxy_ssl_certificate_key、proxy_ssl_ciphers、proxy_ssl_crl、proxy_ssl_name、proxy_ssl_password_file、proxy_ssl_server_name、proxy_ssl_session_reuse、proxy_ssl_protocols、proxy_ssl_trusted_certificate、proxy_ssl_verify、proxy_ssl_verify_depth、proxy_store、proxy_store_access、proxy_temp_file_write_size、proxy_temp_path

proxy_send_lowat

语法:proxy_send_lowat size
默认:proxy_send_lowat 0
上下文:http, server, location

指令如果设置为非0值,nginx将会尝试使用kqueue方法的NOTE_LOWAT标志或SO_SNDLOWAT socket选项减少与外部被代理服务器的发送操作。
该指令在Linux、Solaris、Windows上忽略。

proxy_send_timeout

语法:proxy_send_timeout time
默认:proxy_send_timeout 60s
上下文:http, server, location

设置传输请求到被代理服务器的超时时间。超时时间设置为两次成功的写操作之间,而不是整个请求的传输。如果被代理服务器在这个时间内没有收到任何数据,连接将被关闭。

proxy_set_body

语法:proxy_set_body value
默认:—
上下文:http, server, location

允许重新定义传给被代理服务器的请求体,value可以包含文本、变量以及它们的混合。

proxy_set_header

语法:proxy_set_header field value
默认:proxy_set_header Host $proxy_host
proxy_set_header Connection close
上下文:http, server, location

允许重定义或追加请求的头域到被代理服务器。value可以包含文本、变量和它们的混合。当且仅当本层级中没有proxy_set_header时,指令会继承自上一层级。默认情况下,只有两个域重新定义:

proxy_set_header Host       $proxy_host;
proxy_set_header Connection close;

如果缓存启用,原始请求中的“If-Modified-Since”, “If-Unmodified-Since”, “If-None-Match”, “If-Match”, “Range”, 和 “If-Range”头域将不会发送给被代理服务器。
未变更的“Host”请求头域可以这样传递:
proxy_set_header Host $http_host;
但是,如果客户端请求头中没有这个字段,就不会传。这时最好用$host变量-它的值在请求头中没有“Host”字段时使用服务器名称:
proxy_set_header Host $host;
服务器名称可以跟端口一同传给被代理服务器:
proxy_set_header Host $host:$proxy_port;
如果请求头域是空字符串,则这个域不会被传给被代理服务器:
proxy_set_header Accept-Encoding "";

proxy_ssl_certificate

语法:proxy_ssl_certificate file
默认:—
上下文:http, server, location
版本:1.7.8+

定义一个PEM格式的证书文件用于HTTPS的认证。

proxy_ssl_certificate_key

语法:proxy_ssl_certificate_key file
默认:—
上下文:http, server, location
版本:1.7.8+

定义一个PEM格式的密钥文件用于HTTPS服务器认证。
值engine:name:id可以代替file(1.7.9+),从OpenSSL引擎name加载指定id的密钥。

proxy_ssl_ciphers

语法:proxy_ssl_ciphers ciphers
默认:proxy_ssl_ciphers DEFAULT
上下文:http, server, location
版本:1.5.6+

为发送给被代理HTTPS服务器请求指定可用的密码算法。密码算法可以使用OpenSSL库可理解的格式。
全部列表可以通过“openssl ciphers”命令查看。

proxy_ssl_crl

语法:proxy_ssl_crl file
默认:—
上下文:http, server, location
版本:1.7.0+

指定PEM格式的吊销证书文件,用于验证被代理服务器的证书。

proxy_ssl_name

语法:proxy_ssl_name name
默认:proxy_ssl_name $proxy_host
上下文:http, server, location
版本:1.7.0+

允许覆盖服务器名称,用于验证被代理HTTPS服务器的证书。
默认情况下,proxy_passURL的host部分会被使用。

proxy_ssl_password_file

语法:proxy_ssl_password_file file
默认:—
上下文:http, server, location
版本:1.7.8+

指定包含密钥密码的文件,每个密码单独定义在一行中。在加载密钥时会尝试密码。

proxy_ssl_server_name

语法:proxy_ssl_server_name on | off
默认:proxy_ssl_server_name off
上下文:http, server, location
版本:1.7.0+

启用或禁用当与被代理HTTPS服务器建立连接时通过TLS Server Name Indication扩展。

proxy_ssl_session_reuse

语法:proxy_ssl_session_reuse on | off
默认:proxy_ssl_session_reuse on
上下文:http, server, location

决定当与被代理服务器工作时,SSL会话是否能够重用。如果“SSL3_GET_FINISHED:digest check failed”错误出现在日志中,尝试禁用会话重用。

proxy_ssl_protocols

语法:proxy_ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]
默认:proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2
上下文:http, server, location
版本:1.5.6+

为发送给HTTPS服务器的请求启用指定的协议。

proxy_ssl_trusted_certificate

语法:proxy_ssl_trusted_certificate file
默认:—
上下文:http, server, location
版本:1.7.0+

指定一个PEM格式的可信CA证书文件,用于验证被代理HTTPS服务器的证书。

proxy_ssl_verify

语法:proxy_ssl_verify on | off
默认:proxy_ssl_verify off
上下文:http, server, location
版本:1.7.0+

启用或禁用验证被代理服务器证书功能。

proxy_ssl_verify_depth

语法:proxy_ssl_verify_depth number
默认:proxy_ssl_verify_depth 1
上下文:http, server, location
版本:1.7.0+

设置验证被代理HTTPS服务器的证书链深度。

proxy_store

语法:proxy_store on | off | string
默认:proxy_store off
上下文:http, server, location

启用保存文件到磁盘。on参数保存文件在相应alias或root指令的路径。off参数禁用保存文件。文件名可以显式的使用带参数的string:
proxy_store /data/www$original_uri;
文件的修改时间根据收到的响应头中的“Last-Modified”设置。响应先写到临时文件中,然后重命名。从0.8.9版本开始,临时文件和持久化存储文件可以放在不同的文件系统中。但需要知道的是,这种情况下在两个不同的文件系统中复制而不是简单的重命名操作。建议在同一个文件系统中给出临时目录和保存目录的位置。

指令可以用于创建本地静态文件的副本,例如:

location /images/ {
    root               /data/www;
    error_page         404 = /fetch$uri;
}

location /fetch/ {
    internal;

    proxy_pass         http://backend/;
    proxy_store        on;
    proxy_store_access user:rw group:rw all:r;
    proxy_temp_path    /data/temp;

    alias              /data/www/;
}

或这样:

location /images/ {
    root               /data/www;
    error_page         404 = @fetch;
}

location @fetch {
    internal;

    proxy_pass         http://backend;
    proxy_store        on;
    proxy_store_access user:rw group:rw all:r;
    proxy_temp_path    /data/temp;

    root               /data/www;
}

proxy_store_access

语法:proxy_store_access users:permissions
默认:proxy_store_access user:rw
上下文:http, server, location

设置新建的文件和目录的访问权限,如:
proxy_store_access user:rw group:rw all:r;
如果group或all的权限定义了,user权限可以忽略:
proxy_store_access group:rw all:r;

proxy_temp_file_write_size

语法:proxy_temp_file_write_size size
默认:proxy_temp_file_write_size 8k|16k
上下文:http, server, location

当从被代理服务器收到请求的缓冲区开启时,限制一次写入临时文件的数据大小。默认情况下,大小由proxy_buffer_size指令和proxy_buffers指令设置的两个缓冲区限制。临时文件的最大值由proxy_max_temp_file_size指令设置。

proxy_temp_path

语法:proxy_temp_path path [level1 [level2 [level3]]]
默认:proxy_temp_path proxy_temp
上下文:http, server, location

定义保存从被代理服务器收到数据临时文件的目录。超过三层的子目录可以用在指定目录之下。例如,下面的配置:
proxy_temp_path /spool/nginx/proxy_temp 1 2;
临时文件可能类似:
/spool/nginx/proxy_temp/7/45/00000123457
参见proxy_cache_path指令的use_temp_path参数。

内嵌变量
ngx_http_proxy_module模块支持内嵌变量,可以用于proxy_set_header组成头部:

$proxy_host
proxy_pass指令中定义的被代理服务器的名称和端口


$proxy_port
proxy_pass指令中定义的端口号,或协议的默认端口号


$proxy_add_x_forwarded_for
客户端“X-Forwarded-For”请求头域带$remote_addr变量追加到它后面,用逗号分隔。如果“X-Forwarded-For”没有出现在请求头,$proxy_add_x_forwarded_for变量等于$remote_addr变量的值。

nginx中文文档-ngx_http_proxy_module(P-R)

本文档包含以下指令:proxy_pass、proxy_pass_header、proxy_pass_request_body、proxy_pass_request_headers、proxy_read_timeout、proxy_redirect、proxy_request_buffering、

proxy_pass

语法:proxy_pass URL
默认:—
上下文:location, if in location, limit_except

设置被代理服务器的协议和地址,以及一个可选URI用于映射到location中。“http”和“https”可以作为协议指定。IP地址可以定义为一个域名或IP地址和一个可选的端口号:
proxy_pass http://localhost:8000/uri/;
或一个UNIX-domain socket路径:
proxy_pass http://unix:/tmp/backend.socket:/uri/;
如果域名解析成多个地址,则会使用轮询的方式使用。地址可以被定义为服务器组。
请求URI传给服务器如下:

  • 如果proxy_pass指令通过URI指定,当请求发送给服务器时,统一化的请求URI匹配location的部分会被指定的URI替换:
  • location /name/ {
        proxy_pass http://127.0.0.1/remote/;
    }
    
  • 如果proxy_pass没有指定URI,请求URI传送给服务器与客户端发送的形式相同,或是完整的统一化的URI:
location /some/path/ {
    proxy_pass http://127.0.0.1;
}

在1.1.12版本之前,如果proxy_pass没有指定URI,某些情况下原始的请求URI会被传递而不是处理过的URI。
有些情况下,请求URI被替换的部分不能够确定:

  • 当location使用正则表达式定义。这种情况下,指令应该不带URI
  • 当URI在代理location中使用rewrite指令改变,并且这个配置同时用于处理请求:
location /name/ {
    rewrite    /name/([^/]+) /users?name=$1 break;
    proxy_pass http://127.0.0.1;
}

这种情况下,定义在指令中的URI被忽略,然后全部被改变后的URI会传给服务器。
服务器的名称端口和URI可以使用变量:
proxy_pass http://$host$uri;
甚至可以这样:
proxy_pass $request;
这种情况下,服务器名称会在服务器组中查找,如果查不到,就会用resolver。
WebSocket代理需要特殊的配置,并从1.3.13版本开始支持。

proxy_pass_header

语法:proxy_pass_header field
默认:—
上下文:http, server, location

允许被禁用的头部从被代理服务器发送到客户端。

proxy_pass_request_body

语法:proxy_pass_request_body on | off
默认:proxy_pass_request_body on
上下文:http, server, location

声明原始请求体是否会被传给被代理服务器。

location /x-accel-redirect-here/ {
    proxy_method GET;
    proxy_pass_request_body off;
    proxy_set_header Content-Length "";

    proxy_pass ...
}

参见proxy_set_header和proxy_pass_request_headers指令。

proxy_pass_request_headers

语法:proxy_pass_request_headers on | off
默认:proxy_pass_request_headers on
上下文:http, server, location

声明原始请求头是否会传给被代理服务器。

location /x-accel-redirect-here/ {
    proxy_method GET;
    proxy_pass_request_headers off;
    proxy_pass_request_body off;

    proxy_pass ...
}

参见proxy_set_header和proxy_pass_request_body指令。

proxy_read_timeout

语法:proxy_read_timeout time
默认:proxy_read_timeout 60s
上下文:http, server, location

定义从被代理服务器读取响应的超时时间。超时时间设置为两次成功的读操作之间,不是整个响应的传输。如果被代理服务器在这个时间没有传输任何数据,连接将被关闭。

proxy_redirect

语法:proxy_redirect default
proxy_redirect off
proxy_redirect redirect replacement
默认:proxy_redirect default
上下文:http, server, location

设置被代理服务器响应头中“Location”和“Refresh”头域需要改变的文本。假设被代理服务器返回了一个头域“Location: http://localhost:8000/two/some/uri/”。指令
proxy_redirect http://localhost:8000/two/ http://frontend/one/;
将会重写这个字符串为“Location: http://frontend/one/some/uri/”。
一个服务器名称可以在replacement字符串中省略:
proxy_redirect http://localhost:8000/two/ /;
主服务器的名称和端口如果不是80会被加上。
默认替换由default参数指定,会使用location的参数和proxy_pass指令。下面两个配置是等价的:

location /one/ {
    proxy_pass     http://upstream:port/two/;
    proxy_redirect default;
location /one/ {
    proxy_pass     http://upstream:port/two/;
    proxy_redirect http://upstream:port/two/ /one/

如果proxy_pass使用了变量,不能用default参数。
replacement字符串可以包含变量:
proxy_redirect http://localhost:8000/ http://$host:$server_port/;
redirect也可以包含变量(1.1.11+):
proxy_redirect http://$proxy_host:8000/ /;
指令可以使用正则表达式(1.1.11+)。这种情况下,redirect应该以“~”开头表示大小写敏感,或以“~*”开头表示大小写不敏感。正则表达式可以包含名称和位置捕获,replacement可以引用它们:

proxy_redirect ~^(http://[^:]+):\d+(/.+)$ $1$2;
proxy_redirect ~*/user/([^/]+)/(.+)$      http://$1.example.com/$2;

可以有多个proxy_redirect指令:

proxy_redirect default;
proxy_redirect http://localhost:8000/  /;
proxy_redirect http://www.example.com/ /;

off参数取消当前级别中所有proxy_redirect产生的影响:

proxy_redirect off;
proxy_redirect default;
proxy_redirect http://localhost:8000/  /;
proxy_redirect http://www.example.com/ /;

使用这个指令,可能会在被代理服务器的相对重定向中添加host名称:
proxy_redirect / /;

proxy_request_buffering

语法:proxy_request_buffering on | off
默认:proxy_request_buffering on
上下文:http, server, location
版本:1.7.11+

启用或禁用客户端请求体的缓冲区。
当缓冲区启用,整个请求体会在发送到被代理服务器之前从客户端完全读取。
当缓冲区禁用,请求体在收到后立即发送给被代理服务器。这种情况下,如果nginx已经开始发送请求体就不能将请求发到下一个服务器上。
当使用HTTP1.1chunked传输编码发送原始请求体时,请求体将会被缓冲不管指令的值,除非启用HTTP1.1代理。