鄙人最近在研究Nginx的負載均衡宝泵,遇到不少坑粗恢,最后成功完成負載均衡梆造,在這里分享下:
簡述:
現(xiàn)有設備:
VMWARE配了3臺服務器
server6:192.168.0.106
server7:192.168.0.105
server9:192.168.0.103
目標:server6,server7安裝Tomcat服務器洛心,server9安裝tengine負載server6固耘,server7兩臺服務器。
1.下載
2.安裝
2.1解壓縮
2.2編譯安裝
cd /usr/local
tar zxvf tengine-2.2.0.tar.gz
cd tengine-2.2.0
./configure --prefix=/usr/local/tengine
(運行時可能會報./configure: error: the HTTP rewrite module requires the PCRE library.的錯誤词身,可執(zhí)行下面兩條語句:
yum?-y?install?pcre-devel
yum ?-y?install?openssl?openssl-devel
再./configure --prefix=/usr/local/tengine
)
make && make install
至此安裝完成厅目。
2.3開啟服務
修改/etc/init.d/nginx文件
vi /etc/init.d/nginx
修改內(nèi)容:
nginx="/usr/local/tengine/sbin/nginx"
NGINX_CONF_FILE="/usr/local/tengine/conf/nginx.conf"
2.4啟動服務
修改可執(zhí)行權(quán)限
chmod 777 nginx
service nginx start
重啟命令:service nginx reload
(注意nginx大小寫,之前用Nginx一直啟動不了,后來才發(fā)現(xiàn)2了损敷。如果啟動不成功葫笼,有可能是防火墻問題,關閉防火墻:service iptables stop)
3.使用
虛擬主機&虛擬目錄
回到自己window系統(tǒng)拗馒,修改hosts
進入:C:\Windows\System32\drivers\etc
修改hosts路星,在最后添加:
192.168.0.103test.qq.com
注:192.168.0.103是就是我們剛剛配Nginx的server9的地址,test.qq.com是入口網(wǎng)址
然后在瀏覽器輸入:
test.qq.com
=>
恭喜诱桂,你的Nginx服務器配置成功洋丐!
負載均衡
現(xiàn)在我們將兩臺服務器server6,server7負載到server9上
1.修改配置
vi /usr/local/apache-tomcat-7.0.61/conf/nginx.conf:
upstream tomcat {
server 192.168.0.106:8080;
server 192.168.0.105:8080;
check interval=3000 rise=2 fall=5 timeout=1000 type=http;
check_http_send "HEAD / HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
server {
server_name test.qq.com;
location / { proxy_passhttp://tomcat; }
location /status { check_status; }
}
說明:添加upstream 命名為tomcat挥等,里面有兩個sever月劈,就是我們的server6崔梗,server7.
在下面server里的location /中括號里的內(nèi)容我們改為proxy_passhttp://tomcat;意思就是將那兩臺服務器放到這臺服務器上砰碴。
OK兽埃,此時我們reload一下Nginx服務器:
service nginx reload
2.啟動tomcat
將Tomcat分別放在server6,server7服務器上涡相,修改webapps/ROOT/index.jsp
server6里的index.jsp:
server6
<%=session.getId()%>
server7里的index.jsp:
server7
<%=session.getId()%>
ok,到../bin里啟動一下Tomcat
再刷一下剛才的頁面test.qq.com:
OK哲泊,此時我們看到server6,server7來回切換,證明Nginx集群成功催蝗。
但可以看到sessionID是經(jīng)常變的切威,此時我們要做共享session操作。
共享session
第一:
Memcached
1丙号、安裝libevent
2先朦、安裝memcached
可以用yum方式安裝
yum -y install –enablerepo=rpmforge memcached php-pecl-memcache
3、啟動memcached
memcached -d -m 128 -u root -l 192.168.0.103?-p 11211 -c 256 -P /tmp/memcached.pid
參數(shù)解釋:
-d:后臺啟動服務
-m:緩存大小
-p:端口
-l:IP
-P:服務器啟動后的系統(tǒng)進程ID犬缨,存儲的文件
-u:服務器啟動是以哪個用戶名作為管理用戶
驗證
memcached安裝成功與否:
memcached-tool 192.168.0.103:11211
cat /tmp/memcached.pid
第二配置tomcat
Tomcat配置
拷貝jar
到tomcat的lib下喳魏,
每個tomcat里面的context.xml中加入
memcachedNodes="n1:192.168.0.103:11211"
sticky="false"
lockingMode="auto"
sessionBackupAsync="false"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
sessionBackupTimeout="1000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
說明:讓memcache的節(jié)點memcachedNodes指向server9的地址:192.168.0.103
OK。重啟server6server7兩臺服務器怀薛。
回到瀏覽器刺彩,輸入
test.qq.com:
我們可以看到,無論服務器輪流切換枝恋,sessionID都保持不變创倔,這樣就做到了真正的負載均衡?。
調(diào)優(yōu)點:
一:鏈接數(shù)問題:
配置文件:
nginx.conf:
cd /usr/local/tengine-2.2.0/conf
vi nginx.conf
1.worker_connections? :連接數(shù)焚碌;
2.worker_processes:cpu核心數(shù)畦攘;
3.Nginx最大連接數(shù) = 連接數(shù)(worker_connections)*cpu核心數(shù)(worker_processes);
4.Linux對外連接數(shù):
cat /proc/sys/fs/file-max
97095
Nginx最大的并發(fā)量是5萬到10萬
當Linux對外連接數(shù) > Nginx最大連接數(shù) :
Nginx這臺服務器的性能沒有完全發(fā)揮
當Linux對外連接數(shù) < Nginx最大連接數(shù) :
Nginx最大連接數(shù)沒有意義十电,對外連接數(shù)不會超過Linux服務器對外最大連接數(shù)
二:sendfile on:
如果sendfile? off掉知押,就進入傳統(tǒng)模式:
用戶有個請求過來了叹螟,網(wǎng)卡接到請求了,內(nèi)核也接響應朗徊,發(fā)現(xiàn)接聽端口是被Nginx占用的首妖,然后把請求發(fā)到Nginx上,Nginx開始讀取磁盤文件爷恳,磁盤文件緩存到Nginx內(nèi)存中的,再從內(nèi)存文件推送到內(nèi)核象踊,內(nèi)核再將文件推到網(wǎng)卡温亲,網(wǎng)卡再發(fā)送到我們客戶端。
如果sendfile打開杯矩,就進入0拷貝模式:
內(nèi)核直接把文件讀到內(nèi)存中栈虚,通過網(wǎng)卡推到客戶端,不過Nginx史隆。
開啟0拷貝是好還是不好魂务?
對于一些小文件,少于1500K的文件泌射,瞬間存儲粘姜,不經(jīng)過Nginx,
大于300M熔酷,直接推給客戶孤紧,客戶端承受不住,
1拒秘,例如日志文件号显,300M的文件推給客戶,還沒消化完躺酒,馬上又有一個日志文件推出去押蚤,客戶端承受不了。
2羹应,網(wǎng)絡扛不住揽碘。
三:輪詢機制:
upstream按照輪詢(默認)方式進行負載,每個請求按時間順序逐一分配到不同的后端服務器量愧,如果后端服務器down掉钾菊,能 自動剔除。雖然這種方式簡便偎肃、成本低廉煞烫。但缺點是:可靠性低和負載分配不均衡。適用于圖片服務器集群和純靜態(tài)頁面服務器集群累颂。
除此之外滞详,upstream還有其它的分配策略凛俱,分別如下:
1.weight(權(quán)重)
指定輪詢幾率,weight和訪問比率成正比料饥,用于后端服務器性能不均的情況蒲犬。如下所示,10.0.0.88的訪問比率要比10.0.0.77的訪問比率高一倍岸啡。
upstream linuxidc{
server 10.0.0.77 weight=5;
server 10.0.0.88 weight=10;
}
2.ip_hash(訪問ip)
每個請求按訪問ip的hash結(jié)果分配原叮,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題巡蘸。
upstream favresin{
ip_hash;
server 10.0.0.10:8080;
server 10.0.0.11:8080;
}
3.fair(第三方)
按后端服務器的響應時間來分配請求奋隶,響應時間短的優(yōu)先分配。與weight分配策略類似悦荒。
upstream favresin{
server 10.0.0.10:8080;
server 10.0.0.11:8080;
fair;
}
4.url_hash(第三方)
按訪問url的hash結(jié)果來分配請求唯欣,使每個url定向到同一個后端服務器,后端服務器為緩存時比較有效搬味。
注意:在upstream中加入hash語句境氢,server語句中不能寫入weight等其他的參數(shù),hash_method是使用的hash算法碰纬。
upstream resinserver{
server 10.0.0.10:7777;
server 10.0.0.11:8888;
hash $request_uri;
hash_method crc32;
}
upstream還可以為每個設備設置狀態(tài)值萍聊,這些狀態(tài)值的含義分別如下:
down 表示單前的server暫時不參與負載.
weight 默認為1.weight越大,負載的權(quán)重就越大嘀趟。
max_fails :允許請求失敗的次數(shù)默認為1.當超過最大次數(shù)時脐区,返回proxy_next_upstream 模塊定義的錯誤.
fail_timeout : max_fails次失敗后,暫停的時間她按。
backup: 其它所有的非backup機器down或者忙的時候牛隅,請求backup機器。所以這臺機器壓力會最輕酌泰。
upstream bakend{ #定義負載均衡設備的Ip及設備狀態(tài)
ip_hash;
server 10.0.0.11:9090 down;
server 10.0.0.11:8080 weight=2;
server 10.0.0.11:6060;
server 10.0.0.11:7070 backup;
}
題外:
健康檢查:
在/usr/local/apache-tomcat-7.0.61/conf/nginx.conf文件里添加
location /status {
check_status;
}
service nginx reload 一下
瀏覽器輸入:test.qq.com/status
頁面就會檢測兩臺服務器的運作情況媒佣。
Thanks For Watching~