思路:
安装nginx监听80端口,即域名指向的端口,通过nginx的负载均衡到多台服务器上,例如两个tomcat
当通过负载均衡实现均衡调用时,tomcat的session却不能实现共享,可以通过memcached实现session共享,以实现多台服务之间的跳转仍然session在线
以window环境为例
1.nginx安装配置
下载http://nginx.org/en/download.html
安装nginx
配置文件
#设定负载均衡的服务器列表
upstream myapp{
#weigth参数表示权值,权值越高被分配到的几率越大
#max_fails 当有#max_fails个请求失败,就表示后端的服务器不可用,默认为1,将其设置为0可以关闭检查
#fail_timeout 在以后的#fail_timeout时间内nginx不会再把请求发往已检查出标记为不可用的服务器
#这里指定多个源服务器,ip:端口,80端口的话可写可不写
#指向两台本机的tomcat
server 127.0.0.1:8080 weight=5;
server 127.0.0.1:9080 weight=5;
}
第一个虚拟主机
server {
#监听IP端口
listen 80;
#主机名
server_name localhost;#域名
#具体配置的应用指向myapp
location ~* \.(gif|jpg|jpeg|png|css|ico|html)$ {
#root /usr/local/project/html;
#root d:/appbase/project/html;
proxy_pass http://myapp;#请求转向定义的服务器列表
expires 1h;
access_log off;
}
location /myproject{
#location ~ \.jsp$ {
ssi on;
proxy_pass http://myapp;
client_max_body_size 3m;
client_body_buffer_size 128k;
#include /opt/apps/nginx/conf/proxy.conf;
}
#...略
}
2.
下载http://tomcat.apache.org/,减压出两个tomcat来
安装配置tomcat集群,例如本机有两个tomcat,则为了避免端口冲突需要修改端口
其中一台使用默认配置,不做修改,另外一台修改端口
<Server port="8005" shutdown="SHUTDOWN">改为
<Server port="8006" shutdown="SHUTDOWN">
和
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
改为
<Connector port="9080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
这样就有了由两个tomcat组成的集群了,
然后添加应用,在两个tomcat的\conf\Catalina\localhost目录下增加你自己的应用配置,例如我有一个myproject-1.0.war的应用放在D:\appBase\project\myproject-1.0.war
则在目录下新建myproject.xml的配置文件
<Context docBase="D:\appBase\project\myproject-1.0.war" path="myproject" reloadable="true"></Context>
这样当启动时,就会减压war包到webapps目录下了,
这样nginx+tomcat的集群就搭建起来了,但是他们还缺少session的共享,使两台tomcat的跳转能共享session。
3.
使用memcached共享session,首先需要有一台memcached服务器,我同样以本机做服务器,下载安装memcached,从网上找到一个windows 版的地址http://code.jellycan.com/files/memcached-1.2.6-win32-bin.zip
在tomcat客户端,需要下载依赖包,放到tomcat的lib目录下
http://memcached-session-manager.googlecode.com/files/memcached-session-manager-1.3.0.jar
http://memcached-session-manager.googlecode.com/files/msm-javolution-serializer-jodatime-1.3.0.jar
http://memcached-session-manager.googlecode.com/files/msm-javolution-serializer-cglib-1.3.0.jar
http://spymemcached.googlecode.com/files/memcached-2.4.2.jar
http://memcached-session-manager.googlecode.com/files/javolution-5.4.3.1.jar
然后在你的应用配置文件myproject.xml为自己的应用增加session共享
<Context docBase="D:\appBase\project\myproject-1.0.war" path="myproject" reloadable="true">
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:localhost:11211"
requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"
sessionBackupAsync="false"
sessionBackupTimeout="20"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
copyCollectionsForSerialization="false"
/>
</Context>
这样就算大功告成了,启动memcached、两台tomcat和nginx,
访问http://localhost/myproject 实际浏览器默认是通过请求的80端口
所以nginx监听到80端口后,根据负载均衡服务器列表中服务的权重,分发到应用服务上的8080或9080端口上,
当其中一台收到请求,会将sessionid同步到memcached服务器中,返回结果,当再一次请求分发到另一台应用服务器上时,可以通过memcached获取同步session数据,实现session的共享。
参考:
http://www.cnblogs.com/xiaogangqq123/archive/2011/03/02/1969006.html
http://www.blogjava.net/libin2722/articles/352841.html
http://www.iteye.com/topic/676347