Nginx+tomcat 做負(fù)載均衡 http://blog.chinaunix.net/u2/83793/showart_1354266.html 架構(gòu)描述 前端一臺(tái)nginx服務(wù)器做負(fù)載均衡器,后端放N臺(tái)tomcat組成集群處理服務(wù),通過nginx轉(zhuǎn)發(fā)到后面(注:沒做動(dòng)靜分離,靜態(tài)動(dòng)態(tài)全部都轉(zhuǎn)給tomcat) 優(yōu)點(diǎn):實(shí)現(xiàn)了可彈性化的架構(gòu),在壓力增大的時(shí)候可以臨時(shí)添加tomcat服務(wù)器添加到這個(gè)架構(gòu)里面去 一,配置nginx 1, 下載包 Wget http://sysoev.ru/nginx/nginx-0.6.32.tar.gz ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 2, 安裝nginx包 a.安裝pcre tar zxvf pcre-7.2.tar.gz cd pcre ./configure --prefix= /pcre Make;makeinstall b,安裝nginx tar zxvfnginx-0.6.32.tar.gz cd nginx-0.6.32 ./configure --prefix=/nginx–with-pcre=/pcre --with-http_rewrite_module Make;make install 3, 修改配置文件 Vi /nginx/conf/nginx.conf #用戶組 user nobody nobody; #cpu個(gè)數(shù),可以按照實(shí)際服務(wù)器來(lái)計(jì)算 worker_processes 8; worker_rlimit_nofile 51200; events { use epoll; #連接數(shù) worker_connections 8192 ; } http { include mime.types; default_type application/octet-stream; server_names_hash_bucket_size128; # access_log off; # access_log logs/access.log; #緩存的時(shí)間,(可以根據(jù)不同文件設(shè)置不同時(shí)間) # expires 2h; tcp_nodelay on; keepalive_timeout 30; gzip on; gzip_min_length 10; gzip_buffers 48k; gzip_http_version 1.1; gzip_types text/plainapplication/x-javascript text/css text/html application/xml; sendfile on; tcp_nopush on; reset_timedout_connection on; client_max_body_size 30m; #設(shè)定負(fù)載均衡列表 upstream backend { server 172.23.254.2:8080; server 172.23.254.3:8080; } #設(shè)定虛擬主機(jī) server { listen 80; server_name www.abc.com; #對(duì) / 所有做負(fù)載均衡 (本機(jī)nginx采用完全轉(zhuǎn)發(fā),所有請(qǐng)求都轉(zhuǎn)發(fā)到后端的tomcat集群) location / { root /web/www ; index index.jsp index.htmindex.html; proxy_redirect off; #保留用戶真實(shí)信息 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://backend; } } } 主要在配置proxy與upstream Upstream具有負(fù)載均衡能力,可以自動(dòng)判斷下面的機(jī)器,并且自動(dòng)踢出不能正常提供服務(wù)的機(jī)器。 4,啟動(dòng)程序 /nginx/sbin/nginx 5,編寫啟動(dòng)腳本 Vi nginx.sh #!/bin/sh CWD=`pwd` 二,配置tomcat 1, 下載tomcat5.59 tar zxvf tomcat5.59 2,修改配置文件 a,配置數(shù)據(jù)源 b,優(yōu)化tomcat最大并發(fā)數(shù) <Connectorport="8080" maxHttpHeaderSize="8192" maxThreads="2048"minSpareThreads="100" maxSpareThreads="200" enableLookups="false"redirectPort="8443" acceptCount="500" connectionTimeout="20000"disableUploadTimeout="true" /> c,添加虛擬主機(jī) (注,主轉(zhuǎn)發(fā)的虛擬主機(jī)必須用localhost,否則nginx不能通過內(nèi)網(wǎng)ip轉(zhuǎn)發(fā),而只有通過域名轉(zhuǎn)發(fā) d,測(cè)試 打開http://ip:8080 頁(yè)面能訪問則正常 2, 其他的tomcat服務(wù)器也用同樣的配置 三,做tomcat集群 兩臺(tái)機(jī)器 172.23.254.2 172.23.254.3 做集群需要修改的文件配置有三個(gè)地方 1,修改conf/server.xml配置文件 b.找到Cluster標(biāo)簽,去掉注釋,同時(shí)修改tcpListenAddress為本機(jī)ip172.23.254.2 (注:這一段Cluster必須放在hosts里面) 2, 修改應(yīng)用的web.xml 修改web應(yīng)用里面WEB-INF目錄下的web.xml文件,加入標(biāo)簽 <distributable/> 直接加在</web-app>之前就可以了 這個(gè)是加入tomcat的session復(fù)制的,做tomcat集群必須需要這一步,否則用戶的session就無(wú)法正常使用。 3, 開啟防火墻 這兩個(gè)tomcat之間必須開啟防火墻信任。 分別啟動(dòng)兩個(gè)tomcat,查看每一個(gè)tomcat是否都啟動(dòng)了8080端口以及4001端口 再用netstat –an 查看鏈接情況 tcp 0 0172.23.254.2:43320 172.23.254.3:4001 ESTABLISHED tcp 0 0172.23.254.2:46544 172.23.254.3:4001 TIME_WAIT tcp 0 0172.23.254.2:40118 172.23.254.3:4001 ESTABLISHED tcp 0 0172.23.254.2:4001 172.23.254.3:48804 ESTABLISHED tcp 0 0172.23.254.2:4001 172.23.254.3:34254 ESTABLISHED 如果兩臺(tái)機(jī)器的4001端口分別建立了連接,則說明集群配置成功,可以進(jìn)行session復(fù)制。 可能存在的問題 1, session復(fù)制問題 以前用apache做負(fù)載均衡的時(shí)候,是選擇了用 session sticky的模式,這樣的話,用戶每次進(jìn)來(lái)都會(huì)是同一個(gè)服務(wù)器中的session,不會(huì)被轉(zhuǎn)發(fā)到其他的服務(wù)器上。在這樣的情況下,tomcat即使不做session復(fù)制也不會(huì)影響用戶訪問。但是nginx并不支持sticky功能。所以必須要做session復(fù)制。否則很多地方就根本沒法用。比如登錄過程,先等到了第一個(gè)tomcat上,產(chǎn)生了一個(gè)session,在刷新頁(yè)面,刷到另外一個(gè)tomcat的機(jī)器上,沒有這個(gè)session,就會(huì)出現(xiàn)問題了。所以程序員在寫jsp的時(shí)候也要注意這一點(diǎn) 舉個(gè)簡(jiǎn)單的例子,比如我們?cè)趩螜C(jī)應(yīng)用情況下修改SESSION中用戶的某一個(gè)數(shù)據(jù),那么通常就是:
case $1in
start)
/nginx/sbin/nginx;
;;
stop)
kill -2 `ps -ef|grep "/nginx/sbin/nginx"|grep -v "grep"|awk '{print$2}' `
;;
restart)
cd "$CMD"
$0 stop
$0 start
;;
*)
echo $"Usage: $0{start|stop|restart}"
exit 1
esac
exit 0
a. 找到Engine標(biāo)簽,加入屬性 jvmRoute="worker1"
User user =(User)request.getSession().getAttribute(“user”);
User.setName(“my name”);
這樣我們就是直接存取出來(lái),然后進(jìn)行修改,雖然在單機(jī)情況下沒有問題,但是在集群條件下,這樣就導(dǎo)致了多臺(tái)WEB服務(wù)器上的SESSION不同步的問題,因?yàn)?span lang="EN-US">SESSION并沒有改變,Tomcat無(wú)法監(jiān)視session中某個(gè)數(shù)據(jù)的值是否發(fā)生了變化。因此,我們還需要執(zhí)行如下操作以保證SESSION的同步:
Request.getSession().setAttribute(“user”, user);
所以,我們?cè)诓僮?span lang="EN-US">SESSION的時(shí)候要特別注意!另外的建議就是,我們應(yīng)該盡可能的不要修改SESSION中的數(shù)據(jù)。
可能經(jīng)常會(huì)遇到session復(fù)制不正常的情況。除了在服務(wù)端找原因再也程序上找下原因。都是有可能導(dǎo)致session復(fù)制不正常的
2.頁(yè)面同步
為確保后面tomcat的服務(wù)器上的頁(yè)面程序是一致的,可以采用如下方式
a,rsync同步,或者做成頁(yè)面按鈕,提供給編輯,修改了程序即使點(diǎn)擊同步
b,共享區(qū)域存儲(chǔ),或者采取drbd網(wǎng)絡(luò)raid模式
3,確認(rèn)nginx可以轉(zhuǎn)發(fā)成功,
在nginx上wget一下后面轉(zhuǎn)發(fā)的url(包過端口),如果可以打開,那就可以轉(zhuǎn)發(fā)過去。如果不能打開,則無(wú)法轉(zhuǎn)發(fā)
聯(lián)系客服