nginx Proxy如何使用与配置实例教程



nginx Proxy如何使用与配置实例教程。

proxy_connect_timeout

语法:proxy_connect_timeout timeout_in_seconds
默认值:proxy_connect_timeout 60s
使用字段:http, server, location
指定一个连接到代理服务器的超时时间,单位为秒,需要注意的是这个时间最好不要超过75秒。
这个时间并不是指服务器传回页面的时间(这个时间由proxy_read_timeout声明)。如果你的前端代理服务器是正常运行的,但是遇到一些状况(例如没有足够的线程去处理请求,请求将被放在一个连接池中延迟处理),那么这个声明无助于服务器去建立连接。
可以通过指定时间单位以免引起混乱,支持的时间单位有”s”(秒), “ms”(毫秒), “y”(年), “M”(月), “w”(周), “d”(日), “h”(小时),和 “m”(分钟)。
这个值不能大于597小时

 

proxy_pass

语法:proxy_pass URL
默认值:no
使用字段:location, location中的if字段
这个指令设置被代理服务器的地址和被映射的URI,地址可以使用主机名或IP加端口号的形式,例如:

proxy_pass http://localhost:8000/uri/;
或者一个unix socket:

proxy_pass http://unix:/path/to/backend.socket:/uri/;
路径在unix关键字的后面指定,位于两个冒号之间。
注意:HTTP Host头没有转发,它将设置为基于proxy_pass声明,例如,如果你移动虚拟主机example.com到另外一台机器,然后重新配置正常(监听example.com到一个新的IP),同时在旧机器上手动将新的example.comIP写入/etc/hosts,同时使用proxy_pass重定向到http://example.com, 然后修改DNS到新的IP。
当传递请求时,Nginx将location对应的URI部分替换成proxy_pass指令中所指定的部分,但是有两个例外会使其无法确定如何去替换:

location通过正则表达式指定;
在使用代理的location中利用rewrite指令改变URI,使用这个配置可以更加精确的处理请求(break):
location /name/ {
rewrite /name/([^/] +) /users?name=$1 break;
proxy_pass http://127.0.0.1;
}
这些情况下URI并没有被映射传递。
此外,需要标明一些标记以便URI将以和客户端相同的发送形式转发,而不是处理过的形式,在其处理期间:

两个以上的斜杠将被替换为一个: ”//” – ”/”;
删除引用的当前目录:”/./” – ”/”;
删除引用的先前目录:”/dir /../” – ”/“。
如果在服务器上必须以未经任何处理的形式发送URI,那么在proxy_pass指令中必须使用未指定URI的部分:

location /some/path/ {
proxy_pass http://127.0.0.1;
}
在指令中使用变量是一种比较特殊的情况:被请求的URL不会使用并且你必须完全手工标记URL。
这意味着下列的配置并不能让你方便的进入某个你想要的虚拟主机目录,代理总是将它转发到相同的URL(在一个server字段的配置):

location / {
proxy_pass http://127.0.0.1:8080/VirtualHostBase/https/$server_name:443/some/path/VirtualHostRoot;
}
解决方法是使用rewrite和proxy_pass的组合:

location / {
rewrite ^(.*)$ /VirtualHostBase/https/$server_name:443/some/path/VirtualHostRoot$1 break;
proxy_pass http://127.0.0.1:8080;
}
这种情况下请求的URL将被重写, proxy_pass中的拖尾斜杠并没有实际意义。
如果需要通过ssl信任连接到一个上游服务器组,proxy_pass前缀为 https://,并且同时指定ssl的端口,如:

upstream backend-secure {
server 10.0.0.20:443;
}

server {
listen 10.0.0.1:443;
location / {
proxy_pass https://backend-secure;
}
}
proxy_send_timeout

语法:proxy_send_timeout seconds

默认值:proxy_send_timeout 60s
使用字段:http, server, location
设置代理服务器转发请求的超时时间,单位为秒,同样指完成两次握手后的时间,如果超过这个时间代理服务器没有数据转发到被代理服务器,nginx将关闭连接。可以通过指定时间单位以免引起混乱,支持的时间单位有”s”(秒), “ms”(毫秒), “y”(年), “M”(月), “w”(周), “d”(日), “h”(小时),和 “m”(分钟)。这个值不能大于597小时。

proxy_read_timeout
语法:proxy_read_timeout time
默认值:proxy_read_timeout 60s
使用字段:http, server, location
决定读取后端服务器应答的超时时间,单位为秒,它决定nginx将等待多久时间来取得一个请求的应答。超时时间是指完成了两次握手后并且状态为established的超时时间。相对于proxy_connect_timeout,这个时间可以扑捉到一台将你的连接放入连接池延迟处理并且没有数据传送的服务器,注意不要将此值设置太低,某些情况下代理服务器将花很长的时间来获得页面应答(例如如当接收一个需要很多计算的报表时),当然你可以在不同的location里面设置不同的值。可以通过指定时间单位以免引起混乱,支持的时间单位有”s”(秒), “ms”(毫秒), “y”(年), “M”(月), “w”(周), “d”(日), “h”(小时),和 “m”(分钟)。这个值不能大于597小时。


proxy_temp_file_write_size
语法:proxy_temp_file_write_size size;
默认值:proxy_temp_file_write_size [”#proxy buffer size”] * 2;
使用字段:http, server, location, if
设置在写入proxy_temp_path时数据的大小,在预防一个工作进程在传递文件时阻塞太长。

 

proxy_buffer_size

语法:proxy_buffer_size the_size
默认值:proxy_buffer_size 4k/8k
使用字段:http, server, location
设置从被代理服务器读取的第一部分应答的缓冲区大小。
通常情况下这部分应答中包含一个小的应答头。
默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小。

proxy_buffers
语法:proxy_buffers the_number is_size;
默认值:proxy_buffers 8 4k/8k;
使用字段:http, server, location
设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k

 
proxy_redirect
语法:proxy_redirect [ default|off|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/。
在重写字段里面可以不使用服务器名:

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_redirect http://localhost:8000/ http://$host:$server_port/;
这个指令可以重复使用:

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/ /;
这个指令可以很容易的将被代理服务器的服务器名重写为代理服务器的服务器名:

proxy_redirect / /;
client_max_body_size

语法:client_max_body_size size
默认值:client_max_body_size 1m
使用字段:http, server, location
指令指定允许客户端连接的最大请求实体大小,它出现在请求头部的Content-Length字段。
如果请求大于指定的值,客户端将收到一个”Request Entity Too Large” (413)错误。
记住,浏览器并不知道怎样显示这个错误。

 

client_body_buffer_size

语法:client_body_buffer_size the_size
默认值:8k/16k
使用字段:http, server, location
这个指令可以指定连接请求实体的缓冲区大小。
如果连接请求超过缓存区指定的值,那么这些请求实体的整体或部分将尝试写入一个临时文件。
默认值为两个内存分页大小值,根据平台的不同,可能是8k或16k。
当请求头中的Content-Length字段小于指定的buffer size,那么Nginx将使用较小的一个,所以nginx并不总是为每一个请求分配这个buffer size大小的buffer。