原创文章,转载请指明出处并保留原文url地址
本文主要针对nginx的几个主要proxy指令做一个简单的整理,另外部分指令做了实际测试,本文具体包括如下指令:
proxy_max_temp_file_size,proxy_method,proxy_next_upstream,proxy_pass,proxy_pass_header
17. proxy_max_temp_file_size
syntax:
| proxy_max_temp_file_size size;
|
default:
| proxy_max_temp_file_size 1024m;
|
context:
| http, server, location
|
当从被代理的服务器接收的响应的缓冲被允许的时侯,当整个响应不合适存储到内存中时,有一部分数据将被存储到磁盘文件中,内存存储buffer的设置是根据proxy_buffer_size及proxy_buffers指令进行设置。proxy_max_temp_file_size指令设置最大的临时文件存储的尺寸。数据在写入临时文件中,一次写入多少数据是通过 proxy_temp_file_write_size 进行设置的。当proxy_max_temp_file_size指令的数值是0时关闭响应数据存储到临时文件的功能。
When buffering of responses from the proxied server is enabled, and the whole response does not fit into memory buffers set by the proxy_buffer_size and proxy_buffers directives, part of a response can be saved to a temporary file. This directive sets the maximum size of a temporary file. The size of data written to a temporary file at a time is set by the proxy_temp_file_write_size directive.
Value of zero disables buffering of responses to temporary files.
18. proxy_method
syntax:
| proxy_method method;
|
default:
| —
|
context:
| http, server, location
|
指定的HTTP请求转发到代理服务器的方法代替客户端请求中使用的方法。
Specifies the HTTP method to use in requests forwarded to the proxied server instead of the method from the client request.
19. proxy_next_upstream
syntax:
| proxy_next_upstream error | timeout | invalid_header
| http_500 | http_502 | http_503
| http_504 | http_404 | off ...;
|
default:
| proxy_next_upstream error timeout;
|
context:
| http, server, location
|
指定在那种情况下请求应该被传递到下一个服务器上,包括以下情况:
Error
当nginx同被代理的服务器建立连接,传送请求,或者读取一个响应过程中发生错误
Timeout
当nginx同被代理的服务器建立连接,传送请求,或者读取一个响应过程中发生超时事件
invalid_header
当被代理的服务器返回空的或者非法的响应时
http_500
当被代理的服务器返回500响应码时
http_503
当被代理的服务器返回503响应码时
http_504
当被代理的服务器返回504响应码时
http_404
当被代理的服务器返回404响应码时
off
禁止传递请求到下一个服务器
需要注意的是:在nginx还没有传递数据给客户端的过程中发生错误,nginx可以通过这个指令将请求等转发给下一个服务器。但是如果错误发生在nginx发送响应给客户端过程中,这个转发是不可能的。
It should be understood that passing a request to the next server is only possible if a client was not sent anything yet. That is, if an error or a timeout occurs in the middle of transferring a response, fixing this is impossible.
Specifies in which cases a request should be passed to the next server:
error
an error occurred while establishing a connection with the server, passing it a request, or reading the response header;
timeout
a timeout has occurred while establishing a connection with the server, passing it a request, or reading the response header;
invalid_header
a server returned empty or invalid response;
http_500
a server returned a response with the code 500;
http_502
a server returned a response with the code 502;
http_503
a server returned a response with the code 503;
http_504
a server returned a response with the code 504;
http_404
a server returned a response with the code 404;
off
disables passing a request to the next server.
It should be understood that passing a request to the next server is only possible if a client was not sent anything yet. That is, if an error or a timeout occurs in the middle of transferring a response, fixing this is impossible.
20. proxy_pass
syntax:
| proxy_pass URL;
|
default:
| —
|
context:
| location, if in location, limit_except
|
设置被代理服务器的协议和地址,一个可选的uri来确定那个location应该被选中。协议可以被指定为http或者https。地址能被指定为域名或者ip地址,端口号可选。
proxy_pass http://localhost:8000/uri/;
或者采用unix的domain socket规范的地址,
proxy_pass http://unix:/tmp/backend.socket:/uri/;
如果一个域名被解析成多个ip地址,则这些ip地址将被循环使用,另外还可以使用server组(反向代理的方式)作为代理地址。
如果一个请求的URI被传递给server(被代理的服务器),将遵照下面规则:
如果proxy_pass指令携带有URI,当请求传递给被代理的服务器时,那些同location指令匹配的经过规范化处理后的uri将被指令中的相关部分替代。
location /name/ {
proxy_pass http://127.0.0.1/remote/;
}
(若一个请求中 /name/部分 将被 /remote/替代)
如果proxy_pass指令没有带有uri, 那么一个请求的uri将保留客户端原始(没有经过任何修改的,包括规格化,(这个没有去验证))请求中相同形式传递给被代理的server。或者当处理变化后的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;
}
(例子中将传递给server的是 :/users?name=xxxx)这个参数。
在这种情况下,该指令中指定的URI被忽略,并且一个完整改变后的请求URI传递给服务器。
一个server名称,端口号以及uri也能被通过变量指定,例如:proxy_pass http://$host$uri;
甚至:proxy_pass $request;
在这种情况下,服务器名称被搜索在配置的服务器中间进行, 如果没有找到确定使用解析器。
Sets the protocol and address of a proxied server, and an optional URI to which a location should be mapped. A protocol can be specified as “http” or “https”. An address can be specified as a domain name or IP address, and an optional port:
proxy_pass http://localhost:8000/uri/;
or as a UNIX-domain socket path specified after the word “unix” and enclosed in colons:
proxy_pass http://unix:/tmp/backend.socket:/uri/;
If a domain name resolves to several addresses, all of them will be used in a round-robin fashion. In addition, an address can be specified as a server group.
A request URI is passed to the server as follows:
If proxy_pass is specified with URI, when passing a request to the server, part of a normalized request URI matching the location is replaced by a URI specified in the directive:
location /name/ {
proxy_pass http://127.0.0.1/remote/;
}
If proxy_pass is specified without URI, a request URI is passed to the server in the same form as sent by a client when processing an original request, or the full normalized request URI is passed when processing the changed URI:
location /some/path/ {
proxy_pass http://127.0.0.1;
}
Before version 1.1.12, if proxy_pass is specified without a URI, an original request URI might be passed instead of the changed URI in some cases.
In some cases, part of a request URI to be replaced cannot be determined:
When location is specified using a regular expression.
In this case, the directive should be specified without URI.
When URI is changed inside a proxied location using the rewrite directive, and this same configuration will be used to process a request (break):
location /name/ {
rewrite /name/([^/]+) /users?name=$1 break;
proxy_pass http://127.0.0.1;
}
In this case, a URI specified in the directive is ignored and the full changed request URI is passed to the server.
A server name, its port and passed URI can also be specified using variables:
proxy_pass http://$host$uri;
or even like this:
proxy_pass $request;
In this case the server name is searched among the described server groups, and if not found is determined using a resolver.
21. proxy_pass_header
syntax:
| proxy_pass_header field;
|
default:
| —
|
context:
| http, server, location
|
设定允许通过的从代理服务器到客户端的报头字段。
Permits to pass otherwise disabled header fields from a proxied server to a client.