nginx 代理解析问题

Jack_Ruin 发布于 2017/02/10 09:58
阅读 326
收藏 0

因为一台主机下有几个项目同时部署,于是使用nginx做代理,使项目可以直接通过不同的域名来访问指定的tomcat,但是现在遇到一个奇怪的问题,有三个tomcat,一个使用8081,一个使用8089,还有一个是9999端口,8081,8089端口运行的都是同一个项目,域名对应的ip地址是:156.15.12.154,并且项目使用shiro做权限控制,主要配置部分:

server {
        listen       80;
        server_name  test.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
            index  index.html index.jsp;    
            proxy_pass  http://156.15.12.154:8081;    
            proxy_set_header    X-Real-IP   $remote_addr;    
            client_max_body_size    100m;
        }

server {
        listen       80;
        server_name  test2.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
            index  index.html index.jsp;    
            proxy_pass  http://156.15.12.154:9999;    
            proxy_set_header    X-Real-IP   $remote_addr;    
            client_max_body_size    100m;
        }

使用域名访问不需要授权的页面都是没问题的,但是未登录下直接访问个人中心等,会出现下面的情况:

点击个人中心,跳转到登录页面:

http://test1.com/user/login/login.html?returnUrl=aHR0cDovL3pqdG9zai5jb206ODA4OS91c2VyL3VzZXJpbmZvL2luZGV4Lmh0bWw=,

登录成功后,却又返回:

http://156.15.12.154:8081/user/login/login.html?returnUrl=aHR0cDovLzEwNi4xNC4xOS4xMTQ6ODA4MS91c2VyL3VzZXJpbmZvL2luZGV4Lmh0bWw=,

如果使用 http://test1.com:8089/user/login/login.html?returnUrl=aHR0cDdfetghdG9zai5jb206ODA4OS91c2VyL3VzZXJpbmZvL2luZGV4Lmhwqt=的话,就没问题

加载中
1
灵魂架构师
灵魂架构师

你这么配置

#server 外
upstream test{
      consistent_hash $request_uri;
      server 156.15.12.154:8081;
      server 156.15.12.154:8089;
    }

#server内
location / {
       proxy_pass http://test;
       proxy_redirect      off;
       proxy_set_header    Host        $server_name;
       proxy_set_header    X-Real-IP   $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
   }

 

0
灵魂架构师
灵魂架构师

你犯了一个原则性错误,即你两个端口取到的Server Name不一样 proxy_set_header 都设置死了就应该可以了,百度下 nginx负载均衡设置,有相关代码段可参考

灵魂架构师
灵魂架构师
你不要让java自己取server name,而是在nginx里给传进去,别让他自己猜。
0
javadeveloper
javadeveloper

    upstream myproject {  
        #这里指定多个源服务器,ip:端口,80端口的话可写可不写  
        server localhost:8099 fail_timeout=1s;  
        #server localhost:9002 fail_timeout=20s; 
        #server localhost:9004 fail_timeout=20s; 
        
        ip_hash;
    }

0
J
Jack_Ruin

引用来自“灵魂架构师”的评论

你这么配置

#server 外
upstream test{
      consistent_hash $request_uri;
      server 156.15.12.154:8081;
      server 156.15.12.154:8089;
    }

#server内
location / {
       proxy_pass http://test;
       proxy_redirect      off;
       proxy_set_header    Host        $server_name;
       proxy_set_header    X-Real-IP   $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
   }

 

我想做的是通过nginx代理,直接使用不同的域名访问不同的项目,目的是多个项目都使用80端口,这样配置不行?

灵魂架构师
灵魂架构师
我给你贴的不是正确的吗?
0
灵魂架构师
灵魂架构师

给你贴个完整的负载均衡,和反向代理的配置

upstream test{
      consistent_hash $request_uri;
      server 156.15.12.154:8081;
      server 156.15.12.154:8089;
}

server {
    listen 80;
    server_name  test.com;
    index  index.php index.html index.htm;

    location / {
        proxy_pass  http://test;
 
        #Proxy Settings
        proxy_redirect     off;
        proxy_set_header   Host             $server_name;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
   }
}

######另一个站点如果不需要负载均衡,只代理

server {
    listen 80;
    server_name  test1.com;
    index  index.php index.html index.htm;

    location / {
        proxy_pass  http://ip:port;
 
        #Proxy Settings
        proxy_redirect     off;
        proxy_set_header   Host             $server_name;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
   }
}

你依据自己的需求增加其他配置即可

0
J
Jack_Ruin

引用来自“灵魂架构师”的评论

给你贴个完整的负载均衡,和反向代理的配置

upstream test{
      consistent_hash $request_uri;
      server 156.15.12.154:8081;
      server 156.15.12.154:8089;
}

server {
    listen 80;
    server_name  test.com;
    index  index.php index.html index.htm;

    location / {
        proxy_pass  http://test;
 
        #Proxy Settings
        proxy_redirect     off;
        proxy_set_header   Host             $server_name;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
   }
}

######另一个站点如果不需要负载均衡,只代理

server {
    listen 80;
    server_name  test1.com;
    index  index.php index.html index.htm;

    location / {
        proxy_pass  http://ip:port;
 
        #Proxy Settings
        proxy_redirect     off;
        proxy_set_header   Host             $server_name;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
   }
}

你依据自己的需求增加其他配置即可

嗯,我看了下,现在需要的就只是代理,不需要负载均衡,看了下你给我的代理配置,跟我的差不多,造成登录后返回ip:port格式的原因难道是下面两句,我试试:

 proxy_set_header   Host             $server_name;
        proxy_set_header   X-Real-IP        $remote_addr;
灵魂架构师
灵魂架构师
proxy_set_header Host $server_name; 是这一句
返回顶部
顶部