美文网首页
Nginx系列10:nginx的反向代理配置

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

作者: joyitsai | 来源:发表于2019-04-07 12:45 被阅读0次

    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的反向代理配置

          本文链接:https://www.haomeiwen.com/subject/buojiqtx.html