wusheng678612
2018-09-20 04:25
采纳率: 100%
浏览 3.6k
已采纳

关于 nginx proxy_set_header 的问题

先上配置文件。

 worker_processes  2; 
events { 
    worker_connections  1024; 
} 

http { 
    include       mime.types; 
    default_type  application/octet-stream; 
    sendfile        on; 
    keepalive_timeout  65; 

    upstream ab{ 
            server 10.32.4.202:7010;
            server 10.32.4.202:7011;
    } 

    server {    #Nginx代理服务器 
            listen       80; 
            server_name  10.0.0.102; 

        location / { 
                proxy_set_header Host 10.32.4.202:7010;
                    proxy_pass  http://ab;
                } 

        error_page   500 502 503 504  /50x.html; 
        location = /50x.html { 
            root   html; 
        } 

    }
} 

用户访问10.0.0.102,代理到10.32.4.202:7010或10.32.4.202:7011端口.(负载均衡)
10.32.4.202:7010对应10.0.0.100:8080端口
10.32.4.202:7011对应10.0.0.100:8081端口
10.0.0.100:8080和10.0.0.100:8081,是用户真正要访问的应用服务器.

为啥要经过一层10.32.4.202呢,因为公司有加密策略,所有上传的文件都要解密,所有下载的文件都要加密.请求必须要从这里过一下.

经过n次尝试,以上配置,可以访问的通了.
但是,proxy_set_header设置为7010端口,所有的请求都到了10.0.0.100:8080这台应用,就无法起到负载均衡的作用.

问题来了,要实现如下功能,应如何配置呢.
1,用户必须统一入口(10.0.0.0.102).
2,请求必须经过10.32.4.202(要加解密);
3,还能使用负载均衡功能.

感激不尽!

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • oyljerry 2018-09-20 10:36
    已采纳

    类似你上面的方法,自己内部再转发一次

     server {
      listen      8001 default_server;
      server_name web1.example.com;
      location / {
        proxy_pass       http://web1.local:80;
        proxy_set_header Host web1.local:80;
      }
    }
    
    server {
      listen      8002 default_server;
      server_name web2.example.com;
      location / {
        proxy_pass       http://web2.local:80;
        proxy_set_header Host web2.local:80;
      }
    }
    
    server {
      listen      8003 default_server;
      server_name web3.example.com;
      location / {
        proxy_pass       http://web3.local:80;
        proxy_set_header Host web3.local:80;
      }
    }
    
    upstream main {
      server 127.0.0.1:8001;
      server 127.0.0.1:8002;
      server 127.0.0.1:8003;
    }
    
    server {
      listen      80;
      server_name example.com;
      location / {
        proxy_pass http://main;
      }
    }
    
    打赏 评论
  • oyljerry 2018-09-20 06:42

    如果需要设置目标服务器的配置,那么可以试试下面的

     proxy_set_header Host $proxy_host:$proxy_port;
    
    打赏 评论
  • wusheng678612 2018-09-20 07:34

    我又想到一个办法,就是在套一层nginx,
    一台nginx只代理到一个服务器.
    比如,一个代理到7010,一个代理到7011.
    实际就2台应用,却用了3台nginx....感觉不太好.

    打赏 评论
  • wusheng678612 2018-09-21 02:53

    这样配置,好了。

     worker_processes  2;
    
    events {
        worker_connections  1024;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
    
        upstream main {
        server 127.0.0.1:8001;
        server 127.0.0.1:8002;
        }
    
        server {
        listen      80;
        server_name 10.0.0.102;
        location / {
            proxy_pass http://main;
        }
        }
    
    
    
    
        server {
        listen      8001;
        server_name 10.0.0.102;
        location / {
            proxy_pass       http://10.32.4.202:7010;
            proxy_set_header Host 10.32.4.202:7010;
        }
        }
    
        server {
        listen      8002;
        server_name 10.0.0.102;
        location / {
            proxy_pass       http://10.32.4.202:7011;
            proxy_set_header Host 10.32.4.202:7011;
        }
        }
    }
    

    感谢oyljerry的耐心解答!

    打赏 评论
  • oyljerry 2018-09-20 06:10

    你这应该就是需要根据目标请求,header中设置它对应的host和port

     proxy_set_header Host $host:$proxy_port;
    
    1 打赏 评论

相关推荐 更多相似问题