1. 理解什么是反向代理
关于反向代理的概念可以参考上一篇文章《Nginx系列9:nginx正反向代理概念与配置》。
1.1 理解proxy_pass指令
该指令是用来设置代理服务器的地址,可以是主机名称,IP地址加端口号等形式。语法结构:
proxy_pass: URL;
因此我们经常会看到如下nginx上的配置:如下代码:
server {
listen 80;
server_name xy.xxx.com; // 接口的域名
location / {
proxy_pass http://192.168.1.212:8136;
include nginx_proxy.conf;
}
}
如上代码的含义是:监听80端口号,然后我们定义的接口的域名为 xy.xxx.com, 然后当我们访问 http://xy.xxx.com/xxxx这样的接口的时候,它会通过 location / {} 这样的反向代理到 http://192.168.1.212:8136上来。
当然如果代理服务器是一组服务器的话,我们可以使用upstream指令配置后端服务器组。如下代码:
upstream proxy_xxx {
server http://192.168.1.211:8136/xxx;
server http://192.168.1.212:8136/xxx;
server http://192.168.1.213:8136/xxx;
}
server {
listen 80;
server_name xy.xxx.com; // 接口的域名
location / {
proxy_pass proxy_xxx; // 使用服务器组proxy_xxx
}
...
}
但是在上面配置各个服务器中都指明了传输协议为 http://
, 但是如果上面的接口没有指明协议的话,像这样:
upstream proxy_xxx {
server 192.168.1.211:8136/xxx;
server 192.168.1.212:8136/xxx;
server 192.168.1.213:8136/xxx;
}
那么我们需要在 proxy_pass上加上http://
:
proxy_pass http://proxy_xxx;
1.2 注意proxy_pass的URI
在使用proxy_pass指令时还要注意,URL中是否包含URI,Nginx服务器的处理方式是不同的。如果URL中不包含URI,Nginx服务器不会改变原来地址的URI;但如果包含了URI,Nginx服务器将会使用新的URI替代原来的URI。
- 不含有URI的情况,请看下面的Nginx配置片段:
server {
listen 80;
server_name www.myweb.com; // 接口的域名
location /server/ {
proxy_pass http://192.168.1.1;
}
...
}
根据上面的配置,如果请求http://www.myweb.com/server
,由于proxy_pass指令的URL不含有URI,所以转向地址http://192.168.1.1/server
。
- 包含URI的情况,看下面的Nginx配置片段:
server {
listen 80;
server_name www.myweb.com; // 接口的域名
location /server/ {
proxy_pass http://192.168.1.1/loc/;
}
...
}
在上面配置中,proxy_pass指令的URL包含了URI/loc/
,如果客户端仍然使用http://www.myweb.com/server/
发起请求,Nginx服务器将转向地址http://192.168.1.1/loc/
。
通过上面的实例,可以看出,在使用proxy_pass指令时,如果不想改变原地址中的URI,就不要在URL变量中配置URI。
1.3 proxy_pass指令的URL末尾是否加斜杠/
的问题
理解了上面的proxy_pass指令中URL结尾是否含有URI的两种情况,关于/
的使用也就很好理解了。
- url带斜杠:
location /proxy/ {
proxy_pass http://127.0.0.1/;
}
访问地址http://server/proxy/test.html
代理到URL:http://127.0.0.1/test.html
- url末尾不带斜杠:
location /proxy/ {
proxy_pass http://127.0.0.1;
}
访问地址http://server/proxy/test.html
代理到URL:http://127.0.0.1/proxy/test.html
- url末尾带有uri+
/
location /proxy/ {
proxy_pass http://127.0.0.1/aaa/;
}
访问地址http://server/proxy/test.html
代理到URL:http://127.0.0.1/aaa/test.html
- url末尾带有uri但不带
/
location /proxy/ {
proxy_pass http://127.0.0.1/aaa;
}
访问地址http://server/proxy/test.html
代理到URL:http://127.0.0.1/aaatest.html