一、簡(jiǎn)單需求
- 1.使用nginx對(duì)請(qǐng)求進(jìn)行負(fù)載。負(fù)載分配到自身服務(wù)器和另外一臺(tái)服務(wù)器。
二、知識(shí)普及
- 1、nginx的負(fù)載模塊及說(shuō)明
來(lái)自官網(wǎng):
nginx upstream 反向代理功能 - 示例
http {
upstream backend {
server 192.168.1.111 weight=1 max_fails=5 fail_timeout=3;
sever 192.168.1.44:88 weight=3 max_fails=5 fail_timeout=3;
server 192.168.1.44 backup;
server unix:/tmp/backend3;
}
server {
location / {
proxy_pass http://backend;
}
}
}
- 2、upstream 支持的負(fù)載均衡算法
輪詢(xún)(默認(rèn))。每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器,如果后端某臺(tái)服務(wù)器宕機(jī),故障系統(tǒng)被自動(dòng)剔除,使用戶(hù)訪問(wèn)不受影響。Weight 指定輪詢(xún)權(quán)值,Weight值越大,分配到的訪問(wèn)機(jī)率越高,主要用于后端每個(gè)服務(wù)器性能不均的情況下。
ip_hash。每個(gè)請(qǐng)求按訪問(wèn)IP的hash結(jié)果分配,這樣來(lái)自同一個(gè)IP的訪客固定訪問(wèn)一個(gè)后端服務(wù)器,有效解決了動(dòng)態(tài)網(wǎng)頁(yè)存在的session共享問(wèn)題。
fair。這是比上面兩個(gè)更加智能的負(fù)載均衡算法。此種算法可以依據(jù)頁(yè)面大小和加載時(shí)間長(zhǎng)短智能地進(jìn)行負(fù)載均衡,也就是根據(jù)后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。Nginx本身是不支持fair的,如果需要使用這種調(diào)度算法,必須下載Nginx的upstream_fair模塊。
url_hash。此方法按訪問(wèn)url的hash結(jié)果來(lái)分配請(qǐng)求,使每個(gè)url定向到同一個(gè)后端服務(wù)器,可以進(jìn)一步提高后端緩存服務(wù)器的效率。Nginx本身是不支持url_hash的,如果需要使用這種調(diào)度算法,必須安裝Nginx 的hash軟件包。
- 3.upstream 支持的狀態(tài)參數(shù)
在HTTP Upstream模塊中,可以通過(guò)server指令指定后端服務(wù)器的IP地址和端口,同時(shí)還可以設(shè)定每個(gè)后端服務(wù)器在負(fù)載均衡調(diào)度中的狀態(tài)。常用的狀態(tài)有:
down,表示當(dāng)前的server暫時(shí)不參與負(fù)載均衡。
backup,預(yù)留的備份機(jī)器。當(dāng)其他所有的非backup機(jī)器出現(xiàn)故障或者忙的時(shí)候,才會(huì)請(qǐng)求backup機(jī)器,因此這臺(tái)機(jī)器的壓力最輕。
max_fails,允許請(qǐng)求失敗的次數(shù),默認(rèn)為1。當(dāng)超過(guò)最大次數(shù)時(shí),返回proxy_next_upstream 模塊定義的錯(cuò)誤。
fail_timeout,在經(jīng)歷了max_fails次失敗后,暫停服務(wù)的時(shí)間。max_fails可以和fail_timeout一起使用。
注,當(dāng)負(fù)載調(diào)度算法為ip_hash時(shí),后端服務(wù)器在負(fù)載均衡調(diào)度中的狀態(tài)不能是weight和backup。
注意事項(xiàng):
1、upstream 配置時(shí)要放置在nginx的http區(qū)域內(nèi)
2、后端接收訪問(wèn)的real server 同樣用nginx解析的話(huà),需要設(shè)定日志格式;
并且在nginx配置時(shí),增加 proxy_set_header X-Real-IP $remote_addr;
3、
三、部署環(huán)境及說(shuō)明
3.1 192.168.1.44 作為調(diào)度器,web主服務(wù)器,810端口作為backup;緩存服務(wù)器
3.2 192.168.1.111 作為web服務(wù)器,img服務(wù)器、rabbitmq服務(wù)器和redis服務(wù)器;
3.3 網(wǎng)站的分布式已經(jīng)解決,session共享用redis解決掉了,因此我這里使用輪詢(xún) weight模式來(lái)做;
四、部署shell
- 晚上繼續(xù)修改
#!/bin/bash
#!/bin/bash
##################################
#Nginx 安裝腳本與負(fù)載設(shè)定upstream
#Make by :Magic
#TIME:2015-10
#Mail:308522800@qq.com
#使用方法 bash CheckNX.sh
###############################
splits="------------------------------------"
function confnginx ()
{
sed -i '/http {/r 1.txt'
}
function instanginx ()
{
yum install nginx -y
}
function userage ()
{
echo -e "userage\n:$0\n"
echo -e "請(qǐng)輸入y,n,其他輸入無(wú)效"
exit
}
echo -e "系統(tǒng)開(kāi)始檢測(cè)請(qǐng)等待... "
##check1返回不為0
nginx_check1=`ps -ef |grep nginx|grep -v "grep " |wc -l`
#echo "進(jìn)程檢測(cè):$nginx_check1"
##check2返回不等于1,nginx存在
nginx_check2=`whatis nginx |grep "nothing appropriate" |wc -l`
#echo "版本檢測(cè):$nginx_check2"
#check3返回不等于1 ,nginx 存在
nginx_check3=`rpm -ql nginx |grep "is not installed" |wc -l`
#echo "Rpm包檢測(cè):$nginx_check3"
if [ $nginx_check1 -ne 0 ] || [ $nginx_check2 -ne 1 ] || [ $nginx_check3 -ne 1 ];then
echo "Nginx process existence "
echo -e "系統(tǒng)即將開(kāi)始配置,請(qǐng)確認(rèn)操作。建議最后在操作前備份自己的nginx.conf文件"
read comit
case "$comit" in
y)
echo "Config the nginx.conf"
confnginx
;;
n)
echo "程序準(zhǔn)備好了要退出??!"
break
;;
*)
userage
;;
esac
#獲取用戶(hù)確認(rèn)存在,開(kāi)始執(zhí)行nginx 配置
else
echo "Nginx is not existence !."
fi
upstream qa.test.com {
server 192.168.1.111 weight=2;
server 192.168.1.210 weight=1 max_fails=5 fail_timeout=3;
server 192.168.1.21:810 backup;
}
server {
listen 811;
server_name qa.test.com;
location / {
proxy_pass http://qa.test.com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
五、參考網(wǎng)址
- tengine
- nginx
http://nginx.org/en/docs/
http://nginx.org/en/docs/http/ngx_http_upstream_module.html
http://shouce.jb51.net/nginx/left.html *