日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nginx+tomcat+memcache实现负载均衡、session共享

發(fā)布時(shí)間:2023/11/27 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nginx+tomcat+memcache实现负载均衡、session共享 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

實(shí)驗(yàn)架構(gòu)圖:

?

Table of Contents

1、配置tomcat

2、安裝memcache

3、查看tomcat和memcache是否配置好

4、nginx實(shí)現(xiàn)負(fù)載均衡:

5、客戶端進(jìn)行測試:

6、驗(yàn)證結(jié)論:

7、總結(jié):


實(shí)驗(yàn)環(huán)境

linux? redhat6.5?? 防火墻關(guān)閉,三臺虛擬機(jī)和一臺物理機(jī)

????????????????? 主機(jī)

????????????????????? 操作系統(tǒng)

?????????????????????????? IP地址

??????????????? nginx

????

? ? ? ? ? ? ? ? ? ?? redhat6.5

?

? ? ? ? ? ? ? ? ? ? ? ? test1:? 172.25.1.11

????????????? tomcat1??

??????????????????????? test2:? 172.25.1.12

????????????? tomcat2??

??????????????????????? test3:? 172.25.1.13

??????????? memcache1

??????????????????????? test2:? 172.25.1.12

??????????? memcache2

??????????????????????? test3:? 172.25.1.13

?解釋: nginx做為反向代理,實(shí)現(xiàn)靜動分離,將客戶動態(tài)請求根據(jù)權(quán)重隨機(jī)分配給兩臺tomcat服務(wù)器,memcache做為兩臺tomcat的共享session數(shù)據(jù)服務(wù)器。

1、配置tomcat

在test2和test3分別配置tomcat服務(wù)(這里只演示test2的配置,配置有區(qū)別的地方已經(jīng)用紅色標(biāo)出來)

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

[root@test2 ~]# tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local
[root@test2 ~]# ln -s /usr/local/jdk1.7.0_79/ /usr/local/jdk
[root@test2 ~]# vim /etc/profile

export JAVA_HOME=/usr/local/jdk
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin

[root@test2 ~]# source /etc/profile???????????? //刷新環(huán)境變量

[root@test2 ~]# which java???????????? //查看java路徑
/usr/local/jdk/bin/java
[root@test2 ~]# which javac
/usr/local/jdk/bin/java

此時(shí)java環(huán)境就搭建好了

[root@test2 ~]# vim test.java??????????? //寫一個(gè)java程序試試看能否運(yùn)行,內(nèi)容如下:

public class test
{
??????? public static void main(String[] args)
??????? {
??????????????? System.out.println("hello world");
??????? }
}

[root@test2 ~]# javac test.java????????? //進(jìn)行編譯
[root@test2 ~]# java test???????????? //運(yùn)行java

此時(shí)我們安裝tomcat

[root@test2 ~]# tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local/
[root@test2 ~]# cd /usr/local/
[root@test2 local]# ln -s apache-tomcat-7.0.37/ tomcat????????????? //做個(gè)軟鏈接

[root@test2 local]# cd tomcat/apache-tomcat-7.0.37/

[root@test2 apache-tomcat-7.0.37]# mv * ..

[root@test2 apache-tomcat-7.0.37]# cd

session 的序列化方案官方推薦的有 4 種:
1. java serialization
2. msm-kryo-serializer
3. msm-javolution-serializer
4. msm-xstream-serializer
其中性能最好的序列化方案是 Kryo,此實(shí)驗(yàn)我們采用 kryo 方式

把如下jar軟件包下載好放置到/usr/local/tomcat/lib 目錄中,jar軟件包包含如下內(nèi)容:

[root@test2 jar]# cd
[root@test2 ~]# mv jar/? /usr/local/tomcat/lib
[root@test2 ~]# cd /usr/local/tomcat/lib/jar/
[root@test2 jar]# mv * ..
[root@test2 jar]# cd ..
[root@test2 lib]# ls

[root@test2 ~]# rm -rf jar

[root@test2 ~]# vim /usr/local/tomcat/conf/context.xml???????????????? //配置memcache緩存

