关于 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,还能使用负载均衡功能.

感激不尽!

0

5个回答

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

 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;
  }
}
1
wusheng678612
wusheng678612 感谢资深老程序员oyljerry的耐心解答!
11 个月之前 回复

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

 proxy_set_header Host $host:$proxy_port;
0
wusheng678612
wusheng678612 回复oyljerry: 添加上这行以后,浏览器控制台上的response header中的多余数据是没了.但还是502..
11 个月之前 回复
oyljerry
oyljerry 回复wusheng678612: add_header 'Referrer-Policy' 'unsafe-url';
11 个月之前 回复
wusheng678612
wusheng678612 回复oyljerry: 如果设置成10.0.0.102,response header中就会出现非常非常多重复的内容.导致头过大,简单来说应该是有回路.
11 个月之前 回复
oyljerry
oyljerry 回复wusheng678612: 你的后台服务器有点奇怪,为什么要proxy_set_header Host 10.32.4.202:7010; 这是设置的后台服务器的地址在Header中,一般都是设置源头的
11 个月之前 回复
wusheng678612
wusheng678612 是这个意思,就是把请求分配给哪一个,就把header变成哪一个.但是这样设置不行.502, Referrer Policy:no-referrer-when-downgrade
11 个月之前 回复

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

 proxy_set_header Host $proxy_host:$proxy_port;
0
wusheng678612
wusheng678612 回复oyljerry: 我尝试过几台nginx串在一起,确实不需要设置proxy_set_header都可以访问成功...10.32.4.202这台服务器是使用linux配置了DNAT,会将请求转到另一台服务器..........这个不深究,配置这个proxy_set_header的目的,就是模拟用户直接以10.32.4.202:7010访问.这样就没问题了.....现在就是这个负载均衡的问题..哎.
11 个月之前 回复
oyljerry
oyljerry 回复wusheng678612: 最主要的还是不知道你的后台服务器需要做什么,理论上不设置proxy_set_header,请求就会转发到你的后台服务器,如果你后台服务器需要一些额外的信息,那么就可以通过设置定制化的header等传递数据进行处理
11 个月之前 回复
wusheng678612
wusheng678612 不行的,504,他会把头设置成http://ab:80
11 个月之前 回复

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

0
wusheng678612
wusheng678612 回复oyljerry: 如果不设置proxy_set_header,就是502,访问不通.
11 个月之前 回复
oyljerry
oyljerry 回复wusheng678612: 我的意思是如果不设置成同一个,是不是可以负载均衡到不同的服务器
11 个月之前 回复
wusheng678612
wusheng678612 回复oyljerry: 请求是负载均衡了,没错.但是最后设置头设置成了同一个.最后走的应用服务器就是同一个.
11 个月之前 回复
wusheng678612
wusheng678612 回复oyljerry: 这个提示是在浏览器控制台,network,查看headers中的general的提示,我发现只要是访问失败的,都会有这个.无论是502,还是504.可能和这个没有关系.
11 个月之前 回复
oyljerry
oyljerry 还是我说的,你header加$host,应该请求都会做负载均衡的。你先看看这个Referrer Policy:no-referrer-when-downgrade问题
11 个月之前 回复

这样配置,好了。

 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的耐心解答!

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!