Nginx系列10:nginx的反向代理配置

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

以上便是proxy_pass在nginx反向代理中的常用配置,和URL中是否带有URI时的区别,在实际使用中,多加小心即可正确配置。

你可能感兴趣的:(Nginx系列10:nginx的反向代理配置)