......

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
? memcachedNodes="n1:172.25.1.12:11211,n2:172.25.1.13:11211" //memcache的兩個(gè)節(jié)點(diǎn),11211是memcache的端口號
??? failoverNodes="n1"???????????? //test3和test2的區(qū)別是在這里寫n2
????? requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
??????? transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
????????? />
</Context>

[root@test2 local]# cd tomcat/
[root@test2 tomcat]# bin/startup.sh????????? ? ? ?? //開啟tomcat服務(wù); /usr/local/tomcat/bin/shutdown.sh 為關(guān)閉tomcat服務(wù)

?? //查看tomcat的端口號

此時(shí),瀏覽器分別輸入test2和test3對應(yīng)的ip及服務(wù)端口號8080進(jìn)行查看:

均可以訪問到,此時(shí)test2和test3兩主機(jī)的tomcat服務(wù)就搭建完成啦。

溫馨提示:如果訪問時(shí)出現(xiàn)網(wǎng)頁空白的情況,可以嘗試用ps命令查看tomcat(java)的進(jìn)程id號,然后kill -9 id 將進(jìn)程殺掉,然后重啟服務(wù),再次查看應(yīng)該就可以了,網(wǎng)頁還是出不來你可以先將配置memcache的配置文件剛才添加的內(nèi)容刪掉,看是否可以訪問,若可以,則說明是配置文件添加的內(nèi)容的問題;若不能訪問,則是下載過程中的問題。

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

2、安裝memcache

test2和test3上執(zhí)行:

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""'

[root@test2 ~]# yum install -y memcache

[root@test2 ~]# /etc/init.d/memcached start

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

3、查看tomcat和memcache是否配置好

[root@test2 ~]# cd /usr/local/tomcat/logs/
[root@test2 logs]# > catalina.out
[root@test2 logs]# cd -
/usr/local/tomcat
[root@test2 tomcat]# ./bin/startup.sh
Using CATALINA_BASE:?? /usr/local/tomcat
Using CATALINA_HOME:?? /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:??????? /usr/local/jdk
Using CLASSPATH:?????? /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
[root@test2 tomcat]# cd -
/usr/local/tomcat/logs
[root@test2 logs]# cat catalina.out??????????????????? //看到如下結(jié)果,說明已經(jīng)配置成功

4、nginx實(shí)現(xiàn)負(fù)載均衡:

用nginx默認(rèn)自帶的proxy和upstream模塊來實(shí)現(xiàn)后端web負(fù)載均衡,用nginx的sticky模塊實(shí)現(xiàn)session共享

這里要用到sticky模塊,所以提前下載nginx及nginx-sticky-module壓縮包,進(jìn)行源碼編譯,具體步驟看上一篇博客的后半片(擴(kuò)展模塊sticky部分),這里不再贅述。

上文博客連接:https://blog.csdn.net/weixin_41922887/article/details/89421210

只在test1上進(jìn)行:

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

[root@test1 ~]# useradd -s /sbin/nologin nginx??????????????? //創(chuàng)建nginx程序用戶,編譯的時(shí)候用到

[root@test1 ~]# id nginx

nginx已經(jīng)實(shí)現(xiàn)sticky模塊的負(fù)載均衡

[root@test1 ~]# /opt/nginx/sbin/nginx -t???????????????? //查看nginx的狀態(tài)

修改配置文件

[root@test1 ~]# vim /opt/nginx/conf/nginx.conf

user? nginx?? nginx;?????????????????????????????? ? //剛才創(chuàng)建的nginx用戶

worker_processes? 2;
events {
??? worker_connections? 65535;
}

http {
??? upstream server {
?? ?sticky;????????? ? ? ? ? ? ?? ????? //sticky模塊,目的是當(dāng)同一個(gè)用戶動態(tài)訪問時(shí)將請求發(fā)到同一個(gè)tomcat上,實(shí)現(xiàn)session的共享
?? ?server 172.25.1.12:8080;
?? ?server 172.25.1.13:8080;
?? ?}
??? include?????? mime.types;
??? default_type? application/octet-stream;

??? sendfile??????? on;
??? keepalive_timeout? 65;

??? #gzip? on;

??? server{
??????? listen?????? 80;
??????? server_name? www.westos.org;???????????????????????? //訪問時(shí)的域名
?? ?location / {
????????????? root?? html;
????????????? index? index.html index.htm;
?? ?}
??????? location ~ \.jsp$ {??????????????????????????????????????????????? //所有 jsp 頁面交給 tomcat 處理,動靜分離
????? ??? ??? ? proxy_pass http://server;
?? ?}

??????? error_page?? 500 502 503 504? /50x.html;
??????? location = /50x.html {
??????????? root?? html;
??????? }
??? }
}

