下文給大家?guī)?lái)如何實(shí)現(xiàn)nginx與tomcat云服務(wù)器集群做負(fù)載均衡的方法詳細(xì)解答。,希望能夠給大家在實(shí)際運(yùn)用中帶來(lái)一定的幫助,負(fù)載均衡涉及的東西比較多,理論也不多,網(wǎng)上有很多書(shū)籍,今天我們就用創(chuàng)新互聯(lián)在行業(yè)內(nèi)累計(jì)的經(jīng)驗(yàn)來(lái)做一個(gè)解答。
成都創(chuàng)新互聯(lián)成立與2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元萍鄉(xiāng)做網(wǎng)站,已為上家服務(wù),為萍鄉(xiāng)各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575
1、在/usr/local/ngnix/conf 創(chuàng)建文件 nginx-tomcat.conf
文件內(nèi)容:
user nobody; worker_processes 2; events { worker_connections 1024; } http{ # upstream 配置一組后端服務(wù)器, # 請(qǐng)求轉(zhuǎn)發(fā)到upstream后,nginx按策略將請(qǐng)求指派出某一服務(wù)器 # 即配置用于負(fù)載均衡的服務(wù)器群信息 upstream tomcats{ fair; server 121.42.41.143:8080; server 219.133.55.36; } server { listen 80; server_name 121.42.41.143; access_log logs/tomcat-nginx.access.log combined; # 反向代理設(shè)置,將所有/路徑下請(qǐng)求發(fā)給本機(jī)上的tomcat location / { #root html; index index.html index.htm; #==========Nginx提供的代理============ proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://tomcats; } } }
2、使用該配置文件啟動(dòng)nginx (啟動(dòng)前先關(guān)閉nginx)
[root@iZ28b4kreuaZ bin]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx-tomcat.conf
View Code
fair策略:根據(jù)各個(gè)服務(wù)器的性能的不同,自動(dòng)選擇使用響應(yīng)能力強(qiáng)的服務(wù)器。該策略是第三方提供的,所以要先安裝。
安裝步驟
1、下載 gnosek-nginx-upstream-fair-a18b409.tar.gz
2、解壓 tar zxvf gnosek-nginx-upstream-fair-a18b409.tar.gz
3、將解壓后的文件移動(dòng)到 /usr/local目錄下并 改名為 nginx-upstream-fair
4、將該模塊添加到我們安裝的nginx中
a、首先進(jìn)入nginx-1.8.1源文件目錄下在執(zhí)行:
[root@iZ28b4kreuaZ nginx-1.8.1]# ./configure --prefix=/usr/local/nginx --add-module=/usr/local/nginx-upstream-fair/
b、執(zhí)行:make 進(jìn)行編譯
c、進(jìn)入 nginx-1.8.1/objs/下將最新的nginx啟動(dòng)項(xiàng) 覆蓋原來(lái)的 /usr/local/nginx/sbin/nginx啟動(dòng)項(xiàng)。
[root@iZ28b4kreuaZ objs]# cp nginx /usr/local/nginx/sbin
d、開(kāi)啟Nginx 看看是可以使用
問(wèn)題:當(dāng)我們的用戶在tomcat1服務(wù)器上登錄后,tomcat1會(huì)保存用戶的登錄信息,但當(dāng)用戶的請(qǐng)求被代理服務(wù)器分配給tomcat2/tomcat3服務(wù)器時(shí),這時(shí)就會(huì)出現(xiàn)tomcat2/tomcat3無(wú)法獲取用戶登錄信息,從而導(dǎo)致用戶需要重新登錄的現(xiàn)象。我們有三種解決方案:
1、同一個(gè)用戶的請(qǐng)求鎖定在同一臺(tái)服務(wù)器上,這樣就不會(huì)存在session在不同服務(wù)器之間共享問(wèn)題。這種方案簡(jiǎn)單,但缺乏容錯(cuò)性(一旦服務(wù)器故障,那用戶的請(qǐng)求將被分配給其他服務(wù)器,這時(shí)就需要重新登錄)
實(shí)現(xiàn)方式:設(shè)置集群策略為 ip_hash ;
upstream tomcats{ ip_hash; }
2、session復(fù)制方式: 當(dāng)任何服務(wù)器中session值發(fā)生改變,他都會(huì)將該改變廣播給其他服務(wù)器,當(dāng)其他服務(wù)器收到廣播后也做相應(yīng)的改變,從而實(shí)現(xiàn)session在所有服務(wù)器中一直。缺點(diǎn) 當(dāng)集群中tomcat服務(wù)器很多時(shí)會(huì)增加網(wǎng)絡(luò)負(fù)荷,性能低下。實(shí)現(xiàn)方式:
a、在tomcat的server.xml中配置session廣播
b、在我們的分布式應(yīng)用的web.xml 中添加
3、通過(guò)創(chuàng)建額外的共享空間用來(lái)管理session,一般我們使用分布式緩存技術(shù)redis、memcached緩存技術(shù),在這里我么使用memcached。
a、memcached的安裝:http://www.cnblogs.com/jalja/p/6121978.html
b、memcached 的 session共享原理
粘性共享:
非粘性:
c、tomcat訪問(wèn)memcached的相關(guān)環(huán)境(我們使用的是tomcat7)
1. 復(fù)制jar包到tomcat/lib目錄,jar分三類
1)spymemcached.jar memcached java客戶端
2)memcached相關(guān)的包 memcached-session-manager-{version}.jar 核心包 memcached-session-manager-tc{tomcat-version}-{version}.jar Tomcat版本相關(guān)的包
3)序列化工具包,有多種可選方案,不設(shè)置時(shí)使用jdk自帶序列化,其它可選kryo,javolution,xstream,flexjson等 msm-{tools}-serializer-{version}.jar 其它序列化工具相關(guān)包 一般第三方序列化工具不需要實(shí)現(xiàn)serializable接口
d、配置Context,加入處理session的Manager MemcachedBackupSessionManager
Context配置查找順序:
1)conf/context.xml 全局配置,作用于所有應(yīng)用
2) conf/[enginename]/[hostname]/context.xml.default 全局配置,作用于指定host下全部應(yīng)用
3) conf/[enginename]/[hostname]/[contextpath].xml 只作用于contextpath指定的應(yīng)用
4) 應(yīng)用META-INF/context.xml 只作用于本應(yīng)用
5) conf/server.xml
如果只希望session管理作用于特定應(yīng)用,最好用3,4方式設(shè)置,希望作用全體,可用1,2,5設(shè)置
conf/context.xml的配置:
View Code
四、集群環(huán)境開(kāi)發(fā)注意事項(xiàng)
1、實(shí)體類要序列化( implements Serializable)
private static final long serialVersionUID = 3349238980725146825L;
2、獲取客戶端請(qǐng)求地址的方式 。在nginx-tomcat.conf中添加如下配置:
server { location / { proxy_set_header X-Real-IP $remote_addr; # 真實(shí)的客戶端IP } }
java代碼:
public static String getIp(HttpServletRequest request){ String remoteIp =request.getRemoteAddr(); String headIp=request.getHeader("X-Real-IP"); return headIp==null?remoteIp:headIp; }
3、動(dòng)靜分離
把靜態(tài)文件放在nginx服務(wù)器中(css、js、圖片)
看了以上關(guān)于如何實(shí)現(xiàn)nginx與tomcat云服務(wù)器集群做負(fù)載均衡的方法詳細(xì)解答。,如果大家還有什么地方需要了解的可以在創(chuàng)新互聯(lián)行業(yè)資訊里查找自己感興趣的或者找我們的專業(yè)技術(shù)工程師解答的,創(chuàng)新互聯(lián)技術(shù)工程師在行業(yè)內(nèi)擁有十幾年的經(jīng)驗(yàn)了。