proxy_pass
proxy_pass指令用来设置被代理服务器的地址,可以是主机名称、IP地址加端口号等形式。其语法结构为:
其中,URL为要设置的被代理服务器的地址,包含传输协议、主机名称或IP地址加端口号、URI等要素。传输协议通常是“http”或者“https”,同时还接受以“unix”开始的UNIX-domain套接字路径。例如:
upstream
如果被代理服务器是一组服务器的话,可以使用upstream指令配置后端服务器组。例如:
在上例中,在组内的各个服务器中都指明了传输协议“http://”,而在proxy_pass指令中就不再需要指明了。如果现在将upstream指令的配置改为:
我们就需要在proxy_pass指令中指明传输协议“http://”:
URL中是否包含有URI,Nginx服务器的处理方式是不同的
在使用该指令的过程中要注意,URL中是否包含有URI,Nginx服务器的处理方式是不同的。
如果URL中不包含URI,Nginx服务器不会改变原地址的URI;
但是如果包含了URI,Nginx服务器将会使用新的URI替代原来的URI。
在上面的Nginx配置片段中,如果客户端使用“http://www.myweb.name/server”发起请求,该请求被配置中显示的location块进行处理,由于proxy_pass指令的URL变量不含有URI,所以转向的地址为“http://192.168.1.1/server”。
再来看下面的Nginx配置片段:
在该配置实例中,proxy_pass指令的URL包含了URI“/loc/”。如果客户端仍然使用“http://www. myweb.name/server/”发起请求,Nginx服务器将会把地址转向“http://192.168.1.1/loc/”。
通过上面的实例,可以总结出,在使用proxy_pass指令时,如果不想改变原地址中的URI,就不要在URL变量中配置URI。
在该配置中,location块使用“/”作为uri变量的值来匹配不包含URI的请求URL。由于请求URL中不包含URI,因此配置1和配置2的效果是一样的。
比如,客户端的请求URL为“http://www.myweb.name/index.htm”,其将会被实例1中的location块匹配成功并进行处理。不管使用配置1还是配置2,转向的URL都为:“http://192.168.1.1/index.htm”。
在该配置中,location块使用“/server/”作为uri变量的值来匹配包含URI “/server/” 的请求URL。这时,使用配置1和配置2的转向结果就不相同了。
使用配置1的时候,proxy_pass指令中的URL变量不包含URI,Nginx服务器将不改变原地址的URI;
使用配置2的时候,proxy_pass指令中的URL变量包含URI “/”,Nginx服务器会将原地址的URI替换为“/”。
比如,客户端的请求URL为“http://www.myweb.name/server/index.htm”,将会被配置中的location块匹配成功并进行处理。
使用配置1的时候,转向的URL为“http://192.168.1.1/server/index.htm”,原地址的URI “/server/”未被改变;
但使用配置2时,转向的URL为“http://192.168.1.1/index.htm”,可以看到,原地址的URI “/server/”被替换为“/”。
Last updated
Was this helpful?