[root@test1 ~]# /opt/nginx/sbin/nginx -t??????????? //檢查語法是否有錯(cuò)誤

[root@test1 ~]# /opt/nginx/sbin/nginx?????????? //開啟服務(wù)

此時(shí),我們的所有服務(wù)就搭建完成了。

5、客戶端進(jìn)行測試:

測試nginx服務(wù):

靜態(tài)測試:

在test1上執(zhí)行:

[root@test1 ~]# cd /opt/nginx/html/?????????????????? //nginx的默認(rèn)發(fā)布路徑
[root@test1 html]# ls
50x.html index.html
[root@test1 html]# vim cxx.html???????????????????? //寫一個(gè)靜態(tài)的文件cxx.html
<h1>it's a static nginx</h1>

此時(shí)在網(wǎng)頁進(jìn)行測試:

動態(tài)測試:
test2和test3都執(zhí)行(這里只演示test2):

[root@test2 ~]# cd /usr/local/tomcat/webapps/ROOT/
[root@test2 ROOT]# vim test.jsp

The time is:<%=new java.util.Date() %>

客戶端進(jìn)行訪問:

再如:

[root@test2 ROOT]# vim cxx.jsp ??????????????????????

<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("<b>Session list</b>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
%<form action="test.jsp" method="POST">
%name:<input type=text size=20 name="dataName">
%<br>
%key:<input type=text size=20 name="dataValue">
%<br>
%<input type=submit>
%</form>
%</body>
%</html>

[root@test2 ROOT]# scp westos.jsp root@test3:/usr/local/tomcat/webapps/ROOT?? ?? //test2和test3同時(shí)添加,scp直接發(fā)過去就好

可以看出,訪問動態(tài)頁面時(shí)用到后端服務(wù)器,這里接受訪問請求的是test2,對應(yīng)的memcache是test3

也可以看出,不管怎么刷新或者重新訪問,只要是同一臺主機(jī),則接受請求的服務(wù)器不會變,和第一次訪問時(shí)是同一臺服務(wù)器。

6、驗(yàn)證結(jié)論:

現(xiàn)在將test3的memcache服務(wù)關(guān)閉并進(jìn)行刷新操作,則此時(shí):

[root@test3 tomcat]# /etc/init.d/memcached stop?????????? //可以看出此時(shí)memcache變?yōu)閠est2節(jié)點(diǎn),而請求還是會交給test2的 tomcat,沒有因?yàn)閠est3的memcache掛掉而丟掉

將test3的memcache恢復(fù)狀態(tài)

[root@test3 tomcat]# /etc/init.d/memcached start

刷新時(shí)memcache不會變回去

此時(shí)將test2的tomcat服務(wù)宕掉,并刷新:

[root@test2 tomcat]# /usr/local/tomcat/bin/shutdown.sh

訪問結(jié)果為:

此時(shí),memcache仍然為test2

7、總結(jié):

不同的主機(jī)訪問時(shí)會調(diào)度到不同的 tomcat 實(shí)例上處理,來自同一主機(jī)的請求會交給同一個(gè) tomcat 實(shí)例處理,此時(shí)你 down 掉當(dāng)前正在響應(yīng)的 tomcat 實(shí)例,nginx 會自動把用戶的請求調(diào)度到另一個(gè) tomcat 實(shí)例上,同時(shí) session 也沒有丟掉。

原理:當(dāng)test2中tomcat宕機(jī)后,test3接管會話后從本地的memcache處讀取memcache的信息。

?????????? 當(dāng)test2的memcache宕機(jī)后,test3的tomcat中會將會話信息存至本地,以致session不會丟失。

總結(jié)

以上是生活随笔為你收集整理的nginx+tomcat+memcache实现负载均衡、session共享的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

歡迎分享!

轉(zhuǎn)載請說明來源于"生活随笔",并保留原作者的名字。

本文地址:nginx+tomcat+memcache实现负载均衡、se