一.簡介
我們系統(tǒng)經(jīng)常要保存用戶登錄信息,有Cookie和Session機制,Cookie客戶端保存用戶信息,Session在服務端保存用戶信息,如果瀏覽器不支持Cookie或者用戶把Cookie禁掉了,Cookie就用不了,還有不同的瀏覽器采用不用方式保存Cookie,所以我們采用Session服務端來保存,上一節(jié)我們有介紹了Tomcat集群部署,怎么樣集群的Tomcat對同個用戶請求的都能獲取保存在Session的用戶信息,采用了Memcached管理Session,Memcached 是一個高性能的分布式內(nèi)存對象緩存系統(tǒng),接下來我們介紹Nginx+Tomcat+Memcached實現(xiàn)Session共享。
二.Tomcat、Nginx、Memcached配置
第一步:Memcached的安裝部署Memcached部署 這查看這篇文章
第二步:Nginx的安裝 Nginx的安裝部署 這查看這篇文章
第三步:Tomcat和JDK的安裝和環(huán)境配置 Tomcat和JDK的安裝部署 這查看這篇文章
三.實現(xiàn)
我們采用Memcached管理Session,主要是memcached-session-manager開源tomcat插件改變Tomcat原始的Session存儲機制,將session的存儲放到分布式緩存Memcached中,從而實現(xiàn)對Session的共享。
第一步:我們在Apache-tomcat-8081和Apache-tomcat-8082 下的ROOT實現(xiàn)一個index.jsp,如下代碼所示:
Apache-tomcat-8081的index.jsp
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Insert title here</title>
- </head>
- <body>
-
- hello apache-tomcat-8081 index.jsp
-
- sessionId:<%=session.getId()%>
- <BR>
- sessionIp:<%=request.getServerName()%>
- <BR>
- sessionPort:<%=request.getServerPort()%>
- </body>
- </html>
Apache-tomcat-8082的index.jsp
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Insert title here</title>
- </head>
- <body>
-
- hello apache-tomcat-8082 index.jsp
-
- sessionId:<%=session.getId()%>
- <BR>
- sessionIp:<%=request.getServerName()%>
- <BR>
- sessionPort:<%=request.getServerPort()%>
- </body>
- </html>
第二步:啟動Memcached服務
#/opt/bin/memcached -d -m 5 -u root -l 192.168.74.129 -p 12000 -c 256 -P /tmp/memcached.pid ,如圖所示:
第三步:Nginx作為了代理服務器,客服端請求服務器端時,采用了負載均衡來處理,這樣就能平均的把客服端請求分發(fā)到每一天服務器,這樣減少服務器端的壓力。實現(xiàn)動靜態(tài)分離,配置Nginx下的nginx.conf文件。
#vi /usr/local/nginx/conf/nginx.conf
- <span style="color:#333333;">#user nobody;
- worker_processes 1;
- error_log logs/error.log;
- pid logs/nginx.pid;
-
- events {
- use epoll;
- 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;
- keepalive_timeout 65;
- gzip on;
- gzip_min_length 1k;
- gzip_buffers 4 16k;
- gzip_http_version 1.0;
- gzip_comp_level 2;
- gzip_types text/plain application/x-javascript text/css application/xml;
- gzip_vary on;
- </span><span style="color:#ff0000;">upstream localhost_server {
- ip_hash;
- server 192.168.74.129:8081;
- server 192.168.74.129:8082;
- }</span><span style="color:#333333;">
-
- server {
- listen 80 default;
- server_name localhost;
- </span><span style="color:#ff0000;"> location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ //由nginx處理靜態(tài)頁面</span><span style="color:#333333;">
- {
- root /usr/tomcat/apache-tomcat-8081/webapps/ROOT;
- expires 30d; //緩存到客戶端30天
- }
- error_page 404 /404.html;
-
- #redirect server error pages to the static page /50x.html
-
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- root html;
- }
- </span><span style="color:#ff6666;"> location ~ \.(jsp|do)$ {//所有jsp的動態(tài)請求都交給Tomcat處理 </span><span style="color:#333333;">
- </span><span style="color:#c0c0c0;">proxy_pass http://localhost_server; //來自jsp或者do的后綴的請求交給tomcat處理</span><span style="color:#333333;">
- proxy_redirect off;
- proxy_set_header Host $host; //后端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- client_max_body_size 10m; //允許客戶端請求的最大單文件字節(jié)數(shù)
- client_body_buffer_size 128k; //緩沖區(qū)代理緩沖用戶端請求的最大字節(jié)數(shù)
- proxy_connect_timeout 90; //nginx跟后端服務器連接超時時間
- proxy_read_timeout 90; //連接成功后,后端服務器響應時間
- proxy_buffer_size 4k; //設(shè)置代理服務器(nginx)保存用戶頭信息的緩沖區(qū)大小
- proxy_buffers 6 32k; //proxy_buffers緩沖區(qū),網(wǎng)頁平均在32k以下的話,這樣設(shè)置
- proxy_busy_buffers_size 64k;//高負荷下緩沖大?。╬roxy_buffers*2)
- proxy_temp_file_write_size 64k; //設(shè)定緩存文件夾大小,大于這個值,將從upstream服務器傳
- }
-
- }
-
- }</span>
第四步:修改了Apache-tomcat-8081和Apache-tomcat-8082下的conf/context.xml 文件,修改session的存儲方式。
在<Context></Context>標簽里加入
- <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="<span style="color:#ff0000;">n1:192.168.74.129:12000</span>" sessionBackupAsync="false" sessionBackupTimeout="100" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" copyCollectionsForSerialization="false" requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"/>
說明:
1.requestUriIgnorePatter:過濾圖片等靜態(tài)文件去觸發(fā)Session備份到Memcached。
2.sessionBackupAsync:指定Session是否應該被異步保存到Memcached中。
3.backupThreadCount :用來異步保存Session的線程數(shù)。
4.sessionBackupTimeout :默認100毫秒,操作超過時間那么保存失敗。
第五步: 要引入memcached-session-manager所需要的jar包
如果在tomcat/lib下沒引入時,會報找不到對應的類,如圖所示:
需要的jar
memcached-session-manager-1.6.3.jar
javolution-5.5.1.jar
spymemcached-2.7.1.jar
memcached-session-manager-tc6-1.6.3.jar
msm-javolution-serializer-1.6.3.jar
msm-xstream-serializer-1.6.3.jar
到這里下載 所需JAR
1.這邊需要注意的是,我們那時引入這個memcached-2.6.jar包,而不是映入spymemcached-2.7.1.jar時會報這個錯誤,如圖所示:
2.memcached-session-manager-tc6-1.6.3.jar這個包時針對tomcat6
第六步:啟動Nginx、Tomcat服務
1.啟動Tomcat
#./bin/startup.sh;tail -f ./logs/catalina.out,這邊可以查看到修改保存session的方式,并查看是否配置正確,如圖所示:
2.啟動Nginx
#cd /usr/local/nginx
#sbin/nginx
第七步:訪問index.jsp
1.我們先試一下不通過Nginx反向代理,我們直接訪問tomcat是否能訪問jsp,并測試我們所寫的JSP是否正確,并sessionId能正常顯示,如圖所示:
2.我們訪問Nginx反向代理,我們部署了Apache-tomcat-8081和Apache-tomcat-8082兩個集群,我們查看一下是否能共用一個session,我們在頁面打印出來,看sessionId是否一樣?
請求地址都是192.168.74.129/index.jsp,我們多刷幾次,頁面的端口就會改變,我們查看調(diào)用Apache-tomcat-8081的index.jsp與調(diào)用Apache-tomcat-8082的index.jsp的sessionId會不會改變,如圖所示:
Apache-tomcat-8081的index.jsp并顯示SessionId
Apache-tomcat-8082的index.jsp并顯示SessionId
這時發(fā)現(xiàn)調(diào)用Apache-tomcat-8081的index.jsp與調(diào)用Apache-tomcat-8082的index.jsp的SessionId一樣,說明共用同一個session。