Nginx +Tomcat 集羣+memcached 實現負載均衡和session共享[實踐篇Windows]

實踐環境

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集羣 負載均衡配置

  1. 這裏我就一臺計算機搭建兩個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; }
  }
}

發佈了70 篇原創文章 · 獲贊 10 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章