今天看到" 基于apache的tomcat負載均衡和集群配置 "這篇文章成為javaEye熱點。
略看了一下,感覺太復(fù)雜,要配置的東西太多,因此在這里寫出一種更簡潔的方法。
?
要集群tomcat主要是解決SESSION共享的問題,因此我利用memcached來保存session,多臺TOMCAT服務(wù)器即可共享SESSION了。
?
你可以自己寫tomcat的擴展來保存SESSION到memcached。
這里推薦使用memcached-session-manager這個開源項目( http://code.google.com/p/memcached-session-manager/ ),下面簡稱msm。
如何安裝nginx、memcached、tomcat這些就不多說了。
先說明一下測試環(huán)境:
tomcat1、nginx、memcached安裝在192.168.1.11
tomcat2安裝在192.168.1.101
下面分步實現(xiàn)基于nginx的tomcat負載均衡和集群配置
?
一,tomcat集群
??? 1,先下載msm及其依賴包
??? 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
?
2,將這5個包放到$TOMCAT_HOME/lib目錄下
3 ,修改$TOMCAT_HOME/conf/server.xml
?
- < Context ? docBase = "E:/java_codes/TestSession/WebContent" ? path = "" ? reloadable = "true" ? > ??
- < Manager ? className = "de.javakaffee.web.msm.MemcachedBackupSessionManager" ??
- ???? memcachedNodes = "n1:localhost:11211" ??
- ???? requestUriIgnorePattern = ".*\.(png|gif|jpg|css|js)$" ??
- ???? sessionBackupAsync = "false" ??
- ???? sessionBackupTimeout = "100" ??
- ???? transcoderFactoryClass = "de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" ??
- ???? copyCollectionsForSerialization = "false" ??
- ???? /> ??
- </ Context > ??
<Context docBase="E:/java_codes/TestSession/WebContent" path="" reloadable="true" >
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:localhost:11211"
requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"
sessionBackupAsync="false"
sessionBackupTimeout="100"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
copyCollectionsForSerialization="false"
/>
</Context>
?這里的memcachedNodes是填寫memcached節(jié)點,多個節(jié)點時可以以空隔分開,如:
?n1:localhost:11211 n2:localhost:11212
?
? E:/java_codes/TestSession/WebContent 替換成你的WEB目錄
?
? 修改后重啟兩個TOMCAT即可,這個時候已經(jīng)解決SESSION的共享問題.
二,配置nginx實現(xiàn)負載均衡
?? 以我的nginx.conf為例
- #user??nobody; ??
- worker_processes??1; ??
- ??
- error_log??logs/error.log; ??
- ??
- events?{ ??
- ????worker_connections??1024; ??
- } ??
- ??
- ??
- http?{ ??
- ????include???????mime.types; ??
- ????default_type??application/octet-stream; ??
- ??
- ????sendfile????????on; ??
- ????keepalive_timeout??65; ??
- ??
- ????#gzip??on; ??
- ????upstream??www.docyeah.com???{ ??
- ??????????????server???192.168.1.11:8080; ??
- ??????????????server???192.168.1.101:8080; ??
- ????} ??
- ????server?{ ??
- ????????listen???????80; ??
- ????????server_name??www.docyeah.com; ??
- ????????charset?utf-8; ??
- ????????location?/?{ ??
- ????????????root???html; ??
- ????????????index??index.html?index.htm; ??
- ????????????proxy_pass????????http://www.docyeah.com; ??
- ????????????proxy_set_header??X-Real-IP??$remote_addr; ??
- ????????????client_max_body_size??100m; ??
- ????????} ??
- ??
- ??
- ????????location?~?^/(WEB-INF)/?{? ??
- ????????deny?all;? ??
- ????????}? ??
- ??
- ????????error_page???500?502?503?504??/50x.html; ??
- ???????? location ?=?/50x.html?{ ??
- ????????????root???html; ??
- ????????} ??
- ??
- ????} ??
- }??
#user nobody;
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#gzip on;
upstream www.docyeah.com {
server 192.168.1.11:8080;
server 192.168.1.101:8080;
}
server {
listen 80;
server_name www.docyeah.com;
charset utf-8;
location / {
root html;
index index.html index.htm;
proxy_pass http://www.docyeah.com;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 100m;
}
location ~ ^/(WEB-INF)/ {
deny all;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
?
將www.docyeah.com替換成你的域名
192.168.1.11和192.168.1.101替換成你服務(wù)器的IP
?
OK,已經(jīng)完成。啟動nginx即可。
這是我采用的負載均衡及集群方案,希望大家拍磚.
?
ps:javaeye的編輯器有問題,代碼里加顏色后居然變亂了
?
?
nginx在配置upstream時,有兩個參數(shù):
ip_hash(同一IP一直使用同一臺server服務(wù))
weight(server的使用權(quán)重,數(shù)值越大,nginx分發(fā)的請求越多)
通過配合這兩個參數(shù),能粗糙地解決session共享的問題。
對于一些不是太依賴session的應(yīng)用,或者只有用戶登錄時保存,那么我認為可以用Cookies代替。
即使真的要Session共享,我認為手動寫代碼保存到Memcached比為Tomcat加插件好,這樣能獲得更好的可控性。
而且我不用Tomcat,用Resin,這個msm就用不上啦,不過我會按照我的思想實現(xiàn)session共享,呵呵,個人愚見!!
?
?
嗯,我也試過像你一樣,手動寫代碼將會話寫到MEMCACHED中。但后來覺得在代碼級別來實現(xiàn)集群那不太好。 只是負載均衡的話,的確只要基于訪問IP地址的分發(fā)策略就可以了。但這要就不能實現(xiàn)高可用。如果集群中的某臺服務(wù)器掛掉,那這臺服務(wù)器上的session用戶都將丟失。
這里的memcachedNodes是填寫memcached節(jié)點,多個節(jié)點時可以以空隔分開,如:
n1:localhost:11211 n2:localhost:11212
sessionBackupTimeout的單位為分鐘
E:/java_codes/TestSession/WebContent 替換成你的WEB目錄
修改后重啟兩個TOMCAT即可,這個時候已經(jīng)解決SESSION的共享問題
這樣就解決了兩個應(yīng)用服務(wù)器之間session共享的問題?還是同步?,什么原理.講詳細點嘛
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

