nginx設計最初是爲了解決c10k問題做爲反向代理服務器,能夠反向代理http和smtp/pop3請求,可是很快就被一羣沒有get到重點的公司帶上了web服務器的不歸路,好比某寶就開發了tengine,使用Nginx做爲web服務器的緣由是Nginx做爲反向代理服務器須要緩存客戶端持久鏈接狀態,能夠緩衝大量圖片和視頻,當收到圖片視頻數據請求的時候直接從緩存中調取數據響應,緩存技術在Nginx上應用的淋漓盡致,後面Nginx配置時能夠發現大量的緩存緩衝配置指令基本上能夠緩存的都有具體的指令。Nginx不就在「彎路」上越作越遠,老本行反向代理也愈來愈強大通過一段時間的迭代如今的nginx能夠代理大多數的tcp/udp協議,好比mysql,dns。html
# 目錄node
* 一 io模型mysql
* 二 文件結構nginx
* 三 配置文件內容程序員
1mainweb
2套接字配置正則表達式
3路徑配置算法
4請求控制sql
5客戶端限制編程
6文件操做
# 一 i/o模型
瞭解io模型咱們才能夠區分出Nginx和Apache的區別,才能夠知道如日中天的Apache如何走向低谷。什麼是io模型,它是怎麼產生的?
它的產生是由於一次web請求,計算機內部須要調用各類資源,然而各類資源有調用順序和獲取速度的差別,因爲這些差別致使某些處理已經完成,可是它須要另一個速度慢的資源的數據。這就產生一個進程等待另外一個進程的狀況,這時這兩個進程的通訊的方式就是i/o模型。一個進程等待另外一個進程,還有一種狀況和編程裏的函數調用相似。
## 同步/異步
它的意思是調用者怎麼獲取另外一個進程的處理狀態狀況。
同步的意思是本身什麼事情都不作等着另外一個進程通知它發送數據
異步的意思是本身每一個一段時間就去另外一個進程那裏獲取一下處理狀態
## 阻塞/非阻塞
它的意思是調用者在調用後本身的狀態
阻塞是調用後就再也不處理數據,只接收被調用者的信息
非阻塞是調用後還處理數據,不只接收別調用者的信息
## 五種i/o模型
阻塞型,非阻塞型,複用型,信號驅動,異步
這裏先統一一個概念,咱們把一次i/o調用分爲兩個步驟:第一步是被調用獲取數據,第二步是被調用進程把數據傳輸給調用者
阻塞型,第一步的時候阻塞本身,並使用同步的方式接收通知,第二步阻塞本身並接收被調用者發送的數據
非阻塞型,第一步不阻塞本身能夠接收數據,而且一次次的向被調用請求處理狀態,第二步阻塞本身並接收被調用者發送的數據
複用型,第一步阻塞本身,可是同時調用多個進程獲取多分數據,第二步阻塞本身並接收被調用者發送的數據
信號驅動,第一步不阻塞本身,一旦收到被調用者的信號就進入第二步,第二步阻塞本身並接收被調用者發送的數據
異步,第一步不阻塞本身,一旦收到被調用者的信號就直接使用數據,第二步不阻塞本身,數據由被調用者直接寫到調用者的內存中
# 二 文件結構
程序,配置文件,日誌滾動配置
## 程序文件
使用rpm包安裝的
對應的nginx命令可使用的參數
#不加任何參數,啓動Nginx
-t #檢查配置文件的語法
-s #Nginx傳遞一個參數,經常使用的reload,stop,restart
## 配置文件
主配置文件/etc/nginx/nginx.conf
主要是配置main block和http,main block是配置Nginx進程的基本配置,http配置和http相關的屬性
模塊化的配置文件/etc/nginx/conf.d/,主要是配置各虛擬主機server
日誌滾動配置,這個是防止日誌文件過大設置的位置
# 三 主配置文件和模塊配置文件內容
## 事件驅動
main block除了對Nginx進程的配置還有對事件的配置,這也是Nginx能夠支持c10k的根本。事件機制採用一個進程響應多個請求,可是和線程不一樣。
在多線程版本中,這3個任務分別在獨立的線程中執行。這些線程由操做系統來管理,在多處理器系統上能夠並行處理,或者在單處理器系統上交錯執行。這使得當某個線程阻塞在某個資源的同時其餘線程得以繼續執行。與完成相似功能的同步程序相比,這種方式更有效率,但程序員必須寫代碼來保護共享資源,防止其被多個線程同時訪問。多線程程序更加難以推斷,由於這類程序不得不經過線程同步機制如鎖、可重入函數、線程局部存儲或者其餘機制來處理線程安全問題,若是實現不當就會致使出現微妙且使人痛不欲生的bug。
在事件驅動版本的程序中,3個任務交錯執行,但仍然在一個單獨的線程控制中。當處理I/O或者其餘昂貴的操做時,註冊一個回調到事件循環中,而後當I/O操做完成時繼續執行。回調描述了該如何處理某個事件。事件循環輪詢全部的事件,當事件到來時將它們分配給等待處理事件的回調函數。這種方式讓程序儘量的得以執行而不須要用到額外的線程。事件驅動型程序比多線程程序更容易推斷出行爲,由於程序員不須要關心線程安全問題。
## main配置段常見的配置指令:
分類:
正常運行必備的配置
優化性能相關的配置
用於調試及定位問題相關的配置
事件驅動相關的配置
### 正常運行必備的配置
一、user #指定運行worker進程的用戶和組
Syntax: user user [group]
Default: user nobody nobody
二、pid /PATH/TO/PID_FILE; #指定存儲nginx主進程進程號碼的文件路徑
三、include file | mask; #指明包含進來的其它配置文件片段
四、load_module file; #指明要裝載的動態模塊
### 性能優化相關的配置
一、worker_processes number | auto; #worker進程的數量;一般應該爲當前主機的cpu的物理核心數
二、worker_cpu_affinity cpumask ...; #worker_cpu_affinity auto [cpumask]
CPU MASK:
00000001:0號CPU
00000010:1號CPU
... ...
三、worker_priority number; #指定worker進程的nice值,設定worker進程優先級;[-20,20]
四、worker_rlimit_nofile number; #worker進程所可以打開的文件數量上限
調試、定位問題:
一、daemon on|off; #是否以守護進程方式運行Nignx
二、master_process on|off; #是否以master/worker模型運行nginx;默認爲on
三、error_log file [level]; #錯誤日誌級別
### 事件驅動相關的配置:
events {
...
}
一、worker_connections number; #每一個worker進程所可以打開的最大併發鏈接數數量
二、use method; #指明併發鏈接請求的處理方法;#經常使用方法epoll
三、accept_mutex on | off; #處理新的鏈接請求的方法;on意味着由各worker輪流處理新請求,Off意味着每一個新請求的到達都會通知全部的worker進程
## 與套接字相關的配置
一、server { ... }
配置一個虛擬主機;
server {
listen address[:PORT]|PORT;
server_name SERVER_NAME;
root /PATH/TO/DOCUMENT_ROOT;
}
二、listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE
listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]
default_server:設定爲默認虛擬主機;
ssl:限制僅可以經過ssl鏈接提供服務;
backlog=number:後援隊列長度;
rcvbuf=size:接收緩衝區大小;
sndbuf=size:發送緩衝區大小;
三、server_name name ...;
指明虛擬主機的主機名稱;後可跟多個由空白字符分隔的字符串;
支持*通配任意長度的任意字符;server_name *.magedu.com www.magedu.*
支持~起始的字符作正則表達式模式匹配;server_name ~^www\d+\.magedu\.com$
匹配機制:
(1) 首先是字符串精確匹配;
(2) 左側*通配符;
(3) 右側*通配符;
(4) 正則表達式;
四、tcp_nodelay on | off;
在keepalived模式下的鏈接是否啓用TCP_NODELAY選項;
五、sendfile on | off;
是否啓用sendfile功能;
## 定義路徑相關的配置:
六、root path;
設置web資源路徑映射;用於指明用戶請求的url所對應的本地文件系統上的文檔所在目錄路徑;可用的位置:http, server, location, if in location;
七、location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
在一個server中location配置段可存在多個,用於實現從uri到文件系統的路徑映射;ngnix會根據用戶請求的URI來檢查定義的全部location,並找出一個最佳匹配,然後應用其配置;
=:對URI作精確匹配;例如, http://www.magedu.com/, http://www.magedu.com/index.html
location = / {
...
}
~:對URI作正則表達式模式匹配,區分字符大小寫;
~*:對URI作正則表達式模式匹配,不區分字符大小寫;
^~:對URI的左半部分作匹配檢查,不區分字符大小寫;
不帶符號:匹配起始於此uri的全部的url;
匹配優先級:=, ^~, ~/~*,不帶符號;
root /vhosts/www/htdocs/
http://www.magedu.com/index.html --> /vhosts/www/htdocs/index.html
server {
root /vhosts/www/htdocs/
location /admin/ {
root /webapps/app1/data/
}
}
八、alias path;
定義路徑別名,文檔映射的另外一種機制;僅能用於location上下文;
注意:location中使用root指令和alias指令的意義不一樣;
(a) root,給定的路徑對應於location中的/uri/左側的/;
(b) alias,給定的路徑對應於location中的/uri/右側的/;
九、index file ...;
默認資源;http, server, location;
十、error_page code ... [=[response]] uri;
Defines the URI that will be shown for the specified errors.
十一、try_files file ... uri;
## 定義客戶端請求的相關配置
十二、keepalive_timeout timeout [header_timeout];
設定保持鏈接的超時時長,0表示禁止長鏈接;默認爲75s;
1三、keepalive_requests number;
在一次長鏈接上所容許請求的資源的最大數量,默認爲100;
1四、keepalive_disable none | browser ...;
對哪一種瀏覽器禁用長鏈接;
1五、send_timeout time;
向客戶端發送響應報文的超時時長,此處,是指兩次寫操做之間的間隔時長;
1六、client_body_buffer_size size;
用於接收客戶端請求報文的body部分的緩衝區大小;默認爲16k;超出此大小時,其將被暫存到磁盤上的由client_body_temp_path指令所定義的位置;
1七、client_body_temp_path path [level1 [level2 [level3]]];
設定用於存儲客戶端請求報文的body部分的臨時存儲路徑及子目錄結構和數量;
16進制的數字;
client_body_temp_path path /var/tmp/client_body 1 2 2
## 對客戶端進行限制的相關配置:
1八、limit_rate rate;
限制響應給客戶端的傳輸速率,單位是bytes/second,0表示無限制;
1九、limit_except method ... { ... }
限制對指定的請求方法以外的其它方法的使用客戶端;
limit_except GET {
allow 192.168.1.0/24;
deny all;
}
## 文件操做優化的配置
20、aio on | off | threads[=pool];
是否啓用aio功能;
2一、directio size | off;
在Linux主機啓用O_DIRECT標記,此處意味文件大於等於給定的大小時使用,例如directio 4m;
2二、open_file_cache off;
open_file_cache max=N [inactive=time];
nginx能夠緩存如下三種信息:
(1) 文件的描述符、文件大小和最近一次的修改時間;
(2) 打開的目錄結構;
(3) 沒有找到的或者沒有權限訪問的文件的相關信息;
max=N:可緩存的緩存項上限;達到上限後會使用LRU算法實現緩存管理;
inactive=time:緩存項的非活動時長,在此處指定的時長內未被命中的或命中的次數少於open_file_cache_min_uses指令所指定的次數的緩存項即爲非活動項;
2三、open_file_cache_valid time;
緩存項有效性的檢查頻率;默認爲60s;
2四、open_file_cache_min_uses number;
在open_file_cache指令的inactive參數指定的時長內,至少應該被命中多少次方可被歸類爲活動項;
2五、open_file_cache_errors on | off;
是否緩存查找時發生錯誤的文件一類的信息;
# 總結
配置指令特別複雜,重點是記住原理,而且都是重點,Nginx是伴隨咱們一輩子的工具,慢慢了解就好。而且這裏只介紹了最基本http核心模塊的使用,還有大量模塊沒有介紹,而且比這裏的內容還要重要。我不介紹了:)