前兩種均須要使用 memcached 或 redis 存儲 session ,最後一種使用 terracotta 服務器共享。
建議使用 redis ,不單單由於它能夠將緩存的內容持久化,還由於它支持的單個對象比較大,並且數據類型豐富,
不僅是緩存 session ,還能夠作其餘用途,一舉幾得啊。 css
test url: http://sms.reyo.cn/session.jsp
一、使用 filter 方法存儲
這種方法比較推薦,由於它的服務器使用範圍比較多,不只限於 tomcat ,並且實現的原理比較簡單容易控制。
能夠使用 memcached-session-filter
官方網址:http://code.google.com/p/memcached-session-filter/
官方介紹:解決集羣環境下java web容器session共享,使用filter攔截器和memcached實現。在tomcat 6和websphere 8測試經過,現網併發2000,日PV量1100萬。
暫不支持session event包括create destory 和 attribute change
東西很不錯,體積很小,不過這個東東要和 spring 一塊兒使用,並且要求存儲到 memcached 的對象要實現 java 的序列化接口
你們也知道,java 自己的序列化性能也很通常。
我將其簡單擴展了一下,再也不依賴 spring ,而且利用 javolution 實現序列化,緩存的對象再也不有限制。
暫時沒有發現 redis 的實現,後面將本身實現使用 redis 存儲而且序列化使用 kyro ,詳細狀況有時間再單獨寫出來。
二、使用 tomcat session manager 方法存儲
這種方法服務器只能使用 tomcat ,但網上有針對 memcached 和 redis 實現,直接配置就好了。
memcached 實現:
網址:http://code.google.com/p/memcached-session-manager/
修改 tomcat 的 conf 目錄下的 context.xml 文件:
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:localhost:11211 n2:localhost:11212"
failoverNodes="n2"
requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"
sessionBackupAsync="false"
sessionBackupTimeout="100"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
copyCollectionsForSerialization="false" />
以上是以 1.3 版爲例子,須要用的 jar 包:
memcached-session-manager-1.3.0.jar
msm-javolution-serializer-1.3.0.jar
javolution-5.4.3.1.jar
memcached-2.4.2.jar
redis 實現:
網址:https://github.com/jcoleman/tomcat-redis-session-manager
一樣修改 tomcat 的 conf 目錄下的 context.xml 文件:
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"
host="localhost"
port="6379"
database="0"
maxInactiveInterval="60"/>
以上是以 1.2 版爲例子,須要用的 jar 包:
tomcat-redis-session-manager-1.2-tomcat-6.jar
jedis-2.1.0.jar
commons-pool-1.6.jar
三、使用 terracotta 服務器共享
這種方式配置有點複雜,你們到網上搜索一下吧。
以上配置成功後,前端使用 nginx 進行負載均衡就好了,同時使用 Gzip 壓縮 和 靜態文件緩存。html
如下是實例:前端
1.memcached配置:(v1.4.13)java
節點1(192.168.159.131:11444)nginx
節點2(192.168.159.131:11333)git
2.tomcat配置github
tomcat1(192.168.159.128:8081)web
tomcat2(192.168.159.128:8082)redis
3.nginx安裝在192.168.159.131。spring
首先,是配置tomcat,使其將session保存到memcached上。有兩種方法:
方法一:在server.xml中配置。
找到host節點,加入
<Context docBase="/var/www/html" path=""> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.159.131:11444 n2:192.168.159.131:11333" requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$" sessionBackupAsync="false" sessionBackupTimeout="3000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" copyCollectionsForSerialization="false" /> </Context>
方法二:在context.xml中配置。
找到Context節點,加入
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.159.131:11444" requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$" sessionBackupAsync="false" sessionBackupTimeout="3000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" copyCollectionsForSerialization="false" />
其次,配置nginx,用於測試session保持共享。
upstream xxy.com { server 192.168.159.128:8081 ; server 192.168.159.128:8082 ; } log_format www_xy_com '$remote_addr - $remote_user [$time_local] $request ' '"$status" $body_bytes_sent "$http_referer"' '"$http_user_agent" "$http_x_forwarded_for"'; server { listen 80; server_name xxy.com; location / { proxy_pass http://xxy.com; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } access_log /data/base_files/logs/www.xy.log www_xy_com; }最後,將你的應用放到兩個tomcat中,並依次啓動memcached、tomcat、nginx。訪問你的nginx,能夠發現兩個tomcat中的session能夠保持共享了。
1.redis配置(192.168.159.131:16300)(v2.8.3)
2.tomcat配置
tomcat1(192.168.159.130:8081)
tomcat2(192.168.159.130:8082)
3.nginx安裝在192.168.159.131。
首先,是配置tomcat,使其將session保存到redis上。有兩種方法,也是在server.xml或context.xml中配置,不一樣的是memcached只須要添加一個manager標籤,而redis須要增長的內容以下:(注意:valve標籤必定要在manager前面。)
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" /> <Manager className="com.radiadesign.catalina.session.RedisSessionManager" host="192.168.159.131" port="16300" database="0" maxInactiveInterval="60"/>其次,配置nginx,用於測試session保持共享。
upstream redis.xxy.com { server 192.168.159.130:8081; server 192.168.159.130:8082; } log_format www_xy_com '$remote_addr - $remote_user [$time_local] $request ' '"$status" $body_bytes_sent "$http_referer"' '"$http_user_agent" "$http_x_forwarded_for"'; server { listen 80; server_name redis.xxy.com; location / { proxy_pass http://redis.xxy.com; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } access_log /data/base_files/logs/redis.xxy.log www_xy_com; }最後,將你的應用放到兩個tomcat中,並依次啓動redis、tomcat、nginx。訪問你的nginx,能夠發現兩個tomcat中的session能夠保持共享了。
上面文章中,有一點須要說明的是:
若是tomcat配置中,將manager放在server.xml中,那麼使用maven作熱部署時,會發生失敗。因此,推薦放在context.xml中。