zoukankan      html  css  js  c++  java
  • Nginx的proxy_pass及upstream的小型负载均衡

    proxy_pass

    Nginx的proxy_pass将请求代理到其他的后端服务器。例如

            listen 9999;
            server_name wyc.com;
    
            location /test/aaa {
                content_by_lua_block {
                 ngx.say('new:9999/test/aaa')
             }
            }
            location /test/aaa/bbb {
                content_by_lua_block {
                 ngx.say('new:9999/test/aaa/bbb')
             }
            }
            location /ttt {
                proxy_pass http://wyc.com:9999/test;
            }
    

    上面请求http://localhost:9999/ttt/aaa/bbb,会匹配到/ttt进入,规则是去掉ttt,将后面的url和参数拼接到proxy_pass的后面,于是返回的new:9999/test/aaa/bbb,即location为/test/aaa/bbb的内容。

    • 请求http://wychao.com:8888/user/wyc/wyc/aaa?aa=11&bb=22 (匹配到域名和端口和对应的location为/user/wyc,然后将后面的/wyc/aaa?aa=11&bb=22proxy_pass到需要代理到的服务,正好匹配到另一个server的location里)
        server {
            server_name wychao.com;
            listen 8888;
    
            location /user/wyc {
                proxy_pass http://aaa.wyc.com:8888/user;
            }
            location = /user/name {
                echo $request_uri;
            }
        }
        server {
            server_name aaa.wyc.com;
            listen 8888;
            location /user/wyc {
                echo $request_uri;
            }
        }
    
    

    结果:/user/wyc/aaa?aa=11&bb=22

    url location proxy_pass target_url
    aaa.com/aa/bb?a=1 /aa http://bbb.com/cc http://bbb.com/cc/bb?a=1
    • 即最终代理到的url:将请求的uri去掉匹配到的location部分,其余部分拼接到proxy_pass后面,包括query_string部分。

    如果proxy_pass http://aaa.wyc.com:8888不带url,则是将匹配到的url附加到host之后。


    upstream

    upstream可以做简单的负载均衡等,下面以百度为例,upstream在http段,

         upstream search {
             server 180.149.132.47;
         }
    
        server {
            # List port
            listen 8888;
            server_name wyc.com;
            
           location /s {
                #add_header 'Access-Control-Allow-Credentials' 'true';
    
                proxy_redirect   off;
                proxy_set_header Host            "www.baidu.com";
                proxy_set_header X-Real-Ip       $remote_addr;
                proxy_set_header X-Forwarded-for $remote_addr;
    
                proxy_pass http://search;
            }
        }
    

    上面请求域名wyc.com,端口8888,location将代理到search的upstream中,访问:

    http://wyc.com:8888/s?wd=nba

    http://baidu.com/s?wd=nba
    的结果是一样的

    upstream支持多种负载均衡,下面一个最简单的根据权重分配:

    #server1:
        server {
            server_name wwyycc.com;
            listen 8888;
            location /user {
                content_by_lua_block {
                 ngx.say('wwyycc.com:host')
                 }
            }
        }
    
    #server2:
    
        server {
            server_name wwyycc.com;
            listen 9999;
            location /user {
                echo "user wwyycc user";
            }
        }
    
    #负载:server3:server_name:wyc.com 端口:8888
         upstream manageserver {
             server wwyycc.com:8888 weight=2;
             server wwyycc.com:9999;
         }
    
           location /user {
                #add_header 'Access-Control-Allow-Credentials' 'true';
    
                proxy_redirect   off;
                proxy_set_header Host            "wwyycc.com";
                proxy_set_header X-Real-Ip       $remote_addr;
                proxy_set_header X-Forwarded-for $remote_addr;
    
                proxy_pass http://manageserver;
            }
    

    请求http://wyc.com:8888/user,结果按照顺序返回两次server1的结果,再返回一次server2的结果。(上面的例子要成功执行需要nginx的resolver解析,详细见另一篇文章http://www.cnblogs.com/mentalidade/p/6934162.html),echo等指令也是第三方模块echo-nginx-module,这些都是openresty自带的。

  • 相关阅读:
    Docker
    Docker
    Docker
    Docker
    Docker
    Docker
    pandas——向已经存在的excel数据写入data
    python——利用UI选择路径
    python——装饰器的使用
    python——生成器(协程)gevent多任务
  • 原文地址:https://www.cnblogs.com/mentalidade/p/7028890.html
Copyright © 2011-2022 走看看