12
回答
关于nginx配置负载均衡的问题
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

请教一下各位,目前的项目部署情况是这样

101服务器做反向代理,同时做负载均衡的配置

84,85,分别部署了两台tomcat服务器

目前反向代理是没有问题了,但配置负载均衡时出现了问题;

应用的背景信息:

由于是在一个二次平台上进行开发,有些底层进行了封装,所以不 绝对清楚 底层的 相关配置

当配置负载均衡后,应用的登陆出现了问题,点击登陆系统则重定向到登陆界面,无法登陆;

配置成单点服务(停掉一个tomcat),应用则正常

应用的登陆采用了spring的安全框架(spring acegi),由于不了解spring acegi

所以不清楚是不是该框架造成的问题

想请教一些有经验的同仁帮忙分析一下,谢谢

nginx.conf文件内容如下

nginx版本为0.8.50

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    gzip  on;

	proxy_connect_timeout 2s;
	
	
	upstream tomcat_pool {
		server x.x.x.84:8080;
		server x.x.x.85:8081;
	}
	
	upstream report_pool {
		server	x.x.x.85:8080;
		#server 127.0.0.1:8081 down;
	}
	
    server {
        listen       80;
        server_name  x.x.x.x;
		
		
        #charset koi8-r;

        #access_log  logs/host.access.log  main;
		
		proxy_buffer_size	16k;
		proxy_buffers	4 16k;

        location /xxx/ {
			proxy_pass http://tomcat_pool/itsm/;
			proxy_set_header Host $host;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header REMOTE-HOST $remote_addr;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   
		}
		
		location  /xxx2/ {
			proxy_pass http://report_pool/report/;
			proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		}
   }

}

谢谢

举报
恺哥
发帖于7年前 12回/1K+阅
共有12个答案 最后回答: 7年前

这是因为你登录使用了session的问题,由于nginx的负载均衡是轮询的方式,不会有 session_sticky 的效果

当用户在tomcat1登录后再访问页面可能是跑到tomcat2,而tomcat2没有这个session信息就认为是没登录

解决的思路:

1. 尝试 nginx 的 session_sticky : http://www.oschina.net/p/nginx_upstream_jvm_route

2. tomcat 配置 session 复制

引用来自#6楼“恺哥”的帖子

查了一下资料,不知利用ip_hash能否解决我的问题

从现在起,恶补nginx

你是 Windows 下的 Nginx 啊?

ip_hash 在某些情况下是不行的,有些用户上网时IP经常在变化,或者两个ip轮流切换的,这种就会出问题,而且这种情况很频繁。

实在不行建议最复杂的方案,Tomcat的 session复制。

恩,感谢回答

刚才与nginx_upstream_jvm_route的作者通了邮件

回复如下:

因为Nginx在windows下面还没有开源,没办法在windows下面编译,或许你可以试试cygwin。

我再折腾折腾,不行就弃用nginx,用apache;

session复制的话,是不是仅需要在tomcat上进行配置,与nginx没有太大关系吧?

引用来自#6楼“恺哥”的帖子

查了一下资料,不知利用ip_hash能否解决我的问题

从现在起,恶补nginx

使用ip_hash的却能解决session的问题,但是就不是负载均衡了。

顶部