Tengine 和 Nginx
Tengine簡介
從2011年12月開始:Tengine是由淘寶網發起的Web伺服器專案。它在Nginx的基礎上,針對大訪問量網站的需求,新增了很多高階功能和特性。Tengine的效能和穩定性已經在大型的網站如淘寶網,天貓商城等得到了很好的檢驗。它的最終目標是打造一個高效、穩定、安全、易用的Web平臺。(來自於http://tengine.taobao.org/)
Nginx簡介
Nginx是一個開源專案,是一個高效能的HTTP server 和 reverse proxy,也可以作為IMAP/POP的反向代理,通過簡單的配置,就可以實現高效能,且佔用系統資源較小。Nginx設計之初是為了解決C10K問題,其非常輕量級,僅支援event模型。
特性
Nginx的特性
- 模組化設計,較好的擴充套件性
- 高可靠性:master/worker
- 支援熱部署:不停機更新配置檔案、更換日誌檔案、更新伺服器版本
- 低記憶體消耗:10000個keep-alive連線模式下的非活動連線僅消耗2.5M記憶體
- event-driven,aio,mmap
- DOS機制在 2016-04-26 nginx-1.10.0 版本中才支援
Tengine特性
- 繼承Nginx-1.6.2的所有特性,相容Nginx的配置;
- 動態模組載入(DSO)支援。加入一個模組不再需要重新編譯整個Tengine;
- 支援SO_REUSEPORT選項,建連效能提升為官方nginx的三倍;
- 同時支援HTTP v2協議和SPDY v3協議,可同時使用兩種協議;
- 流式上傳到HTTP後端伺服器或FastCGI伺服器,大量減少機器的I/O壓力;
- 更加強大的負載均衡能力,包括一致性hash模組、會話保持模組,還可以對後端的伺服器進行主動健康檢查,根據伺服器狀態自動上線下線,以及動態解析upstream中出現的域名;
- 輸入過濾器機制支援。通過使用這種機制Web應用防火牆的編寫更為方便;
- 支援設定proxy、memcached、fastcgi、scgi、uwsgi在後端失敗時的重試次數
- 動態指令碼語言Lua支援。擴充套件功能非常高效簡單;
- 支援管道(pipe)和syslog(本地和遠端)形式的日誌以及日誌抽樣;
- 支援按指定關鍵字(域名,url等)收集Tengine執行狀態;
- 組合多個CSS、JavaScript檔案的訪問請求變成一個請求;
- 自動去除空白字元和註釋從而減小頁面的體積
- 自動根據CPU數目設定程式個數和繫結CPU親緣性;
- 監控系統的負載和資源佔用從而對系統進行保護;
- 顯示對運維人員更友好的出錯資訊,便於定位出錯機器;
- 更強大的防攻擊(訪問速度限制)模組;
- 更方便的命令列引數,如列出編譯的模組列表、支援的指令等;
- 可以根據訪問檔案型別設定過期時間;
(來自於http://tengine.taobao.org/)
Tengine安裝
下載地址:http://tengine.taobao.org/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# yum -y install pcre-devel openssl-devel zlib-devel # ./configure prefix=/usr/local sbin-path=/usr/sbin/nginx conf-path=/etc/nginx/nginx.conf error-log-path=/var/log/nginx/error.log http-log-path=/var/log/nginx/access.log pid-path=/var/run/nginx.pid lock-path=/var/run/nginx.lock http-client-body-temp-path=/var/cache/nginx/client_temp http-proxy-temp-path=/var/cache/nginx/proxy_temp http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp http-scgi-temp-path=/var/cache/nginx/scgi_temp user=nginx group=nginx with-http_ssl_module with-http_realip_module with-http_addition_module with-http_sub_module with-http_dav_module with-http_flv_module with-http_mp4_module with-http_gunzip_module with-http_gzip_static_module with-http_random_index_module with-http_secure_link_module with-http_stub_status_module with-http_auth_request_module with-threads with-stream with-stream_ssl_module with-http_slice_module with-file-aio with-http_v2_module # make && make install |
啟動前配置:
1 2 3 |
echo “export PATH=$PATH:/usr/local/nginx/sbin” >/etc/profile.d/nginx.sh useradd -r nginx -s /sbin/nologin mkdir /var/cache/nginx/client_temp -pv |
一、核心模組
1、Main端配置
約定:
大部分模組使用方式,tengine與nginx相同,nginx模組使用可以參照nginx的官方站點,tengine。
Syntax: 表示功能或者選項,其後面有語法
Default: 預設值
Context: 可出現的上下文
A、必備常用配置
1、user 指定用於執行worker程式的使用者和組
Syntax: user user [group];
Default: user nobody nobody;
Context: main
2、pid 指定nginx程式的pid檔案路徑
yntax: pid file;
Default:
pid nginx.pid;
Context: main
3、worker_rlimit_nofile number 單個worker程式所能夠開啟的最大檔案數
Syntax: worker_rlimit_nofile number;
Default: —
Context: main
B、效能優化相關配置
1、 worker_processes number | auto worker的程式數;通常應該為CPU的核心數減1
Syntax: worker_processes number | auto;
Default:
worker_processes 1;
Context: main
2、worker_cpu_affinity cpumask … 將work程式繫結到cpu上
Syntax: worker_cpu_affinity cpumask …;
worker_cpu_affinity auto [cpumask];
Default: —
Context: main
例子:
1 2 3 4 5 6 7 8 9 |
2核cpu,開啟八個程式 worker_processes 8; worker_cpu_affinity 01 10 01 10 01 10 01 10; 8核cpu,開啟8個程式 worker_processes 8; worker_cpu_affinity 10000000 01000000 00100000 00010000 00001000 00000100 00000010 00000001; 8核cpu,開啟2個程式 worker_processes 2; worker_cpu_affinity 10101010 01010101; |
3、worker_priority nice 定義work程式的優先順序,數字越小優先順序越高
[-20,19]
對應的優先順序是:100-139
Syntax: worker_priority number;
Default:
worker_priority 0;
Context: main
C、除錯定位問題
1、daemon on | off 是否以守護程式方式啟動nginx程式
Syntax: daemon on | off;
Default:
daemon on;
Context: main
2、master_process on | off 是否以master/worker模型啟動nignx程式
Syntax: master_process on | off;
Default:
master_process on;
Context: main
3、error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg]
錯誤日誌記錄方式,及其日誌級別
1 2 3 4 5 6 7 8 9 10 11 |
Syntax: error_log file [level]; Default: error_log logs/error.log error; Context: main, http, mail, stream, server, location 方式: file /PATH/TO/SOME_LOG_FILE; stderr:傳送到錯誤輸出; syslog:server=address[,parameter=value]:傳送給syslog伺服器; memory:size:緩衝區大小 For example: error_log logs/error.log notice |
2、events段配置
1、worker_connections number 每個worker程式所能夠併發開啟的最大連線數
Syntax: worker_connections number;
Default:
worker_connections 512;
Context: events
最大併發數=最大連線數*worker_processes 4的數字
2、use method 指明併發連線請求處理時使用的方法
Syntax: use method;
Default: —
Context: events
3、accept_mutex on | off 啟用時,表示用於讓多個worker輪流地、序列化地響應新請求
Syntax: accept_mutex on | off;
Default:
accept_mutex on;
Context: events
3、server段常用配置
1、listen address[:port] [default_server] [ssl] [backlog=number] [rcvbuf=size] [sndbuf=size]
listen port [default_server] [ssl];
listen unix:path [default_server] [ssl]
default_server:預設虛擬主機
ssl:限制只能通過ssl連線提供服務
backlog:後緩佇列的長度
rcvbuf:接收緩衝大小
sndbuf:傳送緩衝區大小
2、server_name name … 主機名
Syntax: server_name name …;
Default:
server_name “”;
Context: server
指明當前server的主機名;後可跟一個或空白字元分隔的多個主機;
支援使用*任意長度的任意字元;
支援~起始的正規表示式模式字串;
應用策略:
(1) 首先精確匹配;
(2) 左則*萬用字元匹配;
(3) 右側*萬用字元匹配;
(4) 正規表示式模式匹配;
For example:
server_name www.example.com;
server_name *.example.com;
server_name www.example.*;
server_name ~^..example..$;
mail.example.com, www.example.com
3、tcp_nodelay on|off 對keepalived模式下的連線是否啟用TCP_NODELAY選項
Syntax: tcp_nodelay on | off;
Default: tcp_nodelay on;
Context: http, server, location
4、sendfile on | off 是否啟用sendfile功能
Syntax: sendfile on | off;
Default:
sendfile off;
Context: http, server, location, if in location
4、路徑相關配置
1、root path 設定web資源路徑對映
Syntax: root path;
Default:
root html;
Context: http, server, location, if in location
For example:
1 2 3 |
location /i/ { root /data/w3; } |
2、location [ = | ~ | ~* | ^~ ] uri { … }
Syntax: location [ = | ~ | ~* | ^~ ] uri { … }
location @name { … }
Default: —
Context: server, location
根據使用者請求的URI來匹配定義的location,匹配到時,此請求將被相應的location塊中的指令所處理;
=:URI精確匹配;
~:做正規表示式模式匹配,區分字元大小寫;
~*:做正規表示式模式匹配,不區分字元大小寫;
^~:對URI的左半部分做匹配檢查,不區分字元大小寫;
匹配優先順序:=、^~、~/~*、不帶符號;
For example:
1 2 3 |
location = / { [ configuration A ]; } |
1 2 3 |
location / { [ configuration B ]; } |
1 2 3 |
location /documents/ { [ configuration C ]; } |
1 2 3 |
location ^~ /images/ { [ configuration D ]; } |
1 2 3 |
location ~* .(gif|jpg|jpeg)$ { [ configuration E ]; } |
2、alias path 定義路徑別名
Syntax: alias path;
Default: —
Context: location
For example:
1 2 3 |
location /i/ { alias /data/w3/images/; } |
3、error_page code … [=[response]] uri
根據使用者其你去的資源的http響應的狀態碼實現錯誤頁面重定向
Syntax: error_page code … [=[response]] uri;
Default: —
Context: http, server, location, if in location
Tengine配置選項眾多,此處就介紹到此,如果有興趣可以參考nginx官方文件或者tengine的官方文件,此處不在過多介紹,下面介紹幾個常見使用的模組,ssl、rewrite、gzip、fastcgi、防盜鏈、stasus等功能
官方文件:
http://tengine.taobao.org/documentation.html
http://nginx.org/en/docs/
二、Tengine常用模組
1、Module ngx_http_rewrite_module
ngx_http_rewrite_module 模組可以通過使用正規表示式,重定向請求url。
A、rewrite regex replacement [flag] 重定向請求
把使用者請求的URI基於regex做檢查,匹配到時將替換為replacement指定的字串
在同一個location中存在的多個rewrite規則會自上而下逐個被檢查(迴圈),可以使用flag控制此迴圈功能
如果replacement是以http://或https://開頭,則替換結果會直接以重定向方式返回給客戶端
[flag]:
- last:重寫完成後停止對當前uri在當前location中的後續其它重寫操作,改為對新uri的新一輪處理;
- break:重寫完成後停止對當前uri在當前location中的後續其它重寫操作;
- redirect:重寫完成後以臨時重定向方式直接返回重寫後生成的新URL給客戶端,由客戶對新URL進行請求;(302)
- permanent:重寫完成後以永久重定向方式直接返回重寫後生成的新URL給客戶端,由客戶對新URL進行請求;(301)
B、rewrite_log on | off 是否啟用重寫日誌
啟用時,日誌資訊被髮往錯誤日誌
Syntax:rewrite_log on | off;
Default:rewrite_log off;
Context:http, server, location, if
C、if (condition) { … } 條件判斷機制
在條件滿足時,執行配置塊中的配置
condition:
比較表示式:
==, !=
- ~:模式匹配,區分字母大小寫;
- ~*:模式匹配,不區分字元大小寫;
- !~:模式不匹配,區分字母大小寫;
- !~*:模式不匹配,不區分字母大小寫;
檔案及目錄存在性判斷:
- -f, !-f:檔案
- -d, !-d:目錄
- -e, !-e:存在
- -x, !-x:執行
For example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; } if ($http_cookie ~* "id=([^;]+)(?:;|$)") { set $id $1; } if ($request_method = POST) { return 405; } if ($slow) { limit_rate 10k; } if ($invalid_referer) { return 403; } |
D、return code [text];停止處理並將指定的程式碼返回給客戶端
Syntax:return code [text];
return code URL;
return URL;
Default:—
Context:server, location, if
E、set $variable value使用者自定義變數
Syntax:set $variable value;
Default:—
Context:server, location, if
ngx_http_rewrite_module 示例:
1 2 3 4 5 6 7 8 |
# 將所有訪問172.18.4.70下image都重定向到tupian目錄下 # vim /usr/local/nginx/conf/nginx.conf location /image { rewrite ^/image/(.*) /tupian/$1 last; rewrite ^/image/(.*) /tupian/$1 last; return 403; index index.html; } |
測試效果:
1 2 3 4 5 |
# 新增測試頁面 # cat /usr/local/nginx/html/image/index.html <h1>image</h1> # cat /usr/local/nginx/html/tupian/index.html <h1>tupian</h1> |
if (condition) { … } 示例
1 2 3 |
if ($request_method = GET) { return 405; } |
2、Module ngx_http_gzip_module
過濾器,對指定型別的資源壓縮傳輸以節約頻寬
gzip on | off;
啟用或禁用gzip壓縮響應報文;
Syntax:gzip on | off;
Default:gzip off;
Context:http, server, location, if in location
gzip_comp_level level;
指定壓縮比,1-9,預設為1;
Syntax:gzip_comp_level level;
Default: gzip_comp_level 1;
Context:http, server, location
gzip_disable regex …;
regex是匹配客戶端瀏覽器型別的模式,表示對所有匹配到的瀏覽器不執行壓縮響應;
Syntax:gzip_disable regex …;
Default:—
Context:http, server, location
This directive appeared in version 0.6.23.
gzip_min_length length;
觸發啟用壓縮功能的響應報文的最小長度;
Syntax:gzip_min_length length;
Default:gzip_min_length 20;
Context:http, server, location
gzip_http_version 1.0 | 1.1;
設定啟用壓縮響應功能時,協議的最小版本;
Syntax:gzip_http_version 1.0 | 1.1;
Default:gzip_http_version 1.1;
Context:http, server, location
gzip_types mime-type …;
指定僅執行壓縮的資源內容型別;預設為text/html;
Syntax:gzip_types mime-type …;
Default:gzip_types text/html;
Context:http, server, location
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any …;
對代理的請求基於何種屬性判斷其是否應該啟用壓縮功能;
Syntax:gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any …;
Default:gzip_proxied off;
Context:http, server, location
Example Configuration:
示例:
gzip on;
gzip_http_version 1.0;
gzip_comp_level 6;
gzip_disable msie6;
gzip_min_length 2;
gzip_types text/plain text/css text/xml application/x-javascript application/xml application/json application/java-script;
測試示例:
未配置之前:檢視Response Headers報文中是否有gzip選項
配置之後:檢視Response Headers報文中是否有gzip選項
3、Module ngx_http_fastcgi_module
fastcgi_pass address address是fpm伺服器監聽的地址和埠;
示例: fastcgi 127.0.0.1:9000;
fastcgi_index name fastcgi應用的主頁名稱
fastcgi_param parameter value [if_not_empty] 傳遞給fpm伺服器的引數及其值
fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
path:檔案系統路徑,用於儲存快取的檔案資料;
max_size=size:定義此路徑下的多大空間用於儲存快取資料;
levels=#[:#[:#]]:快取目錄層級定義;
levels=1:2
keys_zone=name:size 記憶體中用於快取k/v對映關係的空間名稱及大小;
inactive=time
注意:只能定義在http上下文
For example:
1 |
fastcgi_cache_path /var/cache/nginx/client_temp levels=1:2 keys_zone=one:10m; |
儲存格式:
1 |
/var/cache/nginx/client_temp/c/29/b7f54b2df7773722d382f4809d65029c |
fastcgi_cache zone | off 是否啟用cache,如果啟用,資料快取於哪個cache中
fastcgi_cache_key string 定義要使用的快取鍵
例如: fastcgi_cache_key $request_uri;
fastcgi_cache_methods GET | HEAD | POST … 快取哪些型別的請求的相關資料
fastcgi_cache_valid [code …] time 對不同響應碼設定其可快取時長
注意:呼叫快取時,至少應該 指定三個引數
fastcgi_cache
fastcgi_cache_key
fastcgi_cache_valid
測試示例:
1 2 3 4 5 6 7 8 9 |
# vim /usr/local/nginx/conf/nginx.conf fastcgi_cache_path /var/data/nginx/cache levels=1:2 keys_zone=mycache:10m inactive=4m; # 上面選項必須在http上下文 location \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_cache mycache; fastcgi_cache_key $request_uri; fastcgi_cache_valid any 10m; } |
啟用前檢視:/var/data/nginx/cache目錄
啟動後檢視:/var/data/nginx/cache目錄
4、Module ngx_http_ssl_module
ssl on | off 是否啟用當前虛擬主機的ssl功能
Syntax:ssl on | off;
Default:ssl off;
Context:http, server
ssl_certificate file 當前虛擬主機使用的PEM格式的證照檔案
Syntax: ssl_certificate file;
Default:—
Context:http, server
ssl_certificate_key file 當前虛擬機器使用的證照檔案中的公鑰配對兒的私鑰檔案路徑 Syntax:ssl_certificate_key file;
Default:—
Context:http, server
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] SSL協議的版本
Syntax:ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
Default:ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
Context:http, server
ssl_session_cache off | none | [builtin[:size]] [shared:name:size] 指明ssl會話的快取機制
Syntax:ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
Default:ssl_session_cache none;
Context:http, server
builtin:使用openssl內建的快取機制,此為各worker獨有;
shared:由各worker共享的快取;
name:快取空間的名稱;
size:位元組為單位的快取空間的大小;每1MB記憶體空間可快取4000個會話
ssl_session_timeout time ssl會話超時時長,指ssl session cache中快取條目有效時長
Syntax:ssl_session_timeout time;
Default:ssl_session_timeout 5m;
Context:http, server
示例:
配置檔案:證照使用方式請檢視我的另外一篇部落格。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# vim /etc/nginx/nginx.conf server { listen 443 ssl; server_name www.ops.com; ssl_certificate /usr/local/nginx/ssl/nginx.crt; ssl_certificate_key /usr/local/nginx/ssl/nginx.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; location / { root html; index index.html index.htm; } } # nginx -s reload |
訪問檢視:
4、Module ngx_http_referer_module
valid_referers none | blocked | server_names | string …
referers:定義合法的資料,此模組用來定義哪些內容是合法的
Syntax:valid_referers none | blocked | server_names | string …;
Default:—
Context:server, location
none表示請求報文首部沒有referer首部
blocked表示請求報文的referer首部沒有值
server_names表示其值是主機名
示例: 表示根據上面的定義,如果不合法就返回403
1 2 3 4 5 6 |
valid_referers none blocked server_names *.zx.com zx.* www.zx.org/galleries/ ~\.google\.; if ($invalid_referer) { return 403; } |
5、Module ngx_http_stub_status_module
status_module:用於輸出nginx的基本狀態資訊
示例:
1 2 3 4 |
# vim /etc/nginx/nginx.conf location /status { stub_status on; } |
訪問並測試:
各引數的意義:
- Active connection:活躍連線數
- accepts:已經接受的客戶端請求的總數量
- handled:已經處理的數量
- request:客戶端發來的總請求數量
- Reading:處於讀取客戶端請求報文首部的連線數
- Writing:處於向客戶端傳送響應報文過程的連線數
- Waiting:處於等待客戶端發出請求的空閒請求連線數