Nginx使用ngx_http_proxy_module来完成对后端服务的代理。这一节,我们将一起来见识Nginx最流行的proxy代理功能。
语法:proxy_pass URL;
环境:location、if in location、limit_except
含义:将请求代理到后端服务器,设置后端服务的IP地址、端口号以及HTTP/HTTPS。
示例:将URI为/test的请求代理到127.0.0.1上,端口号为81,使用HTTP,代码如下。
在代理过程中,URL的传递会有如下几种变化:
注意: 如果location块配置的URI使用了正则表达式,那么在使用proxy_pass时,就不能将URI配置到 proxy_pass指定的后端服务器的最后面了,即禁止使用类似 proxy_pass http://127.0.0.1:81/abc/的方式,否则可能会导致一些不可预测的问题出现。
有很多请求的内容只和URL有关,即后端服务器不需要读取请求体和请求头,只根据URL的信息即可生成所需的数据。在这种情况下,可以使用如下两个指令,并将其配置为off,禁止传输请求体和请求头。
· proxy_pass_request_body:确定是否向后端服务器发送HTTP请求体,支持配置的环境有http、server、location。
· proxy_pass_request_headers:确定是否向后端服务器发送HTTP请求头,支持的配置的环境有http、server、location。
通过配置以上两个指令,后端服务接收到的流量将会变小。
在请求被代理到后端服务器时,可以通过表3-2所示的指令去控制请求头和请求体。
表3-2 请求头和请求体的控制指令
注意: 在设置proxy_set_header后,下一层级会继承这个请求头的内容。但如果下一层级也配置了proxy_set_header指令,那么当请求到达下一层级时,在上一层级配置的请求头将会被全部清除。
举例如下:
如果要A和AB两个请求头都保留下来,可以用下面的方法:
控制请求和后端服务器交互时间的指令见表3-3。
表3-3 控制请求和后端服务器交互时间的指令
如果使用默认的设置,即60s,请求可能需要等待很久才会做出下一步反应,而客户端往往不会等待那么久,所以需要合理设置交互时间,并且最好能在超时后做一些合理的措施。如搭配使用proxy_next_upstream*命令,这将在下一节进行说明。