先來一波官方站點關於nginx介紹。nginx相關歷史這裏再也不贅述啦。php
nginx 是免費,開源,高性能 HTTP 服務器和反向代理服務器,也可做爲IMAP/POP3代理服務器。nginx以它的高性能,穩定性,豐富的特徵設定,配置簡單和資源消耗低而著稱。html
nginx是爲數很少能夠解決C10K問題的服務器。不像傳統服務器,nginx不依賴線程處理請求。它使用的是更爲高明事件驅動(異步)架構。在高負荷下,也能保持低消耗,更重要的是可預估的內存佔用量。若是你不指望去解決上千的併發請求難題,你也能夠從nginx的高性能,低消耗而嚐到好處。nginx應用規模可大可小:小至 VPS,大至組建服務器集羣。node
nginx爲何是高性能,低消耗的,可解決高併發問題 linux
首先是master/worker二層架構,master負責加載配置文件、管理worker進程、平滑升級;worker負責 處理請求。並且是基於事件驅動模型設計的處理模型,這使得nginx
worker數量和cpu核心數至關便可,可是一個worker進程能夠同時處理多個請求,在高併發訪問的狀況下使用較少的資源從容應對。web
簡單來說,異步非阻塞,事件驅動機制是其核心特徵。正則表達式
同時nginx擁有一套緩存機制,能夠進一步下降網絡壓力,加速用戶響應。算法
模塊化設計 瀏覽器
nginx整體設計理念秉承模塊化設計思想,把各功能細分模塊進行開發,實現靈活地裝卸載所需模塊,方便後續功能拓展。緩存
nginx模塊 分爲五類
1)核心模塊
2)標準http模塊
3)可選http模塊
4)mail模塊
5)第三方模塊
rpm包,官方預製,下載地址: http://nginx.org/packages
主配置文件:nginx.conf今後處爲入口,開始你的nginx配置吧。主配置文件中,使用include命令引用分支配置文件。
nginx配置風格爲劃地而治,要嚴格按照模塊爲區域進行配置
配置結構以下:
事件驅動相關的配置;
}
http/https 協議相關的配置段;
mail相關模塊
}
tcp/udp 傳輸層負載均衡配置段;
再來說講配置語法
directive value...; #語法格式
內建變量傳送門:http://nginx.org/en/docs/varindex.html 數量繁多,用起來也是很是方便滴,想用什麼變量,來這裏查查。
主配置段
一、定義進程用戶,用戶組
user username usergroup;
默認爲nobody。 指定一個系統用戶。
二、定義主程序pid文件路徑
pid /PATH/TO/PID_FILE;
三、 引入分支配置文件
include file;
~ include conf.d/*.conf ####「~」在本文中表示配置實例語句####
四、裝載動態模塊
load_modulefile;
~ load_module modules/ngx_mail_module.so;
五、error 日誌
error_logfile[level]
~ error_log logs/error.log info
主配置段中,性能調優的指令
一、指定worker數量
worker_processes number | auto;
數量最宜和cpu核心數相同。
二、綁定worker與cpu核心對應關係
worker_cpu_affinity auto | cpumask;
若是不設置此項,worker會在不一樣的工做內核上切換,這會形成沒必要要的開銷,將它們固定起來就好,通常設置爲auto便可。
worker_cpu_affinity0001 0010 0100 1000 #指定cpumask例子
三、指定worker進程的nice值 範圍[-20,20]
worker_priority number;
四、設置worker打開文件數量限制
worker_rlimit_nofile number;
~ worker_rlimit_nofile 2390251
固然系統內核參數要改大,sysctl -w fs.file-max=2390251;sysctl -p
一、每一個worker進程所可以打開的最大併發鏈接數數量;
worker_connections number;
~ worker_connections 65535; #通常設置爲65535,最大端口數量
use method;
accept_mutex on | off;
四、多路接收
multi_accept on|off;
on表示一個worker同時接受盡量多的請求。建議開啓
使用server指令配置虛擬主機,通常格式以下:
server {
listen address[:PORT]|PORT;
server_name SERVER_NAME;
root /PATH/TO/DOCUMENT_ROOT;
}
1.1 listen 指令
配置監聽地址,端口指令
有三種形式:
1) listen address[:port] [args..];
監聽在指定IP,指定端口;當端口省略時,監聽全部端口
2) listen port [args...];
監聽主機全部IP的80端口
3) listen unix:path [args...];
監聽unix socket,一種本機內部通訊IPC機制,非重點。
-----介紹上面[args] 內容:
listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]
default_server: 標識符,表示此虛擬主機爲address:port 的默認主機
ssl:標識符,虛擬主機使用https協議通訊時,標識此項
backlog=number:設置容許同時最大網絡監聽鏈接處於掛起狀態的個數,默認爲511
rcvbuf=size:設置監聽socket接收緩衝區大小
sndbuf=size:設置監聽socket發送緩衝區大小
-----小結:
通常listen 指令無需太過複雜
~ listen 10.1.0.1:8080 default_server backlog=1024
~ listen 8080;
1.2 server_name 指令
使用server_name 指令配置基於名稱或基於IP的虛擬主機
1)基於名稱的虛擬主機
格式: server_name name... 容許跟多個名稱,空格符分隔
------name支持glob通配符*
*能夠出如今三段式名稱中的首段或尾段;以及兩段式名稱中的尾段
server_name *.cutemsyu.com www.cutemsyu.* cutemsyu.*;
------name支持正則表達式~
以~起始表示正則表達式標記
server_name ~^www\d+\.cutemsyu\.com$
其中\d表明數字0-9,像這樣的表達式可匹配www1.cutemsyu.com,www2.cutemsyu.com 等等
拓展:nginx 支持name 正則表達式字符捕捉功能
server_name ~^([^.]+)\.cutemsyu\.com$
如此定義,當該表示式匹配www.cutemsyu.com 名稱時,在server塊中可以使用$1 表示 www 字符串
-----關於一個名稱被多個表達式匹配的問題
若是一個主機配置多個虛擬主機,則有可能發生此種狀況
nginx有以下server_name 匹配規定:
對於一個名稱匹配多個表達式狀況,按如下規則處理,排在前面優先級高
1.準確匹配
2.左側*通配符
3.右側*通配符
4.正則表達式
若是被同一級別的多個表達式匹配,則按第一個匹配的表達式處理
2)基於IP的虛擬主機
用法: server_name IP;
1.3 配置請求根目錄指令:root
root指令定義根路徑目錄,可定義在http,server,location塊;
語法:root path;
web服務器接收到請求後,首先在根目錄下尋找資源。後面會介紹location塊,root在location用到的狀況比較多。
用法:
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
應用在server塊中,或在location塊中嵌套使用。
在一個server中location配置段可存在多個,用於實現從uri到文件系統的路徑映射;ngnix會根據用戶請求的URI來檢查定義的全部location,並找出一個最佳匹配,然後應用其配置;
uri部分方便下面敘述,稱不含正則表達式的uri爲標準uri;反之,含有正則的uri稱爲正則uri,並且正則uri 前必須使用~或~*。同時支持正則字符串捕捉,使用$1等應用。
[ = | ~ | ~* | ^~ ] 這部分符號是具備特殊定義的符號,表示特定含義,可省略。
server接收到一個請求uri後,先與全部標準uri進行匹配,並記錄匹配度最高的一個。而後按序與正則uri進行匹配,匹配到第一個正則uri後,當即按相應location塊處理。若是全部正則匹配失敗,則應用以前記錄的標準uri對應的location塊進行處理。
1) = 使用在標準uri前,表示精準匹配,若是請求uri與此對應,則該請求當即由該location塊進行處理,再也不與正則uri匹配。
2) ~ 使用在正則uri前,而且區分大小寫字母
3) ~* 使用在正則uri前,不區分大小寫字母
4) ^~ 使用在標準uri前,要求與標準uri匹配,找到匹配度最高的一個後不進行與正則uri匹配
如,對於"/" 的請求較多的話,使用如下定義
location = / {
....
}
則能實現快速匹配。
看一看nginx官方文檔給出的例子:
location = / { [ configuration A ] } location / { [ configuration B ] } location /documents/ { [ configuration C ] } location ^~ /images/ { [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { [ configuration E ] }
請求URI 應用的location配置
/ configuration A
/index.html configuration B
/documents/document.html configuration C
/images/1.gif configuration D
/documents/1.jpg configuration E
至於@name 形式的location,是用來處理重定向類型的請求。在try_files 指令中會提到。
3.1 路徑別名 alias
用法: alias path;
定義路徑別名,文檔映射的另外一種機制;僅能用於location上下文。
與root 指令容易混淆。參考下面示例
location /data {
alias /documents/www;
}
請求uri爲/data/index.html,則nginx服務器將在路徑 /documents/www 下尋找index.html 文件。
3.2 設置網站默認首頁
做用是用戶不需輸入完整的uri來訪問默認主頁
用法: index filename... ;
可設置多個默認網頁,若是前一個頁面文件不存在則顯示下一頁面文件,以此類推。
3.3 錯誤頁面重定向
用法:error_page code ... [=[response]] uri|path;
當客戶端訪問遇到問題時,nginx支持自定義錯誤頁面顯示,並返回一個指定狀態碼,若是指定的話。
做用域爲 http,server,location 。具備在子域有效的特徵。
Example:
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
此示例跳轉的資源使用相對路徑方式,意味着從定義的根路徑下查找文件。
Example:
error_page 404 =200 /empty.gif;
此示例指定轉換的狀態碼。
Example:
error_page 404 = /404.php;
若是響應的錯誤狀態碼來自代理服務器,或者FastCGI/uwsgi/SCGI 服務器,應使用該示例方式返回代理服務器返回的狀態碼。
Example:
error_page 403 http://example.com/forbidden.html;
error_page 404 =301 http://example.com/notfound.html;
該示例重定向爲一個指定uri。此種狀況重定向的狀態碼爲302。可修改成 301,302,303,307。
3.4 嘗試查找文件
用法: try_files file ... uri;
try_files file ... =code;
按順序檢查文件,若是都不存在,則定向最後一個參數。最後一個參數若是是文件則必須存在;能夠是狀態碼;內部重定向。
example:
location /images/ { try_files $uri /images/default.gif; }
location / { try_files $uri $uri/index.html $uri.html =404; }
example:重定向型
location / {
try_files $uri $uri/ @wordpress;
}
location ~ \.php$ {
try_files $uri @wordpress; #這裏使用重定向,若是請求的資源頁不在會自動跳轉@wordpress塊中的index.php。若是使用uri的話,不會顯示動態資源頁面。
fastcgi_pass ...;
fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;
... other fastcgi_param's
}
location @wordpress {
fastcgi_pass ...;
fastcgi_param SCRIPT_FILENAME /path/to/index.php;
... other fastcgi_param's
}
做用域:http
, server
, location
4.1 tcp_nodelay on | off;
在keepalived模式下的鏈接是否啓用TCP_NODELAY選項;默認開啓;建議開啓
4.2 sendfile on|off;
是否開啓sendfile 特性,減小數據在內核與用戶空間之間的copy次數。建議開啓。詳見標題6內容
4.3 sendfile_max_chunk size;
worker process 每次調用sendfile() 傳輸數據的最大值,減小一次調用sendfile()最大阻塞時長,0爲不限制,建議設置128K
做用域:http
, server
, location
5.1 keepalive_timeout timeout [header_timeout];
設定保持鏈接的超時時長,0表示禁止長鏈接;默認爲75s;header_timeout 可選項,在應答報文首部中表示keepalive超時時間
5.2 keepalive_requests number;
在一次長鏈接上所容許請求的資源的最大數量,默認爲100;
5.3 keepalive_disable none | browser ...;
對哪一種瀏覽器禁用長鏈接;
5.4 send_timeout time;
向客戶端發送響應報文的超時時長,此處,是指兩次寫操做之間的間隔時長;若是客戶端在規定時長內無任何活動則關閉鏈接
send_timeout 10s;
5.5 client_header_buffer_size size
;
設置客戶端請求報文首部緩衝區大小,默認值爲1K。有時客戶端請求首部帶有cookie很大的信息,會形成400錯誤,強烈建議增大大小
大小設置爲系統分頁大小,命令 getconf PAGESIZE 可查看
通常設置爲 client_header_buffer_size 4K;
5.6 client_body_buffer_size size;
用於接收客戶端請求報文的body部分的緩衝區大小;默認爲16k;超出此大小時,其將被暫存到磁盤上的由client_body_temp_path指令所定義的位置;
5.7 client_body_temp_path path [level1 [level2 [level3]]];
設定用於存儲客戶端請求報文的body部分的臨時存儲路徑及子目錄結構和數量;16進制的數字;
client_body_temp_path path /var/tmp/client_body 1 2 2 #可定義在高性能磁盤分區上
做用域:http
, server
, location
6.1 aio on | off | threads[=pool];
是否啓用aio功能;
6.2 directio size | off;
在Linux主機啓用O_DIRECT標記,此處意味文件大於等於給定的大小時使用,例如directio 4m;
6.3 directio_alignment size
;
爲directio設置 alignment 大小,默認512字節,通常不用調整。可是xfs 文件系統須要增大至4k。
--------這裏花必定篇幅講講aio,directio,和sendfile之間的關係-------
首先aio和sendfile是互相排斥的。啓用aio,必須也啓用directio,否則的話read()將成爲阻塞。
sendfile適合小文件,佔用的是系統緩存。當傳輸大文件時,並且系統內存不夠大的狀況,使用sendfile()將較不適宜。此時應使用aio機制。
推薦的一個配置示例:文件小於8M,使用sendfile,大於或等於8M使用aio
location /video/ { sendfile on;
sendfiel_max_chunk 256K; aio on; directio 8m;
output_buffers 1 128k;}
特別地,在大文件傳輸較多的狀況下,適宜啓用aio threads 。nginx編譯須要--with-threads 選項
location /video/ {
sendfile on;
sendfiel_max_chunk 256K; aio threads; #這裏使用默認的線程池,可自行建立。 directio 8m;
output_buffers 1 128k;}
6.4 open_file_cache off;
open_file_cache max=N [inactive=time];
nginx能夠緩存如下三種信息:
(1) 文件的描述符、文件大小和最近一次的修改時間;
(2) 打開的目錄結構;
(3) 沒有找到的或者沒有權限訪問的文件的相關信息;
max=N:可緩存的緩存項上限;達到上限後會使用LRU算法實現緩存管理;
inactive=time:緩存項的非活動時長,在此處指定的時長內未被命中的或命中的次數少於open_file_cache_min_users指令所指定的次數的緩存項即爲非活動項;
6.5 open_file_cache_valid time;
緩存項有效性的檢查頻率;默認爲60s;
6.6 open_file_cache_min_uses number;
在open_file_cache指令的inactive參數指定的時長內,至少應該被命中多少次方可被歸類爲活動項;
6.7 open_file_cache_errors on | off;
是否緩存查找時發生錯誤的文件一類的信息;
Example:
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
本篇就介紹到這裏,nginx餘下內容請關注後續博客。