nginx+tomcat+memcached負載均衡集群搭建詳細筆記(下)
上一篇我向大家介紹了JDK的安裝,nginx的安裝以及memcached的安裝,是不是覺得很棒棒噠,下面我將和大家分享一下Tomcat的安裝+配置memcached。
1、安裝Tomcat
Tomcat官網:http://tomcat.apache.org/
我使用的版本:apache-tomcat-7.0.42.tar.gz
1.1解壓在usr/local/目錄下(可以自己選)
1.2重命名為Tomcat(不是必須的,只是這樣看著習慣)
1.3編輯/etc/profile加上以下語句
CATALINA_BASE=/usr/local/tomcat CATALINA_HOME=/usr/local/tomcat export CATALINA_BASE CATALINA_HOME
1.4進入tomcat/bin目錄下面,運行
# ./startup.sh
1.5然后訪問http://localhost:8080看是否訪問成功.如果看到了tomcat的歡迎界面,congratulations, you are a good boy/girl.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.6但是現在我們只有一個tomcat。所以,接下來在我們的機器上要搭建多個tomcat,首先我們先復制一份以前的tomcat(我的tomcat是在/usr/local/下),執行命令
cp /usr/local/tomcat /usr/local/tomcat2
1.7應為要兩個不同的tomcat使用不同的環境變量,所以我們需要修改/etc/profile的文件配置信息
gedit /etc/profile
然后修改成這樣:
#tomcat CATALINA_BASE=/usr/local/tomcat CATALINA_HOME=/usr/local/tomcat export CATALINA_BASE CATALINA_HOME #tomcat2 CATALINA_2_BASE=/usr/local/tomcat2 CATALINA_2_HOME=/usr/local/tomcat2 export CATALINA_2_BASE CATALINA_2_HOME
TOMCAT_HOME=/usr/local/tomcat export TOMCAT_HOME TOMCAT_2_HOME=/usr/local/tomcat2 export TOMCAT_2_HOME1.8最后一步我們需要修改tomcat2里面的配置文件。首先我們修改tomcat2/bin下面的startup.sh和shutdown.sh 添加以下內容
export JAVA_HOME=/usr/local/jdk export PATH=.:$HADOOP_HOME/bin:$ZOOKEEPER_HOME/bin:$HBASE_HOME/bin:$JAVA_HOME/bin:$PATH export CATALINA_HOME=$CATALINA_2_HOME export CATALINA_BASE=$CATALINA_2_BASE1.9然后進去tomcat2/server.xml中修改以下幾個地方
<Server port="8005" shutdown="SHUTDOWN">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">把8005->8006,8080->8081,8009->8010就好了(具體端口由自己定就行了),增加: jvmRoute="tomcat2",對tomcat/server.xml只需要增加以下jvmRoute="tomcat"
1.10然后進入tomcat1/bin,tomcat2/bin下面執行
./startup.sh好了,nice
1.11用瀏覽器進去localhost:8080和localhost:8081看看把,兩個tomcat就已經搭建成功了
2、為Tomcat配置memcached
NGINX負載的幾種方式
nginx 的 upstream目前支持 4 種方式的分配
1)、輪詢(默認)
每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器down掉,能自動剔除。
2)、weight
指定輪詢幾率,weight和訪問比率成正比,用于后端服務器性能不均的情況。
2)、ip_hash
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題。
3)、fair(第三方)
按后端服務器的響應時間來分配請求,響應時間短的優先分配。
4)、url_hash(第三方)'
ip_hash其實上不能夠完全解決ip問題,因為有很多用戶的ip隨時都可能在變動,ip_hash這個名字你就知道,是通過hash散列的原理將用戶的ip散列到指定的tomcat上,自然而然的想當然的解決了session問題,最好是用memcached存取來實現session共享,下面看我的nginx.conf的配置:
#運行nginx所在的用戶名和用戶組
#user www www;
#啟動進程數
worker_processes 8;
#全局錯誤日志及PID文件
error_log /usr/local/nginx/logs/nginx_error.log crit;
pid /usr/local/nginx/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;
#工作模式及連接數上限
events
{
use epoll;
worker_connections 65535;
}
#設定http服務器,利用它的反向代理功能提供負載均衡支持
http
{
#設定mime類型
include mime.types;
default_type application/octet-stream;
include /usr/local/nginx/conf/proxy.conf;
#charset gb2312;
#設定請求緩沖
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
#client_max_body_size 8m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
# 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;
# 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;
#limit_zone crawler $binary_remote_addr 10m;
upstream tomcat{ # 負載均衡站點的名稱為tomcat,可以自己取
# ip_hash; # 可選,根據來源IP方式選擇web服務器,省略的話按默認的輪循方式選擇web服務器
server 127.0.0.1:8080; # web服務器的IP地址及tomcat發布端口
server 127.0.0.1:8081;
}
server {
listen 80; # 站點偵聽端口80
server_name localhost; # 站點名稱
location / {
root html;
index index.html index.htm;
proxy_pass http://tomcat; # 負載均衡指向的發布服務tomcat
}
}
}2.1 Tomcat要支持memcached管理Session,需要調用一些jar庫文件如下(網上有的文章中可能所說的jar包不全,或者版本不樣的會報錯,但這里我已經經過驗證了,簡直nice):
1) couchbase-client-1.2.2.jar
2) javolution-5.5.1.jar
3) kryo-1.03.jar
4) kryo-serializers-0.10.jar
5) memcached-session-manager-1.6.5.jar
6) memcached-session-manager-tc7-1.6.5
7) minlog-1.2.jar
8) msm-kryo-serializer-1.6.3.jar
9) reflectasm-1.01.jar
10)spymemcached-2.10.2.jar
2) javolution-5.5.1.jar
3) kryo-1.03.jar
4) kryo-serializers-0.10.jar
5) memcached-session-manager-1.6.5.jar
6) memcached-session-manager-tc7-1.6.5
7) minlog-1.2.jar
8) msm-kryo-serializer-1.6.3.jar
9) reflectasm-1.01.jar
10)spymemcached-2.10.2.jar
特別要注意,這些jar包的版本,要不然你會難受至極:
1)msm1.6.5依賴了Couchbase,需要添加couchbase-client的jar包,否則啟動會報:java.lang.NoClassDefFoundError:com/couchbase/client/CouchbaseClient。
2)Tomcat6和Tomcat7使用不同msm支持包:memcached-session-manager-tc6-1.6.5.jar和memcached-session-manager-tc7-1.6.5.jar,只可選一,否則啟動報錯。
3)msm源碼中的lib包版本太低:spymemcached需要使用2.10.2,否則啟動tomcat報錯:java.lang.NoSuchMethodError:net.spy.memcached.MemcachedClient.set(Ljava/lang/String;ILjava/lang/Object;)Lnet/spy/memcached/internal/OperationFuture;atde.javakaffee.web.msm.BackupSessionTask.storeSessionInMemcached(BackupSessionTask.java:227)
4)kryo-serializers需要使用0.10版本,否則報錯:
Caused by:java.lang.ClassNotFoundException: de.javakaffee.kryoserializers.DateSerializer
2)Tomcat6和Tomcat7使用不同msm支持包:memcached-session-manager-tc6-1.6.5.jar和memcached-session-manager-tc7-1.6.5.jar,只可選一,否則啟動報錯。
3)msm源碼中的lib包版本太低:spymemcached需要使用2.10.2,否則啟動tomcat報錯:java.lang.NoSuchMethodError:net.spy.memcached.MemcachedClient.set(Ljava/lang/String;ILjava/lang/Object;)Lnet/spy/memcached/internal/OperationFuture;atde.javakaffee.web.msm.BackupSessionTask.storeSessionInMemcached(BackupSessionTask.java:227)
4)kryo-serializers需要使用0.10版本,否則報錯:
Caused by:java.lang.ClassNotFoundException: de.javakaffee.kryoserializers.DateSerializer
下載后,將這些庫文件放到tomcat\lib目錄下。
2.2為Tomcat配置memcached
配置文件目錄:tomcat\conf\context.xml,記得兩個Tomcat都要配的哦。
打開配置文件,在<Context>...</Context>節點中添加如下內容:
打開配置文件,在<Context>...</Context>節點中添加如下內容:
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:127.0.0.1:11211"
requestUriIgnorePattern=".*\.(png|gif|jpg|css|js|ico|jpeg|htm|html)$"
sessionBackupAsync="false"
sessionBackupTimeout="100"
copyCollectionsForSerialization="false" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/> 參數說明:memcachedNodes:memcached服務器信息,多個服務器時,使用空格分開,如:
n1:127.0.0.1:11211 n2:127.0.0.1:11211
n1:127.0.0.1:11211 n2:127.0.0.1:11211
配置文件如下圖:

2.3測試Session共享
我是在Windows下用myeclipse新建一個web項目,我的項目名是:TOMCAT_SESSION,在index.jsp下寫上:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>Tomcat+memcached共享session測試</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
SessionID:<%=session.getId()%>
<BR>
SessionIP:<%=request.getServerName()%>
<BR>
SessionPort:<%=request.getServerPort()%>
<BR>
<%
out.println("This is Tomcat Server 8080.");
%>
</body>
</html> 然后打包成.war文件,將其弄到centos6.4的tomcat的webapps目錄下即可。
再將index.jsp中的out.println("This is Tomcat Server 8080.");改成out.println("This is Tomcat Server 8081.");,打包成.war文件,也將其弄到centos6.4的tomcat2(另一個tomcat)的webapps目錄下即可。
好了,啟動這些:nginx,memcached,tomcat,tomcat2,這樣準備就緒了。
打開你的瀏覽器輸入:http://localhost/TOMCAT_SESSION/index.jsp,會出現如下界面:

再按F5刷新一次,出現如下界面:

對比一下,兩次得到的session是一樣的。哈哈,測試成功~棒棒噠
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!