製做人:全心全意javascript
Select:Linux實現對應,I/O複用模型,BSD4.2最先實現css
Poll:Linux實現,對應I/O複用模型,System V unix最先實現html
Epoll:Linux實現,對應I/O複用模型,具備信號驅動I/O模型的某些特性java
select | poll | epoll | |
操做方式 | 遍歷 | 遍歷 | 回調 |
底層實現 | 數組 | 鏈表 | 哈希表 |
IO效率 | 每次調用進行線性遍歷,時間複雜度O(n) | 每次調用進行線性遍歷,時間複雜度O(n) | 事件通知方式,每當fd就緒,系統註冊的回調函數就會被調用,時間複雜度O(1) |
最大鏈接數 | 1024(x86)或2048(x64) | 無上限 | 無上限 |
fd拷貝 | 每次調用select,都須要將fd集合從用戶態拷貝到內核 | 每次調用poll,都須要將fd集合從用戶態拷貝到內核 | 調用時拷貝進內核並保存,以後每次epoll_wait不拷貝 |
說明:node
在Linux2.6內核中提出的select和poll的加強版本nginx
支持水平觸發LT和邊緣觸發ET,最大的特色在於邊緣觸發,它只告訴進程哪些fd剛剛變爲就緒態,而且只會通知一次web
使用」事件「的就緒通知方式,經過epoll_ctl註冊fd,一旦該fd就緒,內核就會採用相似callback的回調機制來激活該fd,epoll_wait即可以收到通知正則表達式
優勢:算法
沒有最大併發鏈接的限制:能打開的FD的上限遠大於1024(1G的內存能監聽約10萬個端口)後端
效率提高:非輪詢方式,不會隨着FD數目的增長而效率下降;只有活躍可用的FD纔會調用callback函數,即epoll最大的優勢就在於它只管理」活躍「的鏈接,而跟鏈接總數無關
內存拷貝:利用mmap加速與內核空間的消息傳遞;即epoll使用mmap減小複製開銷
master/worker結構
一個master進程:負責加載和分析配置文件、管理worker進程、平滑升級
一個或多個worker進程:處理並響應用戶請求
緩存相關的進程:
cache loader:裝載緩存對象
cache manager:管理緩存對象
nginx高度模塊化,但其模塊早期不支持DSO機制;1.9.11版本支持動態裝載和卸載
模塊的分類:
核心模塊:core module
標準模塊:
HTTP模塊:ngx_http_*
HTTP Core modules 默認功能
HTTP Optional modules 需編譯時指定
Mail模塊:ngx_mail_*
Stream模塊:ngx_stream_*
第三方模塊
命令語法: nginx [-?hqTtVv] [-c file] [-g directives] [-p prefix] [-s signal] 選項: -?,-h 查看幫助 -c file 指定配置文件(默認:/etc/nginx/nginx.conf) -v 顯示版本和編譯語法並退出 -t 檢查配置文件語法 -T 檢查配置文件語法並輸出配置文件 -q 在檢查配置文件時,不顯示非錯誤信息 -s signal 發送信號(stop中止、quit退出、reopen重啓、reload加載配置文件) -p prefix 指定工做目錄路徑(默認:/usr/share/nginx) -g directives 指定全局參數和附加配置文件
main block:主配置段,即全局配置段,對http,mail都生效 event{ ... } 事件驅動相關配置 http { ... } http/https協議相關配置段 mail { ... } mail協議相關配置段 stream { ... } stream服務器相關配置段
http { ... 各server的公共配置 ... server { 每一個server用於定義一個虛擬主機 ... } server { ... server_name 虛擬主機名 root 主目錄 alias 路徑別名 location [OPENATOR] URL { 指定URL的特性 ... if CONDITION { } } } }
user:指定nginx(worker進程)的運行用戶,只能放在主配置段
pid:pid文件位置
include:指定包含進來的其餘配置文件路徑
load_module:加載模塊
性能相關
worker_processes:worker進程的數量;一般爲當前主機CPU的物理核心數,也可設置爲auto
worker_cpu_affinity:綁定一個worker進程一直在某一個cpu上運行(cpumask:0000000一、000000十、00000100,分別表明第零、1、二號CPU)
worker_priority:指定worker進程優先級,範圍是[-20,20],默認爲0
worker_rlimit_nofile:指定worker進程所可以打開的文件數量上限,如65535
調試和定位
daemon:是否以守護進程方式運行Nginx,默認是守護進程方式(後臺)on|off
master_process:是否以master/worker模型運行nginx;默認爲on,off將不啓動worker
error_log:指定錯誤日誌輸出位置
worker_connections:每一個worker進程支持多少個併發鏈接
use:指定併發鏈接請求的處理方法,默認自動選擇最優方法(epoll)
accept_mutex:處理新的鏈接請求的方法,on表示由各個worker輪流處理新請求,off表示每一個新請求的到達都會通知全部的worker進程,但只有一個進程能夠得到鏈接,形成「驚羣」,影響性能,默認爲off。
server(虛擬主機)中的配置
listen:指定監聽端口,可同時指定監聽主機名(IP/域名)
default_server:設定爲默認虛擬主機
ssl:限制僅可以經過ssl鏈接提供服務(https)
backlog=number:設置超過併發鏈接後,新請求隊列的長度
rcvbuf=size:設置接收緩衝區的大小
sndbuf=size:設置發送緩衝區的大小
server_name:指定網站名稱(網站域名)
支持通配字符*(如*.xinyi.com、www.xinyi.*)
支持正則表達式
root:指定網站家目錄
tcp_nodelay:在keepalived模式下的鏈接是否啓動RCP_NODELAY選項(on:不延遲發送,收到一個請求當即迴應一個請求,默認選項。off:延遲發送,合併多個請求後發送)
sendfile:默認爲off。爲on時,從磁盤中將數據拷貝到內核中封裝報文直接發送,不需在從內存中轉
server_tokens:是否在響應報文的Server頭部顯示nginx版本,可在http和server中設置(on|off)商業版可支持字符串
location
在一個server中location配置段可存在多個,用於實現從uri到文件系統的路徑映射;nginx會根據用戶請求的URI來檢查定義的全部location,並找出一個最佳匹配,然後應用其配置。該段可放在server中,也可嵌套在location中。
=:精確匹配
^~:對URI的最左邊部分作匹配檢查,不區分字符大小寫
~:對URI作正則表達式模式匹配,區分字符大小寫
~*:對URI作正則表達式模式匹配,不區分字符大小寫
不帶符號:匹配起始於此uri的全部uri
匹配優先級從高到低:=,^~,~/~*,不帶符號
server { root ... location ... { root ... } }
alias:路徑別名,文檔映射的另外一種機制;僅能用於location上下文。(與root的不一樣,例「/web」中路徑「/www/html」,訪問/web,使用root匹配html/web下的文件,而alias訪問的是html下的文件)
index:指定默認網頁文件。
error_page:定義響應狀態碼所對應的響應錯誤頁(例:error_page 404 /404.html),還能夠設置以200狀態碼響應錯誤頁面,防止被瀏覽器劫持錯誤頁面(例:error_page 404 =200 /404.html)
try_files:按順序檢查文件是否存在,返回按順序找到的第一個文件或文件夾,若是全部的文件或文件夾都找不到,會進行一個內部重定向到最後一個參數,只有最後一個參數能夠引發一個內部重定向,以前的參數只設置內部URI的指向。最後一個參數是回退URI且必須存在,不然會出現內部500錯誤。
location /images/ { try_files $uri /images/defautl.gif; } location / { try_files $uri $uri/index.html $uri.html =404; }
定義客戶端請求的相關配置
keepalive_timeout timeout [header_timeout]:設定保持鏈接超時時長,0表示禁止長鏈接,默認爲75S
keepalive_requests number:在一次長鏈接上容許請求資源的最大數量,默認爲100。
keepalive_disable none|browser...:對那種瀏覽器禁用長鏈接。
send_timeout time:向客戶端發送響應報文的超時時長,此外是指兩次寫操做之間的間隔時長,而非整個響應過程的傳輸時長。
client_body_buffer_size size:用於接收每一個客戶端請求報文的body部分的緩衝區大小,默認爲16k;超出此大小時,將其暫存到磁盤上,由client_body_temp_path指令所暫存的位置
client_body_temp_path path [level1 [level2 [level3]]]:設定存儲客戶端請求報文的body部分的臨時存儲路徑及子目錄結構和數量,目錄名爲16進制的數字。
client_body_temp_path /var/tmp/client_body 1 2 2 1 1級目錄佔1位16進制,即2^4=16個目錄0-f 2 2級目錄佔2位16進制,即2^8=256個目錄00-ff 2 3級目錄佔2位16進制,即2^8=256個目錄00-ff
對客戶端進行限制的相關配置
limit_rate rate:限制響應給客戶端的傳輸速率,單位是bytes/second,默認值爲0,表示無限制。(1000000 = 1M)
limit_except method ... {...}:僅用於location,限制客戶端使用除了指定的請求方法以外的其它方法(GET、HEAD、POST、PUT、DELETE、MKCOL、COPY、MOVE、OPTIONS、PROPFIND、PROPPATCH、LOCK、UNLOCK、PATCH)
limit_except GET { allow 192.168.1.0/24; deny all; } #除了GET和HEAD以外其它方法僅容許192.168.1.0/24網段主機使用
文件操做的優化配置
aio on|off|threads[=pool]:是否啓動aio功能
directio size|off:當文件大於給定大小時,例如directio 4m,同步(直接)寫磁盤,而非寫緩存
open_file_cache:緩存的設置
open_file_cache off # open_file_cache max=N [inactive=time] nginx能夠緩存如下三種信息: 文件元數據(文件的描述符,大小和最近一次修改的時間) 目錄結構 沒有找到的或者沒有權限訪問的文件的相關信息 max=N:可緩存的緩存項上線,達到上限後會使用LRU算法(最近,最少使用算法)實現管理 inative=time:緩存項的非活動時長,在此處指定的時長內未被命中的或命中次數少於open_file_cache_min_uses指令所指定的次數的緩存項即爲非活動項,將被刪除
open_file_cache_errors on|off:是否緩存查找時發生的錯誤的文件的一類的信息,默認值爲off
open_file_cache_min_uses number:在open_file_cache指令的inactive參數指定的時長內,至少被命中此處指定的次數,方可被歸類爲活動項。
open_file_cache_valid time:緩存項有效性的檢查頻率,默認值爲60S
實現基於ip的訪問控制功能
location / { deny 192.168.1.1; allow 172.16.1.0/24; allow 2001:0db8::/32 #ipv6地址 deny all; }
自上而下檢查,一旦匹配,當即生效。
實現基於用戶的訪問控制,使用basic機制進行用戶認證
auth_basic string|off
auth_basic_user_file file
location /admin/ { auth_basic "Admin Area"; auth_basic_user_file /etc/nginx/ngxpasswd; }
用戶口令文件格式:
明文文本:name:password:comment
加密文本:由htpasswd命令實現,httpd-tools所提供
輸出nginx的基本狀態信息
ngx_http_stub_status_module模塊
輸出信息示例:
Active connections:291 server accepts handled requests 123 123 123 Reading:6 Writing:179 Waiting:106
三個數字分別對應accepts,handled,requests三個值
Active connections: 當前狀態 ,活動狀態的鏈接數
accepts :統計總值 ,已經接受的客戶端請求的總數
handled :統計總值 ,已經處理完成的客戶端請求的總數
requests :統計總值 ,客戶端發來的總的請求數
Reading :當前狀態 ,正在讀取客戶端請求報文茵部的鏈接的鏈接數
Writing :當前狀態 ,正在向客戶端發送響應報文過程當中的鏈接數
Waiting :當前狀態 ,正在等待客戶端發出請求的空閒鏈接數
示例:
location /status { stub_status; allow 172.16.1.0/24; deny all; }
用gzip方法壓縮響應數據,節約寬帶
gzip on|off:啓用或禁用gzip壓縮
gzip_comp_level level:壓縮比由低到高1-9,默認爲1
gzip_min_length length:啓動壓縮功能的響應報文大小閾值,達到指定大小的進行壓縮。
gzip_http:version 1.0|1.1:設定壓縮協議,默認1.1
gzip_types:指明僅對哪些類型的資源執行壓縮操做,默認包含有「text/html」,不用指定,不然報錯。
gzip_vary on|off:若是啓用壓縮,是否在響應報文頭部插入「Vary:Accept-Encoding」
gzip_proxied:nginx爲代理服務器時,對於後端服務器的響應報文,在何種條件下啓用壓縮功能
示例:
gzip on; gzip_comp_level 6; gzip_min_length 64; gzip_proxied any; gzip_types text/xml text/css application/javascript;