代理服务器Tengine的研究与测试
代理服務器Tengine的研究與測試
一、Tengine介紹
1.首先要知道什么Nginx
1)Nginx(發音同 engine x)是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,并在一個BSD-like 協議下發行。由俄羅斯的程序設計師Igor Sysoev所開發,最初供俄國大型的入口網站及搜尋引擎Rambler(俄文:Рамблер)使用。 其特點是占有內存少,并發能力強,事實上nginx的并發能力確實在同類型的網頁伺服器中表現較好.目前中國大陸使用nginx網站用戶有:新浪、網易、 騰訊,另外知名的微網志Plurk也使用nginx
2.Nginx優點
1)Nginx 可以在大多數 Unix like OS 上編譯運行,并有 Windows 移植版。 Nginx 的1.2.6穩定版已經于2012年12月11日發布,[1]1.3.10開發版已經于2012年12月25日發布,如果新建站點,建議使用最新穩定版作為生產版本,已有站點升級急迫性不高。Nginx 的源代碼使用 2-clause BSD-like license
2)Nginx 是一個很強大的高性能Web和反向代理服務器,它具有很多非常優越的特性:在高連接并發的情況下,Nginx是Apache服務器不錯的替代品:Nginx在美國是做虛擬主機生意的老板們經常選擇的軟件平臺之一。能夠支持高達 50,000 個并發連接數的響應,感謝Nginx為我們選擇了 epoll and kqueue作為開發模型
3)Nginx作為負載均衡服務器:Nginx 既可以在內部直接支持 Rails 和 PHP 程序對外進行服務,也可以支持作為 HTTP代理服務器對外進行服務。Nginx采用C進行編寫,不論是系統資源開銷還是CPU使用效率都比 Perlbal 要好很多。
作為郵件代理服務器:Nginx 同時也是一個非常優秀的郵件代理服務器
4) Nginx 是一個安裝非常的簡單,配置文件非常簡潔(還能夠支持perl語法),Bugs非常少的服務器:Nginx 啟動特別容易,并且幾乎可以做到7*24不間斷運行,即使運行數個月也不需要重新啟動。你還能夠不間斷服務的情況下進行軟件版本的升級
3.Tengine是在Nginx基礎上二次開發而來
1)Tengine的性能和穩定性已經在大型的網站如淘寶網,天貓商城等得到了很好的檢驗。它的最終目標是打造一個高效、穩定、安全、易用的Web平臺。從2011年12月開始,Tengine成為一個開源項目。現在,它由Tengine團隊開發和維護。Tengine團隊的核心成員來自于淘寶、搜狗等互聯網企業。
二、Tengine的功能
1.繼承Nginx-1.2.3 的所有特性,100%兼容Nginx的配置;
2.動態模塊加載(DSO)支持。加入一個模塊不再需要重新編譯整個Tengine;
3.輸入過濾器機制支持。通過使用這種機制Web應用防火墻的編寫更為方便;
4.動態腳本語言Lua支持。擴展功能非常高效簡單;
5.支持管道(pipe)和syslog(本地和遠端)形式的日志以及日志抽樣;
6.組合多個CSS、JavaScript文件的訪問請求變成一個請求;
7.可以對后端的服務器進行主動健康檢查,根據服務器狀態自動上線下線;
8.自動根據CPU數目設置進程個數和綁定CPU親緣性;
9.監控系統的負載和資源占用從而對系統進行保護;
10.顯示對運維人員更友好的出錯信息,便于定位出錯機器;
11.更強大的防***(訪問速度限制)模塊;
12.更方便的命令行參數,如列出編譯的模塊列表、支持的指令等;
13.可以根據訪問文件類型設置過期時間;
三、Tengine-2.1.0主要特性
1.繼承Nginx-1.6.2的所有特性,兼容Nginx的配置;
2.動態模塊加載(DSO)支持。加入一個模塊不再需要重新編譯整個Tengine;
3.支持SO_REUSEPORT選項,建連性能提升為官方nginx的三倍;
4.支持SPDY v3協議,自動檢測同一端口的SPDY請求和HTTP請求;
5.流式上傳到HTTP后端服務器或FastCGI服務器,大量減少機器的I/O壓力;
6.更加強大的負載均衡能力,包括一致性hash模塊、會話保持模塊,還可以對后端的服務器進行主動健康檢查,根據服務器狀態自動上線下線,以及動態解析upstream中出現的域名;
7.輸入過濾器機制支持。通過使用這種機制Web應用防火墻的編寫更為方便;
8.支持設置proxy、memcached、fastcgi、scgi、uwsgi在后端失敗時的重試次數
9.動態腳本語言Lua支持。擴展功能非常高效簡單;
10.支持管道(pipe)和syslog(本地和遠端)形式的日志以及日志抽樣;
11.支持按指定關鍵字(域名,url等)收集Tengine運行狀態;
12.組合多個CSS、JavaScript文件的訪問請求變成一個請求;
13.自動去除空白字符和注釋從而減小頁面的體積
14.自動根據CPU數目設置進程個數和綁定CPU親緣性;
15.監控系統的負載和資源占用從而對系統進行保護;
16.顯示對運維人員更友好的出錯信息,便于定位出錯機器;
17.更強大的防***(訪問速度限制)模塊;
18.更方便的命令行參數,如列出編譯的模塊列表、支持的指令等;
19.可以根據訪問文件類型設置過期時間;
四、Tengine版本變更表
1.[2014-03-28] Tengine-2.0.2 開發版正式發布
2.[2014-03-06] Tengine-2.0.1 開發版正式發布
3.[2014-01-08] Tengine-2.0.0 開發版正式發布
4.[2013-11-22] Tengine-1.5.2 穩定版正式發布
5.[2013-08-29] Tengine-1.5.1 穩定版正式發布
6.[2013-07-31] Tengine-1.5.0 穩定版正式發布
7.[2013-05-14] Tengine-1.4.6 開發版正式發布
8.[2013-05-01] Tengine-1.4.5 開發版正式發布
9.[2013-03-21] Tengine-1.4.4 開發版正式發布
10.[2013-01-21] Tengine-1.4.3 開發版正式發布
11.[2012-11-22] Tengine-1.4.2 開發版正式發布
12.[2012-10-10] Tengine-1.4.1 開發版正式發布
13.[2012-09-05] Tengine-1.4.0 開發版正式發布
14.[2012-05-25] Tengine-1.3.0 穩定版正式發布
15.[2012-05-09] Tengine-1.2.5 穩定版正式發布
16.[2012-03-30] Tengine-1.2.4 穩定版正式發布
17.[2012-02-27] Tengine-1.2.3 穩定版正式發布
18.[2012-01-11] Tengine-1.2.2 穩定版正式發布
19.[2011-12-06] Tengine-1.2.1 版本正式發布
20.[2011-12-02] Tengine宣布開源
五、安裝部署Tengine-2.1.0
1.下載源碼包,解壓縮
wget http://Tengine.taobao.org/download/Tengine-2.1.0.tar.gz
tar zxvf Tengine-2.1.0.tar.gz
cd Tengine-2.1.0
2.看看源碼包的目錄結構
?
默認配置文件路徑Tengine-2.1.0/conf
browsers ?fastcgi.conf ?fastcgi_params ?koi-utf ?koi-win ?mime.types ?nginx.conf ?scgi_params ?uwsgi_params ?win-utf
3.正式配置編譯安裝
1)./configure –help ?可以查看編譯幫助選項,包括定義軟件路徑,加載模塊,禁用模塊等
2)這里默認配置
./configure
配置過程省略,此過程當中會檢查系統的各種信息,包括軟件依賴,如果提示缺少編譯工具要提前安裝yum groupinstall "Development Tools",由于默認安裝需要加載rewrite重寫模塊和ssl安全套接層,所以還有安裝pcre-devel,openssl-devel開發包。
配置過后會匯總默認安裝文件的路徑如下:
nginx path prefix: "/usr/local/nginx"
? nginx binary file: "/usr/local/nginx/sbin/nginx"
? nginx configuration prefix: "/usr/local/nginx/conf"
? nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
? nginx pid file: "/usr/local/nginx/logs/nginx.pid"
? nginx error log file: "/usr/local/nginx/logs/error.log"
? nginx http access log file: "/usr/local/nginx/logs/access.log"
? nginx http client request body temporary files: "client_body_temp"
? nginx dso module path: "/usr/local/nginx/modules/"
? nginx http proxy temporary files: "proxy_temp"
? nginx http fastcgi temporary files: "fastcgi_temp"
? nginx http uwsgi temporary files: "uwsgi_temp"
? ? ? nginx http scgi temporary files: "scgi_temp"
3) 開始編譯安裝
make(make編譯會把源碼包編譯成二進制可執行軟件)
make install (會把編譯好的二進制軟件和配置文件復制到指定的位置)
4) 安裝結果如下
安裝后到/usr/local/nginx目錄下(默認6個目錄)
conf ?html ?include ?logs ?modules ?sbin
?conf 該目錄下放置了所有的重要配置文件,主要有:fastcgi.conf ?nginx.conf ?proxy.conf ?upstream.conf
?html 目錄默認放置的是index.html和50x.html錯誤頁
include 目錄下是模塊文件頭
logs目錄默認放置的是訪問日志和錯誤日志
modules ?目錄下可以放置第三方模塊
sbin 目錄放置的是nginx二進制命令和dso_tool
5)檢查nginx命令的用法
A.顯示版本數
nginx -v
Tengine version: Tengine/2.1.0 (nginx/1.6.2)
B.顯示模塊數
nginx -m
Tengine version: Tengine/2.1.0 (nginx/1.6.2)
loaded modules:
? ? ngx_core_module (static)
? ? ngx_errlog_module (static)
? ? ngx_conf_module (static)
? ? ……
C.測試配置文件語法是否正確
nginx -t
the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
configuration file /usr/local/nginx/conf/nginx.conf test is successful
D.啟動,停止,加載配置文件
-s signal ? ? : send signal to a master process: stop, quit, reopen, reload
六、默認配置測試
1.默認啟動nginx(用的是nobody用戶)
#/usr/local/nginx/sbin/nginx
#ps aux |grep nginx
root ? ? 24561 ?0.0 ?0.0 ?45280 ?1116 ? ? ? ? ?Ss ? 10:45 ? 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody ? 24562 ?0.0 ?0.0 ?45740 ?2112 ? ? ? ? ?S ? ?10:45 ? 0:00 nginx: worker process
#ls /usr/local/nginx (現在11個目錄,新增了5個temp)
client_body_temp ?conf ?fastcgi_temp ?html ?include ?logs ?modules ?proxy_temp ?sbin ?scgi_temp ?uwsgi_temp
2.默認訪問
3.404訪問
? ? ? ? ? ? ?
4.Status狀態訪問
?
七、優化配置測試
1.添加www賬號,默認使用nobody賬戶運行nginx,設置一個固定賬戶主進程還是root運行,worker進程是www運行
#groupadd -g 58 www
#useradd www -s /sbin/nologin -u 58 -g 58 -M
#id www
uid=58(www) gid=58(www) groups=58(www)
2.優化nginx配置
1)可以自動識別cpu進程數并且綁定worker_processes到每個進程上。
worker_processes auto;
為worker_processes增加參數auto。當設置成auto,Tengine將自動啟動與cpu數量相同的worker進程。
worker_cpu_affinity on;
當設置成auto時,Tengine將根據worker的數量自動配置cpu綁定位圖。綁定的順序是按CPU編號從大到小。
2)修改events區域
use epoll;#linux系統使用
worker_connections 60000;#默認每個worker連接數是1024
3)header頭優化
client_header_buffer_size 32k;#客戶請求頭緩沖大小
large_client_header_buffers 4 32k; #如果header過大,它會使用這個參數來讀取
5)http模塊優化
server_tokens off;#錯誤頁面中隱藏Tengine的版本,提高安全性
sendfile on;#高效文件傳輸模式,將tcp_nopush和tcp_nodely設置為on
tcp_nopush ? ? on;#告訴nginx在一個數據包里發送所有頭文件
keepalive_timeout 60;#給客戶端分配keep-alive鏈接超時時間,這里是60s
tcp_nodelay on;#告訴nginx不要緩存數據,而是一段一段的發送--當需要及時發送數據時,就應該給應用設置這個屬性
6)gzip壓縮
? ?gzip on;#開啟gzip壓縮 ?實時壓縮輸出數據流
? ?gzip_min_length ?1k;#最小1K才開始壓縮
? ?gzip_buffers ? ? 4 16k;#壓縮緩存
? ?gzip_http_version 1.1;#壓縮版本
? ?gzip_comp_level 2;#壓縮級別
? ?gzip_types ? ? ? text/plain application/x-javascript text/css application/xml p_w_picpath/png;#壓縮類型
? ?gzip_vary on;
7)log日志
A.日志格式
log_format ?access ?'$remote_addr - $remote_user [$time_local] "$request" '
? ? ? ? ? ? ? ? ? ? ? '$status $body_bytes_sent $request_time ?"$http_referer" '
? ? ? ? ? ?'"$http_user_agent" "$http_x_forwarded_for" $proxy_add_x_forwarded_for ';
產生的日志格式如下:
訪問IP-用戶時間-請求uri-狀態-大小-請求時間-referer-代理IP-真實IP
61.145.164.198 - - [07/May/2015:13:39:37 +0800] "GET /manager/html HTTP/1.1" 404 590 0.000 ?"-" "Mozilla/3.0 (compatible; Indy Library)" "-" 61.145.164.198
B.日志分割
除了這個還得對Tengine產生的大量日志,得進行分割才好處理,下面是日志分割腳本:
#!/bin/bash
# This script run at 00:00 to cut nginx_log per day.
logs_path="/data/logs"
log_names=`cd ${logs_path};ls *.log`
year=`date -d "yesterday" +"%Y"`
month=`date -d "yesterday" +"%m"`
time=`date -d "yesterday" +"%Y%m%d"`
/usr/bin/find $logs_path ?-mtime +14 -exec rm -rf {} \;
for log in $log_names
do
? ? mv ${logs_path}/$log ${logs_path}/$log.$time
? ? kill -USR1 `cat /usr/local/nginx/nginx.pid`
done
這個日志腳本要結合cron任務每天凌晨運行,日志按天切割,如果需要按其他時間切割,只需要調整周期性計劃任務即可 ,另外這里是保存二周的日志,注意kil –USR1比nginx –s reload更優雅,特別是精確到分鐘時只能選擇kill –USR1這個參數
8) 系統內核優化(這個需要結合實際服務器硬件和訪問量來修改)
net.ipv4.ip_forward = 1 ? ? ? ? ? ?#開啟路由功能
net.ipv4.conf.default.rp_filter = 1 ? ?#禁用所有IP源路由?
net.ipv4.conf.default.accept_source_route = 0 ? ?#禁用icmp源路由選項
kernel.sysrq = 0 ? ?#關閉SysRq功能,SysRq代表的是Magic System Request Key
kernel.core_uses_pid = 1 ? ? ?#控制core文件的文件名是否添加pid作為擴展?
net.ipv4.tcp_syncookies = 1 ? ?# tcp syncookie,默認關閉
kernel.msgmnb = 65536 #默認的每個消息隊列的最大尺寸(byte),默認為16384
kernel.msgmax = 65536 ? ?#消息隊列中單條消息的最大尺寸(byte),默認8192
kernel.shmmax = 68719476736 ? ?#共享內存中的最大內存塊尺寸(byte),默認33554432(32M),這里是65536M
kernel.shmall = 4294967296 ? #kernel.shmall的單位是頁面數,當前的x86體系上這個單位是4K,這里是2048G的共享內存總量,默認2097152
fs.file-max = 6553600 ? ? ? #系統級最大打開文件數,還要結合limits.conf的soft和hard限制
net.ipv4.tcp_max_tw_buckets = 5000 ? ?#1st低于此值,TCP沒有內存壓力,2nd進入內存壓力階段,3rdTCP拒絕分配socket(單位:內存頁)
net.ipv4.tcp_sack = 1 ? ? ? ? ? ? ? ?#定義SYN重試次數
net.ipv4.tcp_window_scaling = 1 #開啟窗口縮放功能
net.ipv4.tcp_rmem = 4096 ?87380 ?4194304 ? #接受緩沖的大小:MIN,DEFAULT,MAX
net.ipv4.tcp_wmem = 4096 ? ?16384 ? 4194304 ? #socket的發送緩存區分配的MIN,DEFAULT,MAX
net.ipv4.tcp_max_syn_backlog = 8192 ? ?#syn隊列,默認1024,> 1280可能工作不穩定,需要修改內核源碼參數
net.core.netdev_max_backlog = 32768 ? ?#進入包的最大設備隊列.默認是300,對重負載服務器而言,該值太低,可調整到2000. ? ? ? ??
net.core.somaxconn = 32768 ? ? ? ? ?#listen()的默認參數,掛起請求的最大數量.默認是128.對繁忙的服務器,增加該值有助于網絡性能
net.core.wmem_default = 8388608 ? ? #表示套接字發送緩沖區大小的缺省值,會覆蓋net.ipv4.tcp_wmem的DEFAUL值
net.core.rmem_default = 8388608 ? ? ?#表示套接字接收緩沖區大小的缺省值
net.core.rmem_max = 16777216 ? ? ? #表示套接字接收緩沖區大小的最大值
net.core.wmem_max = 16777216 ? ? ?#表示套接字發送緩沖區大小的最大值,會覆蓋net.ipv4.tcp_wmem的MAX值
net.ipv4.tcp_timestamps = 0 ? ? ?#禁用時間戳,時間戳可以避免序列號的卷繞
net.ipv4.tcp_synack_retries = 2 ? #syn-ack握手狀態重試次數,默認5,遭受syn-flood***時改為1或2
net.ipv4.tcp_syn_retries = 2 ? ? ? #外向syn握手重試次數,默認4
net.ipv4.tcp_tw_recycle = 1 ? ? ? #開啟 TCP 連接中 TIME-WAIT sockets 的快速回收,默認為 0 ,表示關閉。
net.ipv4.tcp_tw_reuse = 1 ? ? ? ?#開啟重用。允許將 TIME-WAIT sockets 重新用于新的 TCP 連接,默認為 0 ,表示關閉;
net.ipv4.tcp_mem = 94500000 915000000 927000000 ?#1低于此值,TCP沒有內存壓力,2在此值下,進入內存壓力階段,3高于此值,TCP拒絕分配socket.上述內存單位是頁
net.ipv4.tcp_max_orphans = 3276800#選項用于設定系統中最多有多少個TCP套接字不被關聯到任何一個用戶文件句柄上,如果超過這個數字,孤立連接將立即被復位并打印出警告信息
net.ipv4.tcp_fin_timeout = 30 ? ? ? ? ? ? ?#修改系統默認的 TIMEOUT 時間
net.ipv4.tcp_keepalive_time = 300 ? ? ? ? ?#表示當keepalive起用的時候,TCP發送keepalive消息的頻度。缺省是2小時,改為5分鐘。
net.ipv4.ip_local_port_range = 1024 ? ?65000 ? ?#表示用于向外連接的端口范圍。缺省情況下過窄:32768到61000,改為1024到65535。
net.ipv4.ip_conntrack_max = 655360 ? ? ? ? ? ?#增大iptables狀態跟蹤表
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180 ? ? #設置默認 TCP 連接時長為180秒
9)為了安全還得開啟iptables防火墻
Iptables防火墻策略如下:
cat /etc/sysconfig/iptables
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:myinput - [0:0]
:syn-flood - [0:0]
-A INPUT -j myinput?
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j syn-flood?
-A myinput -m state --state RELATED,ESTABLISHED -j ACCEPT?
-A myinput -i lo -j ACCEPT?
-A myinput -p tcp -m tcp --dport 80 -j ACCEPT?
-A myinput -p tcp -m tcp --dport 443 -j ACCEPT
-A myinput -s 111.111.111.0/255.255.255.0 -j ACCEPT?
……
-A myinput -i eth2 -j ACCEPT?
-A syn-flood -p tcp -m limit --limit 3/sec --limit-burst 6 -j RETURN?
-A syn-flood -j REJECT --reject-with icmp-port-unreachable?
COMMIT
以上的意思是默認DROP所有進來的數據包,只允許80和443端口,這個是提供web服務的,另外eth2內網進來的所有數據包都通過,還加了一個防止小型DDOS***的自定義鏈sys-flood
3.總體配置文件如下
user ?www www;
worker_processes ?auto;
worker_cpu_affinity auto;
error_log ?logs/error.log ?info;
pid ? ? ? ?logs/nginx.pid;
events {
? ? use epoll;
? ? worker_connections 60000;
}
http {
? ? server_names_hash_bucket_size 128;
? ? client_header_buffer_size 32k;
? ? large_client_header_buffers 4 32k;
? ? sendfile on;
? ? ……
? ? gzip on;
? ? ……
? ? include ? ? ? mime.types;
? ? default_type ?application/octet-stream;
log_format ?access?
……
? ? server {
? ? ? ? listen ? ? ? 80;
? ? ? ? server_name ?localhost;
? ? ? ? ……
? ? ? ? location / {
? ? ? ? ? ? root ? html;
? ? ? ? ? ? index ?index.html index.htm;
? ? ? ? }
? ? ? ? error_page ? 500 502 503 504 ?/50x.html;
? ? ? ? location = /50x.html {
? ? ? ? ? ? root ? html;
? ? ? ? }
? ?}
? ? include ?vhosts/*.conf;
? ? include ?upstream.conf;
? ? include ?proxy.conf;?
}
八、結合線上功能測試
1.反向代理負載均衡
1)先了解一下反向代理負載均衡的概念
使用代理服務器可以將請求轉發給內部的Web服務器,使用這種加速模式顯然可以提升靜態網頁的訪問速度。因此也可以考慮使用這種技術,讓代理服務器將請求 均勻轉發給多臺內部Web服務器之一上,從而達到負載均衡的目的。這種代理方式與普通的代理方式有所不同,標準代理方式是客戶使用代理訪問多個外部Web 服務器,而這種代理方式是多個客戶使用它訪問內部Web服務器,因此也被稱為反向代理模式。
2)Tenginx是怎樣實現這個功能的
Tenginx使用這個功能需要2個模塊ngx_http_proxy_module和ngx_http_upstream_module,ngx_http_proxy_module模塊負責反向代理,ngx_http_upstream_module負載負載均衡,這兩個模塊在Tengine默認安裝時就會
3)Proxy模塊介紹
proxy_redirect off;
proxy_set_header Host $host;#設定header
proxy_set_header ?X-Real-IP ?$remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ?#獲取客戶端真實IP
client_max_body_size ? ?20m;#上傳文件大小
client_body_buffer_size 256k;
proxy_connect_timeout ? 60;#代理連接超時
proxy_send_timeout ? ? ?60;#代理發送超時
proxy_read_timeout ? ? ?60;#代理接收超時
proxy_buffer_size ? ? ? 256k;#代理緩沖大小
proxy_buffers ? ? ? ? ? 4 256k;#代理緩沖
proxy_busy_buffers_size 256k;#高負荷下緩沖大小
proxy_temp_file_write_size 256k;
4)Upsteam模塊介紹
主要是負載均衡算法包括:ip_hash、輪詢、加權輪詢、散列哈希、最短連接數附加功能有會話保持、動態域名解析、健康檢查
輪詢:每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器down掉,能自動剔除
Ip_hash:每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題,但是僅能用ip這個因子來分配后端,所以也有缺陷,在下列兩種情況下不可以使用:
A.nginx不是最前端的服務器。ip_hash要求nginx一定是最前端的服務器,否則nginx得不到正確ip,就不能根據ip作hash。譬如使用 的是squid為最前端,那么nginx取ip時只能得到squid的服務器ip地址
B.nginx的后端還有其它方式的負載均衡。假如nginx后端又有其它負載均衡,將請求又通過另外的方式分流了,那么某個客戶端的請求不能定位到同一 臺session應用服務器上
示例如下:
upstream testcom {
Server 192.168.0.11:80 ?max_fails=2 fail_timeout=10s;
Server 192.168.0.22:80 ?max_fails=2 fail_timeout=10s;
Server 192.168.0.33:80 ?weight=3 max_fails=2 fail_timeout=10s;
Server 192.168.0.11:80 ?down;
Server 192.168.0.22:80 ?backup;
}
down 表示當前的server暫時不參與負載
weight 默認為1.weight越大,負載的權重就越大
max_fails :在fail_timeout時間內對后臺服務器請求失敗的次數
fail_timeout:max_fails次失敗后,暫停的時間
backup: 其它所有的非backup機器down或者忙的時候,請求backup機器
5)大規模部署時注意事項
首先在/usr/local/nginx/conf/目錄下新建proxy.conf文件,上傳upstream.conf文件,新建目錄vhosts,把反向代理server配置文件上傳到vhosts目錄下
然后nginx.conf配置文件下面添加增加保存服務器名字的hash表大小,否則太多vhosts多vhosts情況下會有nginx語法檢測報錯:
server_names_hash_bucket_size 128; ?默認是64
2.域名重寫
1)這個功能需要加載ngx_http_rewrite_module模塊,默認就會安裝
2)主要指令Break、If、Return、Rewrite、Set
3)Rewrite
rewrite指令
語法:rewrite regex replacement [flag];
作用域:server,location,if
該指令會按照相關的regex正則表達式和replacement替換字符串改變url,如果replacement替代字符串由http://開始,那么客戶端會被重定向
flag可以是如下參數
last :在搜索到相應的URL和location之后完成rewrite指令
break: 本條規則匹配完成后,終止匹配,不再匹配后面的規則
redirect :返回302臨時重定向,瀏覽器地址欄會顯示跳轉后的URL地址
permant: 返回301永久重定向,瀏覽器地址欄會顯示跳轉后的URL地址
最終完整的重定向URL包括請求scheme(http://,https://等),請求的 server_name_in_redirect和 port_in_redirec三部分 ,說白了也就是http協議 域名 端口三部分組成
4)If
默認值:無if指令
語法:if(condition)
作用域:server,location
對給定的條件condition進行判斷。如果為真,大括號內的rewrite指令將被執行。
5)Set
set指令
語法:set variable value;
作用域:server,location,if
定義一個變量并賦值,值可以是文本,變量或者文本變量混合體
6)主要用到rewrite,下面是示例
if ($http_user_agent ~* "(android|iphone|UCWEB|ipod|windows[[:space:]]phone)") {
? ? ? ? ? ?set $redirect Y;
? ? ? ? ? }
if ($http_cookie ~* "userswitch") {
? ? ? ? ? ?set $redirect N;
? ? ? ? ? }
if ($redirect = Y) {
? ? ? ? ? ? rewrite ^/(.*)$ http://m.test.com/$1 last;
? ? ? ? }
以上就是先判斷是不是移動端來訪問,如果是移動端來訪問,就重定向到移動站點,其中有set設置一個變變量方便下面判斷
3.連接數請求數限制功能
1)要實現這兩個功能需要安裝ngx_http_limit_conn_module和ngx_http_limit_req_module模塊,默認都會安裝。
2)ngx_http_limit_conn_module 模塊可以按照定義的鍵限定每個鍵值的連接數。特別的,可以設定單一 IP 來源的連接數。并不是所有的連接都會被模塊計數;只有那些正在被處理的請求(這些請求的頭信息已被完全讀入)所在的連接才會被計數。指定一塊已經設定的共享內存空間,以及每個給定鍵值的最大連接數。當連接數超過最大連接數時,服務器將會返回 503 (Service Temporarily Unavailable) 錯誤。比如,如下配置
3)ngx_http_limit_req_module,和nginx類似,不過支持多個變量,并且支持多個limit_req_zone的設置。比如:
limit_req_zone $binary_remote_addr zone=one:3m rate=1r/s; ??
limit_req_zone $binary_remote_addr $uri zone=two:3m rate=1r/s;
limit_req_zone $binary_remote_addr $request_uri zone=thre:3m rate=1r/s;
上面的第二個指令表示當相同的ip地址并且訪問相同的uri,會導致進入limit req的限制(每秒1個請求
? ? ? ? ? ? ? ? ? ? ??
4)綜合起來具體配置如下:
A.在http區域添加如下配置
? ?geo $white_ip {
? ? ? ? ranges;
? ? ? ? default 0;
? ? ? ? 127.0.0.1-127.0.0.255 1;
? ? }
? ? limit_req_whitelist geo_var_name=white_ip geo_var_value=1;
? ? 以上是設置白名單,白名單里面的IP不受連接數和請求數限制
? ? limit_conn_zone $binary_remote_addr zone=addr:10m;
? ? limit_conn_log_level ?info;
? ? limit_req_log_level info;
? ? limit_req_zone $binary_remote_addr zone=one:3m rate=10r/s;
注意,這里使用的是$binary_remote_addr變量,而不是$remote_addr變量。$remote_addr變量的長度為7字節到15字節不等,而存儲狀態在32位平臺中占用32字節或64字節,在64位平臺中占用64字節。而$binary_remote_addr變量的長度是固定的4字節,存儲狀態在32位平臺中占用32字節或64字節,在64位平臺中占用64字節。一兆字節的共享內存空間可以保存3.2萬個32位的狀態,1.6萬個64位的狀態。如果共享內存空間被耗盡,服務器將會對后續所有的請求返回 503 (Service Temporarily Unavailable) 錯誤
B.在vhosts配置文件中location區域添加如下:
? ? ? location / {
? ? ? ? ? limit_req zone=one burst=5;#在全局請求數基礎上可以多5個
limit_conn addr 3;#單個IP并發連接數為3
? ? ? ? ? proxy_pass http://test_com;
? ? ? ? ? access_log ?/data/wwwlogs/access_test_com.log ?access;
? ? ? } ? ?
C.Webbench測試查看日志
/usr/loca/bin/webbench http://test.com/test.html -c 100 -t 20
可以選擇2兩個測試點測試,一個添加到白名單,一個沒有,然后同時壓力測試,通過Tengine的訪問日志來觀察,和webbench自身連接成功率進行判斷:
白名單沒有添加測試服務器IP前全是503錯誤
添加測試服務器IP后都是200正常訪問
4.Nginx阻止用戶代理
有些時候,需要阻止某些用戶代理訪問網站,比如ab,wget,curl等等,這就需要使用到$http_user_agent變量。
修改nginx.conf
if ($http_user_agent ~* (Wget|ab) ) {
return 403;
}
if ($http_user_agent ~* LWP::Simple|BBBike|wget) {
?return 403;
}
重啟nginx
# /usr/local/nginx-1.7.0/sbin/nginx -s reload
九、結果
1.本文主要介紹了Tengine,安裝,配置,優化,并對其反向代理服務器功能這塊做了詳細的研究和測試,發現其能很好的滿足高并發web服務器請求,另外Tengine功能上完全和nginx兼容,很適合從nginx向Tengine的轉變,在nginx中所以的用法都可以在Tengine中使用,但是Tengine做了很多優化及性能的提高,更適合國內場景的使用
2.Tengine的用途比較多,比如web服務器,代理服務器,緩存服務器,反向代理服務器,郵件代理服務器,這里只是簡單測試一下靜態web服務器,重點放在了反向代理服務器這塊,測試了反向代理服務器的域名重寫和反向代理負載均衡功能,還有連接限制
3.Tengine增加了很多細節方面的調整,這個得在使用過程中慢慢體驗,包括nginx對系統的監控,對源站的健康檢查,多種負載算法,動態添加模塊,和系統日志的結合,輸入過濾機制的支持,動態腳本語言lua的支持等等
4.Tengine是的每一項功能都值得去深入了解,特別是ngx_http_rewrite_module模塊,ngx_http_proxy_module模塊,ngx_http_upstream_module模塊三大模塊支撐起了他在作為反向代理負載均衡服務器市場的重要地位,這里對這三大模塊的了解算是九牛一毛,特別是各種符合實際場景的域名重寫規則(需要對正則表達式有一定的了解),反向代理proxy對header頭的把握和對日志格式的影響以及對后端源站的影響,不去深入研究很難弄清楚,這里upstream負載均衡模塊還算簡單點,但是Tengine版本還算多添加了幾個算法例如散列和會話保持功能都沒有來得及去研究,由于時間和篇幅有限,這里只了解這些。
轉載于:https://blog.51cto.com/jerrymin/1644012
總結
以上是生活随笔為你收集整理的代理服务器Tengine的研究与测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP高并发高负载系统架构
- 下一篇: JAVA学习--集合的遍历