nginx配置系列(十)代理服务(proxy_pass)
ngx_http_proxy_module 模块
ngx_http_proxy_module 模块允许将请求转发到其它服务器。该模块默认会编译进nginx中,可以通过**–without-http_proxy_module禁用该模块。同时,该模块下有很多指令,比如:proxy_buffer_size、proxy_cache等。这里只说一下proxy_pass(反向代理)**指令。
proxy_pass指令语法:
语法:proxy_pass URL;
默认值:—
配置上下文:location、if in location、limit_except
说明:设置后端代理服务器的协议(protocol)和地址(address),以及location中可以匹配的一个可选的URI。协议可以是"http"或"https"。而地址既可以使用域名或者IP地址加端口(端口可选)的形式来定义:
proxy_pass http://www.test.com:8000/uri/;
又可以使用UNIX域套接字路径来定义。该路径接在“unix”字符串后面,两端由冒号所包围,比如:
proxy_pass http://unix:/tmp/backend.socket:/uri/;
URL参数规则说明如下:
①、URL必须以http://或者https://开头,接下来是域名、IP、unix socket地址或者upstream的名字,前两者可以在域名或者IP后加端口。最后是可选的URI。(PS:虽然 这条上面已经有了大概的说明并给出了示例。。不过在重复说明下吧)**
**
②、当URL参数中携带URI或者不携带URI,会导致转发出去的请求URL不同:
不携带URI,则将客户端请求中的URL直接转发出去
location后使用正则表达式、@名字时,应采用这种方式。
携带URI,则对用户请求中的URL作如下操作:
将location参数中匹配上的一段替换为该URI。
③、该URL参数中可以携带变量
④、更复杂的URL替换,可以在location内的配置中添加rewrite break语句
proxy_pass指令配置示例
在nginx中配置proxy_pass指令进行代理转发时,如果在proxy_pass后面的url加/,表示绝对根路径。如果没有/,表示相对路径,把匹配的路径部分也给代理走。
假设server_name为www.test.com`
`当请求http://www.test.com/aming/a.html的时候,以下示例分别访问的结果是` `示例1:
``location /aming/``{`` ``proxy_pass http://192.168.1.10;`` ``...``}``代理转发的请求URL是:http://192.168.1.10/aming/a.html` `
示例2:``location /aming/``{`` ``proxy_pass http://192.168.1.10/;`` ``...``}` `代理转发的请求URL是:http://192.168.1.10/a.html` `
示例3:``location /aming/``{`` ``proxy_pass http://192.168.1.10/linux/;`` ``...``}``代理转发的请求URL是:http://192.168.1.10/linux/a.html` `
示例4:``location /aming/``{`` ``proxy_pass http://192.168.1.10/linux;`` ``...``}` `代理转发的请求URL是:http://192.168.1.10/linuxa.html
proxy_pass指令的其它说明:
nginx中有两个模块都有proxy_pass指令。除了本文中的ngx_http_proxy_module模块。还有一个ngx_stream_proxy_module模块,这个模块也有proxy_pass指令。两个proxy_pass指令的区别就是:ngx_stream_proxy_module模块中的proxy_pass指令只能在server段使用使用,只需要提供域名或ip地址和端口。可以理解为端口转发,可以是tcp端口,也可以是udp端口。
其它常用指令配置语法 - 头信息(一般都是和proxy_pass配合使用):
语法: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;
如果不想改变请求头“Host”的值,可以这样来设置:
proxy_set_header Host $http_host;
如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。 这种情况下,更好的方式是使用$host变量— —它的值在请求包含“Host”请求头时为“Host”字段的值,在请求未携带“Host”请求头时为虚拟主机的主域名:
proxy_set_header Host $host;
此外,服务器名可以和后端服务器的端口一起传送:
proxy_set_header Host proxy_port;
如果某个请求头的值为空,那么这个请求头将不会传送给后端服务器:
proxy_set_header Accept-Encoding “”;
扩展指令:proxy_hide_header、proxy_set_body
其它常用指令配置语法 - 超时(一般都是和proxy_pass配合使用):
语法:proxy_connect_timeout time;
默认值:proxy_connect_timeout 60s;
配置上下文:http、server、location
说明:设置与后端服务器建立连接的超时时间。应该注意这个超时时间一般不大于75秒。
扩展指令:proxy_read_timeout、proxy_send_timeout
- 点赞
- 收藏
- 关注作者
评论(0)