nginx配置系列(十)代理服务(proxy_pass)

ngx_http_proxy_module 模块

ngx_http_proxy_module 模块允许将请求转发到其它服务器。该模块默认会编译进nginx中,可以通过--without-http_proxy_module禁用该模块。同时,该模块下有很多指令,比如:proxy_buffer_size、proxy_cache等。这里只说一下proxy_pass(反向代理)指令。


PS:关于什么是代理以及什么是正向代理和什么是反向代理可查看:教你搞定什么是 正向代理、反向代理 的概念

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    $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



声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复12人评论7,777人参与