一、簡介
Nginx (讀作"engine X") 由Igor Sysoev(俄羅斯)於2005年編寫,是一個免費、開源、高性能的HTTP服務器和反向代理,也可以作爲一個IMAP/POP3代理服務器。根據 Netcraft 的 March 2014 WebServer Survey, 現在全世界23%的網站使用Nginx,而Apache佔54.68%。Nginx因爲穩定,豐富的功能集,配置簡單,資源佔用低而聞名世界。
二、Nginx的特性和基礎架構
1、基本功能
實現與服務靜態文件(靜態資源的web服務器),能緩存打開的文件標書費
反向代理服務器,支持緩存、負載均衡、健康狀態檢測
支持FastCGI
模塊化機制,非DOS機制,支持多種過濾器,如gzip,ssl和用來完成圖形大小調整的圖像模塊
支持SSL
2.擴展功能
基於名稱和IP做虛擬主機
支持keepalive
支持平滑配置更新和程序版本升級
定製訪問日誌,支持使用日誌緩存以提高性能
支持URL rewrite
支持路徑別名
支持基於IP和用戶的認證
支持速率限制,併發數限制等
3.nginx的基本架構
一個master,生成一個或多個worker
事件驅動:kqueue,epoll,/dev/poll
消息通知:select poll rt rignals
支持sendfile,sendfile64
支持mmap
三、nginx的配置文件詳解
配置參數需要以分號結尾,語法格式如下
參數名 值1 [值2....];
配置參數中還支持使用變量
支持使用模塊內置變量
用戶自定義變量:set var_name value
Nginx基本核心配置的類別
用於調試、定位問題
正常運行的必備配置
優化性能的配置
事件類的配置
1.正常運行的必備配置
①、user username[groupname]
以那個用戶身份運行,可以在配置文件中指定,如果沒有指定則以編譯時的用戶爲運行用戶
②、pid/path/to/pidfile_name
指定nginx的pid文件
③、worker_rlimit_nofile#
指定一個worker進程所能打開的最大句柄數
④、worker_rlimit_sigpending#
設定每個用戶能夠發往worker進程的信息的數量
2.優化性能相關的配置
①、worker_procrsses #
worker進程的個數,通常其數值應該爲cpu的物理核心數減1或2
②、worker_cpu_affinitycpumask .....
用來綁定cpu的,比如
worker_processes 4;
worker_cpu_affinity 0001 00100100 1000;
③、ssl_engine device
在存在ssl硬件加速器的服務器上,指定所使用的ssl硬件加速設備
④、timer_resolution t
每次內核事件調用返回時,都會使用gettimeday()來更新nginx緩存時鐘,timer_resloution用來定義每隔多久纔會由gettimeday()更新一次緩存時鐘,x86-64系統上,gettimeday()代價已經很小,可以忽略此配置
⑤、worker_priority nice
-20到19之間的整數值,數值越小越優先被調用
3.跟事件相關的配置
①、accept_mutex on|off
是否打開nginx的負載均衡鎖,此鎖能夠讓多個worker輪流地、序列化的與新的客戶端請求建立連接;而通常當一個worker進程的負載達到其上限的7/8,master就儘可能不將請求掉地至此worker
②、lock_file /path/to/lock_file
鎖文件的位置
③、accept_mutex_delay #ms
使用accept鎖以後,只有一個worker能取得鎖,一個worker進程爲取得accept鎖的等待市場,即用戶建立等待的時間,如果某worker進程在某次試圖取得鎖時失敗了,則至少要等#ms才能再一次請求鎖
④、multi_accept on|off
是否允許一次性地響應多個用戶請求,默認爲off
⑤、use [epoll|rtsig|select|poll]
指定使用的模型,建議讓nginx自動選擇
⑥、worker_commections #
每個worker能夠併發響應的最大請求數,如果爲代理服務器的話,worker_rlimit_nofile=worker_commections*2
4.用於調試、定位問題:只在調試nginx時使用
①、daemon [on|off]
關閉提供守護進程的模式,是否讓nignx運行於後臺;調試時應該爲off,使得所有信息直接輸出在控制檯上,默認爲on
②、master_process on|off
是否已master/worker模式運行nginx,默認爲on,調試時可以設置爲off以方便追蹤
③、error_log /path/to/error_log level
錯誤日誌文件及其級別,調試時可以使用debug級別,但要求在編譯時必須使用--with-debug啓用debug功能,通常默認爲error級別
5.跟內存及磁盤資源分配相關
①、client_body_in_file_only on|clean|off
是否將請求包體存儲在磁盤中,不爲off時,即時包體爲0,也要存儲在硬盤上,如果爲on,請求結束後包體文件不會被刪除,clean表示刪除
②、client_body_in_single_buffer on|off
http的包體是否存儲在內存buffer當中,默認爲off
③、client_body_buffer_size
nginx接受http包體的內存緩存區大小
④、client_body_temp_path dir-path[level1[level2[level3]]]
定義http包體存放的臨時目錄,可以使用多級目錄,level用來指定某一級目錄的文件名的長度
client_body_temp_path /var/tmp/client 1 2
表示在/var/tmp/client創建16個一級子目錄,在每個一級子目錄創建256個二級子目錄來存放緩存
⑤、client_header_buffer_size size
正常情況下接受用戶請求的http報文header部分時分配的buffer大小,默認爲1k
⑥、large_client_header_buffers numbersize
存儲超大http請求首部的內存buffer大小及個數
⑦、connection_pool_size size
nginx對於每個建立成功的tcp連接都會預先分配一個內存池,此處機用於設定此內存池的初始大小,默認爲256
⑧、request_pool_size size
nginx對於每個處理每個請求時會預先分配一個內存池,此處機用於設定此內存池的初始大小,默認爲4K
四、nginx的http web功能
必須使用虛擬主機來配置站點,每個虛擬主機使用一個server{}段來定義,非虛擬主機的配置和公共選項,需要定義在server之外,http之內
1.server{}
定義一個虛擬主機:nginx支持使用基於主機名或ip的虛擬主機
2.listen
liseten address [:port]
liseten prot
listen unix:socket
default_server:定義此server爲http的默認的server,如果所有的server中任意沒有任何一個使用此參數,那麼第一個server爲默認server
rcvbuf=SIZE:接收緩衝大小
sndbuf=SIZE:發送緩衝大小
3.server_name[...]
server_name可以跟多個主機名,名稱可以使用通配符和正則表達式(通常以~開頭):當nginx收到一個請求時,會取出去首部的server的值,而後跟衆server_name進行比較:比較方式
(1)先做精確匹配
(2)左側通配符匹配
(3)右側通配符匹配
(4)正則表達式匹配
4.server_name_hash_bucket_size 32|64|128
爲了實現快速主機查找,nginx使用hash表來保存主機名
5.location [=|~ |~* |^~] uri { ... }
location @name { ... }
功能:允許根據用戶請求的URI來匹配指定的各location以進行訪問匹配;匹配到時,將被location塊中的配置所處理
== 精確匹配
~:正則表達式模式匹配,匹配時區分字符大小寫
~*:正則表達式模式匹配,匹配時忽略字符大小寫
^~:只需要前半部分與uri匹配即可,不檢查正則表達式
匹配優先級:
字符字面量最精確匹配、正則表達式索引(有多個匹配到時,由第一個匹配到的所處理)、安字符字面量
五、文件路徑定義
1.root path
設置web資源路徑,用於指定請求的根文檔目錄,從根開始匹配
root:root/URI
2.alias path
指定路徑別名,只能用於location中,從最後一個/開始匹配
alias: alias/
3. index file ....
定義默認頁面,可以跟多個值,自左向右匹配
4.error_pagecode ...[=[response]] URI
當對於某個請求發回錯誤時,如果匹配上了error_page指令中設定的code,則從定向至新的URI中
錯誤重定向
5.try_filespath1 [path2 ... ] URI
自左向右嘗試讀取所有path所指定路徑,在第一個找到即停止並返回,如果path均不存在,則返回最後一個URI
location ~* ^/document/(.*)${
root /www/htdocs
try_files $uri/docu/$1 /temp.html
}
http://www.wangfeng7399.com/documents/a.html
http://www.wangfeng7399.com/docu/a.html
http://www.wangfeng7399.com/temp.html
六、網絡連接相關的設置
1.keepalive_timeout time
保持連接的超時時長,默認爲75s
2.keepalive_requests n
在一次長連接上允許承載的最大請求數
3.keepalive_disable [msie6|asfari|none]
對指定的瀏覽器禁止使用長連接
4.tcp_nodelayon|off
對keepalive連接是否使用tcp_nodelay選項
5.client_header_timeout time
讀取http請求首部的超時時長
6.client_body_timeout time
請求http請求包體的超時時長
7.save_timeout time
發送響應的超時時長
七、對客戶端請求的限制
1.limit_except method ... { ... }
指定範圍之外的其他的訪問控制,只能用於location中
2.client_max_body_size SIZE
http請求包體的最大值,常用於限定客戶端所能夠請求的最大包體,根據請求首部中的Content-Length來檢查,以避免無用的傳輸
3.limit_ratespeed
限制客戶端每秒傳輸的字節數,默認爲0,表示沒有限制
4.limit_rate_after time
nginx向客戶端發送響應報文時,如果時長超過了此處指定的時長,則後續的發送過程開始限速
八、文件操作的優化
1.aendfile on|off
是否啓用sendfile功能
2.aio on|off
是否啓用aio功能
3.open_file_cache max=N[incative=time]|off
是否打開文件緩存功能
max:用於緩存條目的最大值,允許打開的緩存條目最大數,當滿兩類以後將根據LRU(最小最少連接數)算法進行置換
inactive:某緩存條目在指定時長內沒有被訪問過時,將自動被刪除,通常默認爲60s
緩存的信息包括
文件句柄、文件大小和上次修改的時間
已經打開的目錄結構
沒有找到或沒有訪問權限的信息
4.open_file_cache_errorson|off
是否緩存文件找不到或者沒有權限訪問等信息
5.open_file_cache_min_use #
在inactive指定的時長內被訪問超過此處指定的次數時,不會被刪除
6.open_file_cache_valid time
多長時間檢查一次緩存中的額條目是否超出非活動時長,默認爲60s
九、對客戶端請求的特殊處理
1.ignore_invalid_headers on|off
是否忽略不合法的http首部,默認爲on,off意味着請求首部中出現不合規的首部將拒絕響應,只能用於server和http中,建議改爲off
2.log_not_found on|off
用戶訪問的文件不存在時,是否將其記錄到錯誤日誌中
3.resolveraddress
指定nginx使用的dns服務器地址
4.resolvertimeout
指定DNS解析超時時長,默認爲30s
5.server_tokens on|off
是否在錯誤頁面中顯示nginx的版本號
十、http核心模塊的內置變量
1.$uri:當前請求的uri,不帶參數
2.$request_uri:請求的uri,帶完整參數
3.$host:http請求報文中host首部,如果請求中沒有host首部,則以處理此請求的主機的著名代替
4.$hostname:nginx服務運行所在主機的主機名
5.$remote_addr:客戶端ip
6.$remote_port:客戶端port
7.$remote_user:使用用戶認證時客戶端用戶輸入的用戶名
8.$request_filename:用戶請求中的URI經過本地root或alias轉換後映射的本地的文件路徑
9.$request_method:請求方法
10.$server_addr:服務器地址
11.$server_name: 服務器名稱
12.$server_port: 服務器端口
13.$server_protocol:服務器想客戶端發送響應時的協議,如http/1.1 http/1.0
14.$scheme: 在請求中使用的scheme映射協議本身的協議
15.$http_HEADER:匹配請求報文中指定的HEADER 例如:$http_host匹配請求報文中的host首部
16.$sent_http_HEADER:響應報文中指定的HERADER,例如:$http_content_type匹配相應報文中的content-type首部
17.$document_root:當前請求映射到的root配置