Tengine 常用模組使用介紹

JamesXin發表於2016-05-20

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、Main端配置

約定:

大部分模組使用方式,tengine與nginx相同,nginx模組使用可以參照nginx的官方站點,tengine。

Syntax: 表示功能或者選項,其後面有語法

Default:    預設值

Context:    可出現的上下文

參考文獻:http://tengine.taobao.org/documentation.html

參考文獻:http://nginx.org/en/docs/

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

例子:

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]

錯誤日誌記錄方式,及其日誌級別

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:

2、location [ = | ~ | ~* | ^~ ] uri { … }

Syntax: location [ = | ~ | ~* | ^~ ] uri { … }
location @name { … }
Default:    —
Context:    server, location

根據使用者請求的URI來匹配定義的location,匹配到時,此請求將被相應的location塊中的指令所處理;
=:URI精確匹配;
~:做正規表示式模式匹配,區分字元大小寫;
~*:做正規表示式模式匹配,不區分字元大小寫;
^~:對URI的左半部分做匹配檢查,不區分字元大小寫;

匹配優先順序:=、^~、~/~*、不帶符號;

For example:

2、alias path 定義路徑別名

Syntax: alias path;
Default:    —
Context:    location

For example:

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:

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 示例:

測試效果:

wKioL1czKFqxORRUAAA5KRdBvbU531.png

if (condition) { … } 示例

wKioL1czKvjjnGDGABYJrAOvjVw840.gif

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選項

wKioL1czLwKi3cq4AAG_cROXyVA225.png

配置之後:檢視Response Headers報文中是否有gzip選項

wKiom1czLtbz0qDVAAGwfV3fsvc931.png

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:

儲存格式:

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

測試示例:

啟用前檢視:/var/data/nginx/cache目錄

wKiom1czU4nRW19wAAASbCCj9K4054.png

啟動後檢視:/var/data/nginx/cache目錄

wKioL1czVJGAf4lcAACs8RKFqkE993.png

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

示例:

配置檔案:證照使用方式請檢視我的另外一篇部落格

訪問檢視:

wKioL1c15r-Rw4JJAADnEaKmyfs210.png

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

5、Module ngx_http_stub_status_module

status_module:用於輸出nginx的基本狀態資訊

示例:

訪問並測試:

wKiom1c17NrCdD7wAAA-n7T42tQ400.png

各引數的意義:

  • Active connection:活躍連線數
  • accepts:已經接受的客戶端請求的總數量
  • handled:已經處理的數量
  • request:客戶端發來的總請求數量
  • Reading:處於讀取客戶端請求報文首部的連線數
  • Writing:處於向客戶端傳送響應報文過程的連線數
  • Waiting:處於等待客戶端發出請求的空閒請求連線數

相關文章