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

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
