一、簡介
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首部