代理服務器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 image/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版本還算多添加了幾個算法例如散列和會話保持功能都沒有來得及去研究,由於時間和篇幅有限,這裏只瞭解這些。