本文收錄在Linux運維企業架構實戰系列html
今天想起當初研究nginx反向代理負載均衡時,nginx自身的upstream後端配置用着很是不舒服; 當時使用的淘寶基於nginx二次開發的Tengine,今天總結一下。nginx
一、認識Tengine
1.1 介紹
- Tengine是由淘寶網發起的Web服務器項目。它在Nginx的基礎上,針對大訪問量網站的需求,添加了不少高級功能和特性。它的目的是打造一個高效、安全的Web平臺。
- Tengine的性能和穩定性已經在大型的網站如淘寶網,天貓商城等獲得了很好的檢驗。
- 它的最終目標是打造一個高效、穩定、安全、易用的Web平臺。
- 從2011年12月開始,Tengine成爲一個開源項目。
- 如今,它由Tengine團隊開發和維護。Tengine團隊的核心成員來自於淘寶、搜狗等互聯網企業。
1.2 功能
- 繼承Nginx-1.6.2的全部特性,兼容Nginx的配置;
- 動態模塊加載(DSO)支持。加入一個模塊再也不須要從新編譯整個Tengine;
- 支持SO_REUSEPORT選項,建連性能提高爲官方nginx的三倍;
- 支持SPDY v3協議,自動檢測同一端口的SPDY請求和HTTP請求;
- 流式上傳到HTTP後端服務器或FastCGI服務器,大量減小機器的I/O壓力;
- 更增強大的負載均衡能力,包括一致性hash模塊、會話保持模塊,還能夠對後端的服務器進行主動健康檢查,根據服務器狀態自動上線下線,以及動態解析upstream中出現的域名;
- 輸入過濾器機制支持。經過使用這種機制Web應用防火牆的編寫更爲方便;
- 支持設置proxy、memcached、fastcgi、scgi、uwsgi在後端失敗時的重試次數
- 動態腳本語言Lua支持。擴展功能很是高效簡單;
- 支持管道(pipe)和syslog(本地和遠端)形式的日誌以及日誌抽樣;
- 支持按指定關鍵字(域名,url等)收集Tengine運行狀態;
- 組合多個CSS、JavaScript文件的訪問請求變成一個請求;
- 自動去除空白字符和註釋從而減少頁面的體積
- 自動根據CPU數目設置進程個數和綁定CPU親緣性;
- 監控系統的負載和資源佔用從而對系統進行保護;
- 顯示對運維人員更友好的出錯信息,便於定位出錯機器;
- 更強大的防攻擊(訪問速度限制)模塊;
- 更方便的命令行參數,如列出編譯的模塊列表、支持的指令等;
- 能夠根據訪問文件類型設置過時時間;
二、編譯安裝tengine
2.1 下載指定版本
官網:http://tengine.taobao.org/download.htmlc++
1
2
|
[root@along app]
# wget http://tengine.taobao.org/download/tengine-2.2.3.tar.gz
[root@along app]
# tar -xvf tengine-2.2.3.tar.gz
|
2.2 建立用戶,下載依賴的安裝包
1
2
3
|
[root@along app]
# groupadd nginx
[root@along app]
# useradd -s /sbin/nologin -g nginx -M nginx
[root@along app]
# yum -y install gc gcc gcc-c++ pcre-devel zlib-devel openssl-devel
|
2.3 編譯安裝
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@along app]
# cd tengine-2.2.3/
[root@along tengine]
# ./configure --user=nginx --group=nginx --prefix=/app/tengine --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module
[root@along tengine]
# make && make install
[root@along tengine]
# chown -R nginx.nginx /app/tengine
[root@along tengine]
# ll /app/tengine
total 8
drwxr-xr-x 2 nginx nginx 4096 Feb 20 14:55 conf
drwxr-xr-x 2 nginx nginx 40 Feb 20 14:50 html
drwxr-xr-x 2 nginx nginx 4096 Feb 20 14:50 include
drwxr-xr-x 2 nginx nginx 6 Feb 20 14:50 logs
drwxr-xr-x 2 nginx nginx 6 Feb 20 14:50 modules
drwxr-xr-x 2 nginx nginx 35 Feb 20 14:50 sbin
|
注:web
- #指定運行權限的用戶 --user=nginx
- #指定運行的權限用戶組 --group=nginx
- #指定安裝路徑 --prefix=/usr/local/nginx
- #支持nginx狀態查詢 --with-http_stub_status_module
- #開啓ssl支持 --with-http_ssl_module
- #開啓GZIP功能 --with-http_gzip_static_module
三、開啓服務
3.1 配置開機啓動腳本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[root@along nginx]
# vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http:
//nginx
.org
/en/docs/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=
/app/tengine/logs/nginx
.pid
ExecStartPre=
/app/tengine/sbin/nginx
-t -c
/app/tengine/conf/nginx
.conf
ExecStart=
/app/tengine/sbin/nginx
-c
/app/tengine/conf/nginx
.conf
ExecReload=
/bin/kill
-s HUP $MAINPID
ExecStop=
/bin/kill
-s QUIT $MAINPID
PrivateTmp=
true
[Install]
WantedBy=multi-user.target
|
3.2 啓動服務
1
2
3
|
[root@along ~]
# systemctl start nginx
[root@along ~]
# ss -nutlp |grep 80
tcp LISTEN 0 128 *:80 *:*
users
:((
"nginx"
,pid=4933,fd=6),(
"nginx"
,pid=4932,fd=6))
|
網頁訪問驗證算法
四、使用tengine的負載均衡功能
由於tengine的其餘功能和nginx配置差很少,就不在演示了;主要演示,我認爲較爲方便的反向代理配置。vim
4.1 配置反向代理
tengine配置反向代理格式和haproxy很類似;後端
後端兩臺服務器事先本身準備好網頁服務(nginx/httpd等均可以)緩存
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
[root@along tengine]
# cd /app/tengine/conf/
[root@along conf]
# vim nginx.conf
http {
... ...
#配置後端代理集羣,默認是輪詢算法
upstream srv {
server 192.168.10.101:80;
server 192.168.10.106:80;
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端location反向代理
server {
location / {
proxy_pass http:
//srv
;
}
}
... ...
}
|
4.2 重啓服務器,驗證
(1)驗證配置是否有誤安全
1
2
3
|
[root@along tengine]
# ./sbin/nginx -t
nginx: the configuration
file
/app/tengine/conf/nginx
.conf syntax is ok
nginx: configuration
file
/app/tengine/conf/nginx
.conf
test
is successful
|
(2)重啓服務器bash
1
|
[root@along tengine]
# systemctl restart nginx
|
(3)網頁訪問驗證
由於默認是輪詢算法,因此刷新頁面,就會輪詢調度到後臺2個網頁服務器
五、nginx upstream模塊調度算法詳解
5.1 輪詢
輪詢是upstream的默認分配方式,即每一個請求按照時間順序輪流分配到不一樣的後端服務器,若是某個後端服務器down掉後,能自動剔除。
1
2
3
4
|
upstream srv {
server 192.168.10.101:80;
server 192.168.10.106:80;
}
|
5.2 weight加權輪詢
加權輪詢,輪詢的增強版,便可以指定輪詢比率,weight和訪問概率成正比,主要應用於後端服務器異質的場景下。
1
2
3
4
|
upstream srv {
server 192.168.10.101:80 weight=1;
server 192.168.10.106:80 weight=2;
}
|
5.3 ip_hash
每一個請求按照訪問ip(即Nginx的前置服務器或者客戶端IP)的hash結果分配,這樣每一個訪客會固定訪問一個後端服務器,能夠解決session一致問題。
1
2
3
4
5
|
upstream srv {
ip_hash;
server 192.168.10.101:80;
server 192.168.10.106:80;
}
|
注意:
- 當負載調度算法爲ip_hash時,後端服務器在負載均衡調度中的狀態不能是weight和backup。
- 致使負載不均衡。
5.4 fair
fair顧名思義,公平地按照後端服務器的響應時間(rt)來分配請求,響應時間短即rt小的後端服務器優先分配請求。若是須要使用這種調度算法,必須下載Nginx的upstr_fair模塊。
1
2
3
4
5
|
upstream srv {
fair;
server 192.168.10.101:80;
server 192.168.10.106:80;
}
|
5.5 url_hash(目前用consistent_hash替代url_hash)
與ip_hash相似,可是按照訪問url的hash結果來分配請求,使得每一個url定向到同一個後端服務器,主要應用於後端服務器爲緩存時的場景下。
1
2
3
4
5
6
|
upstream srv {
server 192.168.10.101:80;
server 192.168.10.106:80;
hash
$request_uri;
hash_method crc32;
}
|
- 其中,hash_method爲使用的hash算法,須要注意的是:此時,server語句中不能加weight等參數。
- 提示:url_hash用途cache服務業務,memcached,squid,varnish。特色:每一個rs都是不一樣的。
- 按訪問url的hash結果來分配請求,讓每一個url定向到同一個後端服務器,後端服務器爲緩存服務器時效果顯著。在upstream中加入hash語句, server語句中不能寫入weight等其餘的參數,hash_ method是使用的hash算法。。
- url_ hash.按訪問ur1的hash結果來分配請求,使每一個url定向到同-一個後端服務器,能夠進一步提升後端緩存服務器的效率命中率。Nginx 自己是不支持ur1_ hash的,若是須要使用這種調度算法,必須安裝Nginx的hash軟件包。
六、upstream段用法介紹
(1)參數說明
- server:關鍵字,必選。
- address:主機名、域名、ip或unix socket,也能夠指定端口號,必選。
- parameters:可選參數,可選參數以下:
- down:表示當前的server暫時不參與負載均衡。
- backup:預留的備份機器。當其餘全部的非backup機器出現故障或者忙的時候,纔會請求backup機器,所以這臺機器的壓力最輕。
- weight:默認爲1.weight越大,負載的權重就越大。
- max_fails:容許請求失敗的次數,默認爲1。當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤。
- fail_timeout:在經歷了max_fails次失敗後,暫停服務的時間。max_fails能夠和fail_timeout一塊兒使用。
- max_fails和fail_timeout通常會關聯使用:若是某臺server在fail_timeout時間內出現了max_fails次鏈接失敗,那麼Nginx會認爲其已經掛掉了,從而在fail_timeout時間內再也不去請求它,fail_timeout默認是10s,max_fails默認是1,即默認狀況是隻要發生錯誤就認爲服務器掛掉了,若是將max_fails設置爲0,則表示取消這項檢查。
(2)舉例說明以下:
1
2
3
4
5
|
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:
/tmp/backend3
;
}
|