實踐環境
windows10 64位
jdk 1.7
tomcat 7.0
nginx 1.10
memcached 1.4.4
打包下載
版本一致性很重要 不然會出現一系列莫名其妙的問題 這個我能用不代表你能使用
感謝:http://download.csdn.net/download/xu_xiao_ji/9550578
nginx安裝
http://www.oschina.net/question/1014681_107718?fromerr=8MXDvfOJ
將安裝包ngin解壓到X:/目錄
啓動Nginx:進入X:/nginx目錄,執行命令:start nginx.exe,彈出屏會一閃而逝。接着輸入tasklist /fi “imagename eq nginx.exe”,出現如下內容,表示nginx已正常啓動啦!在瀏覽器輸入http://localhost,可以看到Nginx的歡迎頁。
更多Nginx常用命令:
停止Nginx:nginx.exe -s stop|quit
重啓Nginx:nginx.exe -s reload
查看Nginx版本:nginx.exe -v
修改文件$NGINX_HOME/conf/nginx.conf。
Nginx+tomcat集羣 負載均衡配置
這裏我就一臺計算機搭建兩個tomcat 所有tomcat2的幾個端口不能和tomcat1重複 如果是兩天計算機跳過這裏
2 nginx /conf/nginx.conf配置修改
3 設置tomcat root 的index.jsp 添加tomcat1字樣 tomcat2添加tomcat2字樣
開啓nginx tomcat1 tomcat2 如果訪問localhost 刷新反覆出現tomcat1 tomcat2 則配置成功
tomcat+memcached實現session共享
1 將需要的jar放入tomcat/lib下
再次提醒不同序列化方式需要的jar包不一樣 而且jar的版本也決定成敗
2 配置tomcat/bin/context.xml 添加如下節點
我這裏端口改了默認是11211
我這裏使用的kryo序列化方案 不同序列化transcoderFactoryClass配置不同
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:localhost:11210"
failoveNodes="n1"
lockingMode="auto"
sticky="false"
requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$"
sessionBackupAsync= "false"
sessionBackupTimeout= "100"
copyCollectionsForSerialization="false"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
測試Nginx和Tomcat
測試Nginx是否實現負載均衡已經Tomcat能否共享session信息,分別在兩個Tomcat服務器的\webapps\ROOT目錄下新建兩個test.jsp頁面,內容如下:
Tomcat1
<span style="font-family:KaiTi_GB2312;font-size:18px;"><%@ page contentType="text/html;charset=UTF-8" isELIgnored="false"%>
SessionID:<%=session.getId()%>
<BR>
SessionIP:<%=request.getServerName()%>
<BR>
SessionPort:<%=request.getServerPort()%>
<%
out.println("This is Tomcat Server 1111111");
%>
</span>
Tomcat2
<span style="font-family:KaiTi_GB2312;font-size:18px;"><%@ page contentType="text/html;charset=UTF-8" isELIgnored="false"%>
SessionID:<%=session.getId()%>
<BR>
SessionIP:<%=request.getServerName()%>
<BR>
SessionPort:<%=request.getServerPort()%>
<%
out.println("This is Tomcat Server 2222222");
%></span>
通過瀏覽器訪問Nginx服務器,如下圖將訪問地址改成Nginx所在服務器。
反覆刷新瀏覽器,如果SessionID一直不變,下面的SessionPort的內容在不斷變化則說明配置成功。
Manager 節點詳細屬性補充
1.className 必須
類名:de.javakaffee.web.msm.MemcachedBackupSessionManager
2.memcachedNodes 必須
memcached節點:此屬性應該包含所有運行的 memcached節點或者membase bucket的uri地址,每一個memcached節點的屬性定義格式爲::, 多個節點定義直接使用空格或者逗號分隔,形如:memcachedNodes=”n1:app01:11211,n2:app02:11211”,如果只 有單個的memcached節點,則是可選項,只需配置:即可,形 如:memcachedNodes=”localhost:11211”。
如果我們配置的是membase,那麼從1.6.0版本開始,我們可以配置指定一個或者多個membase bucket uris,形如:http://host1:8091/pools,http://host2:8091/pools。Bucket 名稱和密碼通過屬性username,password來定義。membase buckets連接需要遵循memcached協議,傳輸數據通過二進制流方式。
3.failoverNodes 可選項
故障轉移節點:可選項,對非黏性session不可用,屬性必須包含memcached節點集羣的所有ids。節點id之間用空格或者逗號分隔。
4.username 可選項
從1.6.0版開始使用,並且是可選的。用來進行membase bucket或者SASL驗證,密碼可以爲空。
5.password 可選項
從1.6.0版開始使用,並且是可選的。用來進行membase bucket或者SASL驗證,密碼可以爲空。
6.memcachedProtocol 可選項
定義memcached協議,默認使用text文本,出屬性指明memcached使用的存儲協議。只支持text或者binary。
7.sticky 可選項
定義session方式爲黏性或非黏性,默認爲true,多個tomcat時需使用非黏性
8.lockingMode 可選項
只有非黏性session才使用,默認值爲none
none: 從不對session進行鎖定
all: session將一直被鎖定,知道請求結束
auto: 對於只讀請求,session將不會被鎖定,如果是非只讀請求,則session會被鎖定
uriPattern:: 通過正則表達式的方式來對請求uri以及查詢字符串進行匹配,只有匹配上的纔會被鎖定。
9.requestUriIgnorePattern 可選項
此屬性是那些不能改備份Session的請求的正則表達式。如果像css,javascript,圖片等靜態文件被同一個Tomcat和同一個應用 上下文來提供,這些請求也會通過memcached-session-manager。但是這些請求在一個http會話中幾乎沒什麼改變,所以他們沒必要 觸發Session備份。所以那些靜態文件沒必要觸發Session備份,你就可以使用此屬性定義。此屬性必須符合java regex正則規範。 如:”.*.(png|gif|jpg|css|js)$”10.sessionBackupAsync 可選項
指定Session是否應該被異步保存到Memcached中。 如果被設置爲true,backupThreadCount設置起作用,如果設置false,通過sessionBackupTimeout設置的過期時間起作用。
11.backupThreadCount 可選項
用來異步保存Session的線程數,(如果sessionBackupAsync=”true”)。默認值爲cup的內核數。
12.sessionBackupTimeout 可選項
設置備份一個Session所用的時間,如果操作超過時間那麼保存失敗。此屬性只在sessionBackupAsync=”false”是起作用。默認100毫秒
13.operationTimeout 可選項
從1.6.0版開始使用, 默認值爲1000
14.sessionAttributeFilter 可選項
此屬性是用來控制Session 中的那個屬性值保存到Memcached中的正則表達式。鄭則表達式被用來匹配Session中屬性名稱。如 sessionAttributeFilter=”^(userName|sessionHistory)$” 指定了只有”userName”和”sessionHistory”屬性保存到Memcached中。依賴於選擇的序列化策略。
15.transcoderFactoryClass 可選項
此屬性值是創建序列化和反序列化 保存到Memcached中的Session的編碼轉換器的工廠類名。這個指定的類必須實現了 de.javakaffee.web.msm.TranscoderFactory和提供一個無參的構造方法。例如其他的有效的實現在其他 packages/jars中提供如:msm-kryo-serializer,msm-xstrea-serializer和msm- javolution-serializer.
默認爲 de.javakaffee.web.msm.JavaSerializationTranscoderFactory
16.copyCollectionsForSerialization 可選項
默認值爲false。
17.customConverter 可選項
自己定義特殊的類註冊到kryo自定義轉換器中,實現序列化
18.enableStatistics 可選項
用來指定是否進行統計。 默認值爲true。
19.enabled 可選項
指定Session保存到Memcached中是否可用和是否可以通過JMX進行改變。只用於粘性Session。 默認值爲true。
nginx 配置詳細補充 可以實現動靜態分離
##定義nginx運行的用戶各用戶組
user nginx nginx;
##nginx進程數,建議設置與cpu核心數一致
worker_processes 1;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
##全局錯誤日誌定義類型[ debug | info | notice | warn | error | crit ]
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
##一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(系統的值ulimit -n)與nginx進程數相除,但是nginx分配請求並不均勻,所以建議與ulimit -n的值保持一致。
worker_rlimit_nofile 65535;
##進程文件
#pid logs/nginx.pid;
##工作模式與連接數上限
events {
##參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本內核中的高性能網絡I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
##單個進程的最大連接數
worker_connections 65535;
}
##設置http服務器
http {
##引入外置配置文件
include /etc/nginx/conf.d/*.conf;
##文件擴展名與文件類型映射表
include mime.types;
##默認文件類型
default_type application/octet-stream;
##默認編碼
#charset utf-8;
##服務器名字的hash表大小
#server_name_hash_bucket_size 128;
##上傳文件大小限制 建議打開
client_header_buffer_size 32K;
##設定請求緩存 建議打開
large_client_header_buffers 4 64K;
##最大緩存
client_max_body_size 20M;
client_header_timeout 20;
##日誌格式設定
#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指令指定nginx是否調用sendfile函數來輸出文件,對於普通應用設爲 on,如果用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡I/O處理速度,降低系統的負載。注意:如 果圖片顯示不正常把這個改成off。
sendfile on;
##開啓目錄列表訪問,合適下載服務器,默認關閉
#autoindex on;
##防止網絡阻塞 建議打開
tcp_nopush on;
##防止網絡阻塞 建議打開
tcp_nodelay on;
##長鏈接超時時間,單位是秒,爲0,無超時
keepalive_timeout 65;
##gzip模塊設置
##開啓gzip壓縮輸出 建議打開
gzip on;
##最小壓縮文件大小 建議打開
gzip_min_length 1k;
##壓縮緩衝區 建議打開
gzip_buffers 4 16k;
##壓縮版本(默認1.1,前端如果squid2.5請使用1.0) 建議打開
gzip_http_version 1.0;
##壓縮等級
gzip_comp_level 2; 建議打開
##壓縮類型,默認就已經包含了textxml,默認不用寫,寫上去也沒有問題,會有一個warn 建議打開
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
##開啓連接限制ip連接數使用
#limit_zone crawler $binary_remote_addr 10m;
##反向代理緩存Proxy Cache配置
proxy_temp_path /opt/cache/nginx/temp;
proxy_cache_path /opt/cache/nginx/cache levels=1:2 keys_zone=infcache:600m inactive=1d max_size=2g;
proxy_cache_path /opt/cache/nginx/proxy_cache_image levels=1:2 keys_zone=cache_image:3000m inactive=1d max_size=10g;
proxy_connect_timeout 30;
proxy_read_timeout 60;
proxy_send_timeout 20;
proxy_buffer_size 96k;
proxy_buffers 8 256k;
proxy_busy_buffers_size 512k;
proxy_temp_file_write_size 512k;
#proxy_cache_path配置
#keys_zone=infcache:600m 表示這個zone名稱爲infcache,分配的內存大小爲600MB
#/opt/cache/nginx/cache 表示cache這個zone的文件要存放的目錄
#levels=1:2 表示緩存目錄的第一級目錄是1個字符,第二級目錄是2個字符,即/data/ngx_cache/cache1/a/1b這種形式
#inactive=1d 表示這個zone中的緩存文件如果在1天內都沒有被訪問,那麼文件會被cache manager進程刪除掉
#max_size=10g 表示這個zone的硬盤容量爲10GB
##FastCGI相關參數是爲了改善網站的性能:減少資源佔用,提高訪問速度。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
##載均衡,weight權重,權值越高被分配到的機率越大
upstream myserver{
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=4;
server 192.168.1.12:8080 weight=1;
}
##虛擬主機配置
server {
##監聽端口
listen 80;
##域名可以有多個,用空格隔開
server_name localhost;
#charset koi8-r;
##定義本虛擬主機的訪問日誌
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
##圖片緩存時間設置
location ~.*.(gif|jpg|jpeg|png|bmp|swf)${
expires 10d;
}
##js和CSS緩存時間設置
location ~.*.(js|css)?${
expires 1h;
}
#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;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
##對 "/" 啓用反向代理
location / {
##或者使用
#proxy_pass http://myserver;
proxy_pass http://127.0.0.1:88;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;#後端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#以下是一些反向代理的配置,可選。
proxy_set_header Host $host;
client_max_body_size 10m; #允許客戶端請求的最大單文件字節數
client_body_buffer_size 128k; #緩衝區代理緩衝用戶端請求的最大字節數,
proxy_connect_timeout 90; #nginx跟後端服務器連接超時時間(代理連接超時)
proxy_send_timeout 90; #後端服務器數據回傳時間(代理髮送超時)
proxy_read_timeout 90; #連接成功後,後端服務器響應時間(代理接收超時)
proxy_buffer_size 4k; #設置代理服務器(nginx)保存用戶頭信息的緩衝區大小
proxy_buffers 4 32k; #proxy_buffers緩衝區,網頁平均在32k以下的設置
proxy_busy_buffers_size 64k; #高負荷下緩衝大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #設定緩存文件夾大小,大於這個值,將從upstream服務器傳
}
##設定查看Nginx狀態的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file confpasswd;
#htpasswd文件的內容可以用apache提供的htpasswd工具來產生。
}
##本地動靜分離反向代理配置
#所有jsp的頁面均交由tomcat或resin處理
location ~ .(jsp|jspx|do)?$ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
##所有靜態文件由nginx直接讀取不經過tomcat或resin
location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{ expires 15d; }
location ~ .*.(js|css)?$
{ expires 1h; }
}
}