1. 程式人生 > 實用技巧 >高效能web伺服器nginx(一)之基本概念

高效能web伺服器nginx(一)之基本概念

說明本篇文章大部分參考此人的博文:http://freeloda.blog.51cto.com/2033581/1285722,建議若想繼續深入學習nginx時最好先看下此人所寫的文章,總結的很詳細,然後在找相關的書籍和查閱官方文件學習。


一、NGINX介紹

1 簡介

傳統上基於程序或執行緒模型架構的web服務通過每程序或每執行緒處理併發連線請求,這勢必會在網路和I/O操作時產生阻塞,其另一個必然結果則是對記憶體或CPU的利用率低下。生成一個新的程序/執行緒需要事先備好其執行時環境,這包括為其分配堆記憶體和棧記憶體,以及為其建立新的執行上下文等。這些操作都需要佔用CPU,而且過多的程序/執行緒還會帶來執行緒抖動或頻繁的上下文切換,系統性能也會由此進一步下降。另一種高效能web伺服器/web伺服器反向代理:Nginx(Engine X),nginx的主要著眼點就是其高效能以及對物理計算資源的高密度利用,因此其採用了不同的架構模型。受啟發於多種作業系統設計中基於“事件”的高階處理機制,nginx採用了模組化、事件驅動、非同步、單執行緒及非阻塞的架構,並大量採用了多路複用及事件通知機制。在nginx中,連線請求由為數不多的幾個僅包含一個執行緒的程序worker以高效的迴環(run-loop)機制進行處理,而每個worker可以並行處理數千個的併發連線及請求。


2 Nginx 工作原理

Nginx會按需同時執行多個程序:一個主程序(master)和幾個工作程序(worker),配置了快取時還會有快取載入器程序(cache loader)和快取管理器程序(cache manager)等。所有程序均是僅含有一個執行緒,並主要通過“共享記憶體”的機制實現程序間通訊。主程序以root使用者身份執行,而worker、cache loader和cache manager均應以非特權使用者身份執行。

主程序主要完成如下工作:

  • 讀取並驗正配置資訊;

  • 建立、繫結及關閉套接字;

  • 啟動、終止及維護worker程序的個數;

  • 無須中止服務而重新配置工作特性;

  • 控制非中斷式程序升級,啟用新的二進位制程式並在需要時回滾至老版本;

  • 重新開啟日誌檔案;

  • 編譯嵌入式perl指令碼;

  • worker程序主要完成的任務包括:

  • 接收、傳入並處理來自客戶端的連線;

  • 提供反向代理及過濾功能;

  • nginx任何能完成的其它任務;


3 Nginx 架構

Nginx的程式碼是由一個核心和一系列的模組組成, 核心主要用於提供Web Server的基本功能,以及Web和Mail反向代理的功能;還用於啟用網路協議,建立必要的執行時環境以及確保不同的模組之間平滑地進行互動。不過,大多跟協議相關的功能和某應用特有的功能都是由nginx的模組實現的。這些功能模組大致可以分為事件模組、階段性處理器、輸出過濾器、變數處理器、協議、upstream和負載均衡幾個類別,這些共同組成了nginx的http功能。事件模組主要用於提供OS獨立的(不同作業系統的事件機制有所不同)事件通知機制如kqueue或epoll等。協議模組則負責實現nginx通過http、tls/ssl、smtp、pop3以及imap與對應的客戶端建立會話。在Nginx內部,程序間的通訊是通過模組的pipeline或chain實現的;換句話說,每一個功能或操作都由一個模組來實現。例如,壓縮、通過FastCGI或uwsgi協議與upstream伺服器通訊,以及與memcached建立會話等。


4 Nginx 基礎功能

  • 處理靜態檔案,索引檔案以及自動索引;

  • 反向代理加速(無快取),簡單的負載均衡和容錯;

  • FastCGI,簡單的負載均衡和容錯;

  • 模組化的結構。過濾器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI過濾器中,到同一個 proxy 或者 FastCGI 的多個子請求併發處理;

  • SSL 和 TLS SNI 支援;


5 Nginx IMAP/POP3 代理服務功能

  • 使用外部 HTTP 認證伺服器重定向使用者到 IMAP/POP3 後端;

  • 使用外部 HTTP 認證伺服器認證使用者後連線重定向到內部的 SMTP 後端;

  • 認證方法:

  • POP3: POP3 USER/PASS, APOP, AUTH LOGIN PLAIN CRAM-MD5;

  • IMAP: IMAP LOGIN;

  • SMTP: AUTH LOGIN PLAIN CRAM-MD5;

  • SSL 支援;

  • 在 IMAP 和 POP3 模式下的 STARTTLS 和 STLS 支援;


6 Nginx 支援的作業系統

  • FreeBSD 3.x, 4.x, 5.x, 6.x i386; FreeBSD 5.x, 6.x amd64;

  • Linux 2.2, 2.4, 2.6 i386; Linux 2.6 amd64;

  • Solaris 8 i386; Solaris 9 i386 and sun4u; Solaris 10 i386;

  • MacOS X (10.4) PPC;

  • Windows 編譯版本支援 windows 系列作業系統;


7 Nginx 結構與擴充套件

  • 一個主程序和多個工作程序,工作程序運行於非特權使用者;

  • kqueue (FreeBSD 4.1+), epoll (Linux 2.6+), rt signals (Linux 2.2.19+), /dev/poll (Solaris 7 11/99+), select, 以及 poll 支援;

  • kqueue支援的不同功能包括 EV_CLEAR, EV_DISABLE (臨時禁止事件), NOTE_LOWAT, EV_EOF, 有效資料的數目,錯誤程式碼;

  • sendfile (FreeBSD 3.1+), sendfile (Linux 2.2+), sendfile64 (Linux 2.4.21+), 和 sendfilev (Solaris 8 7/01+) 支援;

  • 輸入過濾 (FreeBSD 4.1+) 以及 TCP_DEFER_ACCEPT (Linux 2.4+) 支援;

  • 10,000 非活動的 HTTP keep-alive 連線僅需要 2.5M 記憶體。

  • 最小化的資料拷貝操作;


8 Nginx 其他HTTP功能

  • 基於IP 和名稱的虛擬主機服務;

  • Memcached 的 GET 介面;

  • 支援 keep-alive 和管道連線;

  • 靈活簡單的配置;

  • 重新配置和線上升級而無須中斷客戶的工作程序;

  • 可定製的訪問日誌,日誌寫入快取,以及快捷的日誌回捲;

  • 4xx-5xx 錯誤程式碼重定向;

  • 基於 PCRE 的 rewrite 重寫模組;

  • 基於客戶端 IP 地址和 HTTP 基本認證的訪問控制;

  • PUT, DELETE, 和 MKCOL 方法;

  • 支援 FLV (Flash 視訊);

  • 頻寬限制;


9 為什麼選擇Nginx

  • 在高連線併發的情況下,Nginx是Apache伺服器不錯的替代品: Nginx在美國是做虛擬主機生意的老闆們經常選擇的軟體平臺之一. 能夠支援高達 50,000 個併發連線數的響應, 感謝Nginx為我們選擇了epoll and kqueue作為開發模型。

  • Nginx作為負載均衡伺服器: Nginx 既可以在內部直接支援RailsPHP程式對外進行服務, 也可以支援作為HTTP代理伺服器對外進行服務. Nginx採用C進行編寫, 不論是系統資源開銷還是CPU使用效率都比Perlbal要好很多。

  • 作為郵件代理伺服器: Nginx 同時也是一個非常優秀的郵件代理伺服器(最早開發這個產品的目的之一也是作為郵件代理伺服器),Last.fm描述了成功並且美妙的使用經驗.

  • Nginx 是一個 [#installation 安裝] 非常的簡單 ,配置檔案非常簡潔(還能夠支援perl語法),Bugs非常少的伺服器: Nginx 啟動特別容易, 並且幾乎可以做到7*24不間斷執行,即使執行數個月也不需要重新啟動. 你還能夠不間斷服務的情況下進行軟體版本的升級

  • Nginx 的誕生主要解決C10K問題


10 三種工作模型比較:

Web伺服器要為使用者提供服務,必須以某種方式,工作在某個套接字上。一般Web伺服器在處理使用者請求是,一般有如下三種方式可選擇:多程序方式、多執行緒方式、非同步方式。

  • 多程序方式:為每個請求啟動一個程序來處理。由於在作業系統中,生成程序、銷燬程序、程序間切換都很消耗CPU和記憶體,當負載高是,效能會明顯降低。而httpd的prefork模型就是使用此種方式工作,故其效能較低。

優點: 穩定性!由於採用獨立程序處理獨立請求,而程序之間是獨立的,單個程序問題不會影響其他程序,因此穩定性最好。

缺點: 資源佔用!當請求過大時,需要大量的程序處理請求,程序生成、切換開銷很大,而且程序間資源是獨立的,造成記憶體重複利用。

  • 多執行緒方式:一個程序生成多個執行緒其中用多個執行緒處理使用者請求。由於執行緒開銷明顯小於程序,而且部分資源還可以共享,因此效率較高。而httpd的worker模型就是使用此種方式工作。

優點:開銷較小!執行緒間部分資料是共享的,且執行緒生成與執行緒間的切換所需資源開銷比程序間切換小得多。

缺點:穩定性!執行緒切換過快可能造成執行緒抖動,且執行緒過多會造成伺服器不穩定。

  • 非同步方式(事件模型):使用非阻塞方式處理請求,是三種方式中開銷最小的。但非同步方式雖然效率高,但要求也高,因為多工之間的排程如果出現問題,就可能出現整體故障,因此使用非同步工作的,一般是一些功能相對簡單,但卻符合伺服器任務排程、且程式碼中沒有影響排程的錯誤程式碼存在的程式。而httpd的event模型就是使用此種方式工作。

優點:效能最好!一個程序或執行緒處理多個請求,不需要額外開銷,效能最好,資源佔用最低。

缺點:穩定性!某個程序或執行緒出錯,可能導致大量請求無法處理,甚至導致整個服務宕機。


11 一個Web請求的處理過程:

wKioL1XxR_LxouA5AAFFm5Xgto4627.jpg

  1. 客戶發起情況到伺服器網絡卡;

  2. 伺服器網絡卡接受到請求後轉交給核心處理;

  3. 核心根據請求對應的套接字,將請求交給工作在使用者空間的Web伺服器程序

  4. Web伺服器程序根據使用者請求,向核心進行系統呼叫,申請獲取相應資源(如index.html)

  5. 核心發現web伺服器程序請求的是一個存放在硬碟上的資源,因此通過驅動程式連線磁碟

  6. 核心排程磁碟,獲取需要的資源

  7. 核心將資源存放在自己的緩衝區中,並通知Web伺服器程序

  8. Web伺服器程序通過系統呼叫取得資源,並將其複製到程序自己的緩衝區中

  9. Web伺服器程序形成響應,通過系統呼叫再次發給核心以響應使用者請求

  10. 核心將響應傳送至網絡卡

  11. 網絡卡傳送響應給使用者

通過這樣的一個複雜過程,一次請求就完成了。

簡單來說就是:使用者請求-->送達到使用者空間-->系統呼叫-->核心空間-->核心到磁碟上讀取網頁資源->返回到使用者空間->響應給使用者。上述簡單的說明了一下,客戶端向Web服務請求過程,在這個過程中,有兩個I/O過程,一個就是客戶端請求的網路I/O,另一個就是Web伺服器請求頁面的磁碟I/O。


二、安裝nginx

1、下載nginx並解壓

12[[email protected]~]#wgethttp://nginx.org/download/nginx-1.8.0.tar.gz[[email protected]~]#tar-xfnginx-1.8.0.tar.gz

2、建立nginx執行使用者

1234[[email protected]~]#groupadd-g108-rnginx[[email protected]~]#useradd-u108-r-g108nginx[[email protected]~]#idnginxuid=108(nginx)gid=108(nginx)組=108(nginx)


3、編譯安裝nginx

123[[email protected]~]#cdnginx-1.8.0[[email protected]nginx-1.8.0]#./configure--prefix=/usr--sbin-path=/usr/sbin/nginx--conf-path=/etc/nginx/nginx.conf--error-log-path=/var/log/nginx/error.log--http-log-path=/var/log/nginx/access.log--pid-path=/var/run/nginx/nginx.pid--lock-path=/var/lock/nginx.lock--user=nginx--group=nginx--with-http_ssl_module--with-http_flv_module--with-http_stub_status_module--with-http_gzip_static_module--http-client-body-temp-path=/var/tmp/nginx/client/--http-proxy-temp-path=/var/tmp/nginx/proxy/--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi--http-scgi-temp-path=/var/tmp/nginx/scgi--with-pcre[[email protected]nginx-1.8.0]#make&&makeinstall


4、檢視nginx命令安裝的路徑

12[[email protected]nginx-1.8.0]#whichnginx/usr/sbin/nginx

檢視nginx安裝版本:

12[[email protected]nginx-1.8.0]#nginx-vnginxversion:nginx/1.8.0

檢視nginx編譯選項:

123456[[email protected]nginx-1.8.0]#nginx-Vnginxversion:nginx/1.8.0builtbygcc4.4.720120313(RedHat4.4.7-16)(GCC)builtwithOpenSSL1.0.1e-fips11Feb2013TLSSNIsupportenabledconfigurearguments:--prefix=/usr--sbin-path=/usr/sbin/nginx--conf-path=/etc/nginx/nginx.conf--error-log-path=/var/log/nginx/error.log--http-log-path=/var/log/nginx/access.log--pid-path=/var/run/nginx/nginx.pid--lock-path=/var/lock/nginx.lock--user=nginx--group=nginx--with-http_ssl_module--with-http_flv_module--with-http_stub_status_module--with-http_gzip_static_module--http-client-body-temp-path=/var/tmp/nginx/client/--http-proxy-temp-path=/var/tmp/nginx/proxy/--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi--http-scgi-temp-path=/var/tmp/nginx/scgi--with-pcre


5、為nginx提供SysV init指令碼

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110[[email protected]nginx-1.8.0]#vim/etc/init.d/nginx#!/bin/sh##nginx-thisscriptstartsandstopsthenginxdaemon##chkconfig:-8515#description:NginxisanHTTP(S)server,HTTP(S)reverse\#proxyandIMAP/POP3proxyserver#processname:nginx#config:/etc/nginx/nginx.conf#config:/etc/sysconfig/nginx#pidfile:/var/run/nginx.pid#Sourcefunctionlibrary../etc/rc.d/init.d/functions#Sourcenetworkingconfiguration../etc/sysconfig/network#Checkthatnetworkingisup.["$NETWORKING"="no"]&&exit0nginx="/usr/sbin/nginx"prog=$(basename$nginx)NGINX_CONF_FILE="/etc/nginx/nginx.conf"[-f/etc/sysconfig/nginx]&&./etc/sysconfig/nginxlockfile=/var/lock/subsys/nginxmake_dirs(){#makerequireddirectoriesuser=`nginx-V2>&1|grep"configurearguments:"|sed's/[^*]*--user=\([^]*\).*/\1/g'-`options=`$nginx-V2>&1|grep'configurearguments:'`foroptin$options;doif[`echo$opt|grep'.*-temp-path'`];thenvalue=`echo$opt|cut-d"="-f2`if[!-d"$value"];then#echo"creating"$valuemkdir-p$value&&chown-R$user$valuefifidone}start(){[-x$nginx]||exit5[-f$NGINX_CONF_FILE]||exit6make_dirsecho-n$"Starting$prog:"daemon$nginx-c$NGINX_CONF_FILEretval=$?echo[$retval-eq0]&&touch$lockfilereturn$retval}stop(){echo-n$"Stopping$prog:"killproc$prog-QUITretval=$?echo[$retval-eq0]&&rm-f$lockfilereturn$retval}restart(){configtest||return$?stopsleep1start}reload(){configtest||return$?echo-n$"Reloading$prog:"killproc$nginx-HUPRETVAL=$?echo}force_reload(){restart}configtest(){$nginx-t-c$NGINX_CONF_FILE}rh_status(){status$prog}rh_status_q(){rh_status>/dev/null2>&1}case"$1"instart)rh_status_q&&exit0$1;;stop)rh_status_q||exit0$1;;restart|configtest)$1;;reload)rh_status_q||exit7$1;;force-reload)force_reload;;status)rh_status;;condrestart|try-restart)rh_status_q||exit0;;*)echo$"Usage:$0{start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"exit2esac


6、將指令碼賦予執行許可權並新增到服務啟動列表

123[[email protected]nginx-1.8.0]#chmod+x/etc/init.d/nginx[[email protected]nginx-1.8.0]#chkconfig--addnginx[[email protected]nginx-1.8.0]#chkconfignginxon


7、啟動nginx檢視監聽的埠

1234[[email protected]nginx-1.8.0]#servicenginxstart正在啟動nginx:[確定][[email protected]nginx-1.8.0]#ss-tunlp|grepnginxtcpLISTEN0128*:80*:*users:(("nginx",4618,6),("nginx",4620,6))


8、瀏覽器輸入linux主機的IP檢視是否安裝成功

wKiom1XxRe7h3GRbAAHMQXGnLD8536.jpg

9、將在vim開啟nginx配置檔案時實現語句高亮顯示

http://www.vim.org/scripts/script.php?script_id=1886

1234[[email protected]~]#mkdir-pv.vim/syntax[[email protected]~]#mvnginx.vim.vim/syntax[[email protected]~]#vim.vim/filetype.vimauBufRead,BufNewFile/etc/nginx/*,/usr/local/nginx/conf/*if&ft==''|setfiletypenginx|endif


三、nginx配置檔案

1、配置檔案結構

Nginx配置檔案主要分為4部分:main(全域性設定)、server(主機設定)、upstream(負載均衡伺服器設定)和 location(URL匹配特定位置的設定)。main部分設定的指令將影響其他所有設定;server部分的指令主要用於指定主機和埠;upstream指令主要用於負載均衡,設定一系列的後端伺服器;location部分用於匹配網頁位置。這四者之間的關係如下:server繼承main,location繼承server,upstream既不會繼承其他設定也不會被繼承。如下圖,

wKiom1XxRgnBfvyEAADHEM44eYk919.jpg

在這4個部分當中,每個部分都包含若干指令,這些指令主要包含Nginx的主模組指令、事件模組指令、HTTP核心模組指令。同時每個部分還可以使用其他HTTP模組指令,例如Http SSL模組、Http Gzip Static模組和Http Addition模組等。

下面通過一個Nginx配置例項,詳細介紹nginx.conf每個指令的含義。為了能更清楚地瞭解Nginx的結構和每個配置選項的含義,這裡按照功能點將Nginx配置檔案分為7個部分依次講解。下面就圍繞這7個部分進行介紹。


2、一般配置檔案介紹

(1).Nginx 的全域性配置檔案

123456789101112#usernobody;worker_processes1;#error_loglogs/error.log;#error_loglogs/error.lognotice;#error_loglogs/error.loginfo;#pidlogs/nginx.pid;worker_rlimit_nofile65535;worker_rlimit_sigpending#;events{useepoll;worker_connections1024;}

上面這段程式碼中每個配置選項的含義解釋如下:

  • user是個主模組指令,指定Nginx Worker程序執行使用者以及使用者組,預設由nobody賬號執行。

  • worker_processes 是個主模組指令,指定了Nginx要開啟的程序數。每個Nginx程序平均耗費10MB~12MB記憶體。根據經驗,一般指定一個程序足夠了,如果是多核CPU,建議指定為CPU核心數減一個程序數即可。(注,如果負載以CPU密集型應用為主,如SSL或壓縮應用,則worker數應與CPU數相同;如果負載以IO密集型為主,如響應大量內容給客戶端,則worker數應該為CPU個數的1.5或2倍。)

  • error_log是個主模組指令,用來定義全域性錯誤日誌檔案。日誌輸出級別有debug、info、notice、warn、error、crit可供選擇,其中,debug輸出日誌最為最詳細,而crit輸出日誌最少。

  • pid 是個主模組指令,用來指定程序id的儲存檔案位置。

  • worker_rlimit_nofile 指定一個worker程序所能夠開啟的最大檔案控制代碼數。

  • worker_rlimit_sigpending設定每個使用者能夠發往worker程序的訊號的數量。

  • events指令用來設定Nginx的工作模式及連線數上限。

  • use是個事件模組指令,用來指定Nginx的工作模式。Nginx支援的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是標準的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平臺上,而kqueue用在BSD系統中。此選擇建議還是由nginx自行選擇。

  • worker_connections也是個事件模組指令,用於定義Nginx每個程序的最大連線數,預設是1024。最大客戶端連線數由worker_processes和worker_connections決定,即max_client=worker_processes*worker_connections,在作為反向代理時變為:max_clients = worker_processes * worker_connections/4。(注,程序的最大連線數受Linux系統程序的最大開啟檔案數限制,在執行作業系統命令“ulimit -n 65536”後worker_connections的設定才能生效。)

(2).HTTP伺服器配置

http {

include mime.types;

default_type application/octet-stream;

#log_format main '$remote_addr - $remote_user [$time_local] "$request" '

# '$status $body_bytes_sent "$http_referer" '

# '"$http_user_agent" "$http_x_forwarded_for"';

#access_log logs/access.log main;

sendfile on;

#tcp_nopush on;

#keepalive_timeout 0;

keepalive_timeout 65;

#gzip on;

下面詳細介紹這段程式碼中每個配置選項的含義。

  • include是個主模組指令,實現對配置檔案所包含的檔案的設定,可以減少主配置檔案的複雜度。類似於Apache中的include方法。

  • default_type 屬於HTTP核心模組指令,這裡設定預設型別為二進位制流,也就是當檔案型別未定義時使用這種方式,例如在沒有配置PHP環境時,Nginx是不予解析的,此時,用瀏覽器訪問PHP檔案就會出現下載視窗。

  • log_format是Nginx的HttpLog模組指令,用於指定Nginx日誌的輸出格式。main為此日誌輸出格式的名稱,可以在下面的access_log指令中引用。

  • client_max_body_size用來設定允許客戶端請求的最大的單個檔案位元組數。

  • client_header_buffer_size用於指定來自客戶端請求頭的headerbuffer大小。對於大多數請求,1KB的緩衝區大小已經足夠,如果自定義了訊息頭或有更大的cookie,可以增加緩衝區大小。這裡設定為32KB。

  • large_client_header_buffers用來指定客戶端請求中較大的訊息頭的快取最大數量和大小, “4”為個數,“128K”為大小,最大快取為4個128KB。

  • sendfile引數用於開啟高效檔案傳輸模式。將tcp_nopush和tcp_nodely兩個指令設定為on,用於防止網路阻塞。

  • keepalive_timeout 用於設定客戶端連線保持活動的超時時間。在超過這個時間之後,伺服器會關閉該連線。

  • client_header_timeout用於設定客戶端請求頭讀取超時時間。如果超過這個時間,客戶端還沒有傳送任何資料,Nginx將返回“Request time out(408)”錯誤。

  • client_body_timeout用於設定客戶端請求主體讀取超時時間,預設值為60。如果超過這個時間,客戶端還沒有傳送任何資料,Nginx將返回“Request time out(408)”錯誤。

  • send_timeout用於指定響應客戶端的超時時間。這個超時僅限於兩個連線活動之間的時間,如果超過這個時間,客戶端沒有任何活動,Nginx將會關閉連線。

  • gzip用於設定開啟或者關閉gzip模組,“gzip on”表示開啟gzip壓縮,實時壓縮輸出資料流。

(3).HttpGzip模組配置

下面配置Nginx的HttpGzip模組。這個模組支援線上實時壓縮輸出資料流。要檢視是否安裝了此模組,需要使用下面的命令:nginx -V ,通過nginx -V 命令可以檢視安裝Nginx時的編譯選項。下面是HttpGzip模組在Nginx配置中的相關屬性設定:

#gzip on;

#gzip_min_length 1k;

#gzip_buffers 4 16k;

#gzip_http_version 1.1;

#gzip_comp_level 2;

#gzip_types text/plain application/x-javascript text/css application/xml;

#gzip_vary on;

  • gzip用於設定開啟或者關閉gzip模組,“gzip on”表示開啟gzip壓縮,實時壓縮輸出資料流。

  • gzip_min_length用於設定允許壓縮的頁面最小位元組數,頁面位元組數從header頭的Content-Length中獲取。預設值是0,不管頁面多大都進行壓縮。建議設定成大於1K的位元組數,小於1K可能會越壓越大。

  • gzip_buffers表示申請4個單位為16K的記憶體作為壓縮結果流快取,預設值是申請與原始資料大小相同的記憶體空間來儲存gzip壓縮結果。

  • gzip_buffers表示申請4個單位為16K的記憶體作為壓縮結果流快取,預設值是申請與原始資料大小相同的記憶體空間來儲存gzip壓縮結果。

  • gzip_comp_level用來指定gzip壓縮比,1 壓縮比最小,處理速度最快;9 壓縮比最大,傳輸速度快,但處理最慢,也比較消耗CPU資源。

  • gzip_types用來指定壓縮的型別,無論是否指定,“text/html”型別總是會被壓縮的。

  • gzip_vary選項可以讓前端的快取伺服器快取經過gzip壓縮的頁面,例如,用Squid快取經過Nginx壓縮的資料。

(4).負載均衡配置

下面設定負載均衡的伺服器列表:

1234567upstreamtest.net{ip_hash;server192.168.10.13:80;server192.168.10.14:80down;server192.168.10.15:8009max_fails=3fail_timeout=20s;server192.168.10.16:8080;}
  • upstream是Nginx的HTTP Upstream模組,這個模組通過一個簡單的排程演算法來實現客戶端IP到後端伺服器的負載均衡。在上面的設定中,通過upstream指令指定了一個負載均衡器的名稱test.net。這個名稱可以任意指定,在後面需要用到的地方直接呼叫即可。

  • Nginx的負載均衡模組目前支援4種排程演算法,下面進行分別介紹,其中後兩項屬於第三方排程演算法。

  • 輪詢(預設)。每個請求按時間順序逐一分配到不同的後端伺服器,如果後端某臺伺服器宕機,故障系統被自動剔除,使使用者訪問不受影響。

  • Weight。指定輪詢權值,Weight值越大,分配到的訪問機率越高,主要用於後端每個伺服器效能不均的情況下。

  • ip_hash。每個請求按訪問IP的hash結果分配,這樣來自同一個IP的訪客固定訪問一個後端伺服器,有效解決了動態網頁存在的session共享問題。

  • fair。這是比上面兩個更加智慧的負載均衡演算法。此種演算法可以依據頁面大小和載入時間長短智慧地進行負載均衡,也就是根據後端伺服器的響應時間來分配請求,響應時間短的優先分配。Nginx本身是不支援fair的,如果需要使用這種排程演算法,必須下載Nginx的upstream_fair模組。

  • url_hash。此方法按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,可以進一步提高後端快取伺服器的效率。Nginx本身是不支援url_hash的,如果需要使用這種排程演算法,必須安裝Nginx 的hash軟體包。

  • 在HTTP Upstream模組中,可以通過server指令指定後端伺服器的IP地址和埠,同時還可以設定每個後端伺服器在負載均衡排程中的狀態。常用的狀態有:

    • down,表示當前的server暫時不參與負載均衡。

    • backup,預留的備份機器。當其他所有的非backup機器出現故障或者忙的時候,才會請求backup機器,因此這臺機器的壓力最輕。

    • max_fails,允許請求失敗的次數,預設為1。當超過最大次數時,返回proxy_next_upstream 模組定義的錯誤。

    • fail_timeout,在經歷了max_fails次失敗後,暫停服務的時間。max_fails可以和fail_timeout一起使用。

注意,當負載排程演算法為ip_hash時,後端伺服器在負載均衡排程中的狀態不能是weight和backup。

(5).server虛擬主機配置

下面介紹對虛擬主機的配置。建議將對虛擬主機進行配置的內容寫進另外一個檔案,然後通過include指令包含進來,這樣更便於維護和管理。

1234567server{listen80;server_name192.168.12.188www.test.net;indexindex.htmlindex.htmindex.php;root/web/www/www.test.netcharsetgb2312;access_loglogs/www.test.net.access.logmain;
  • server標誌定義虛擬主機開始;

  • listen用於指定虛擬主機的伺服器埠;

  • server_name用來指定IP地址或者域名,多個域名之間用空格分開;

  • index用於設定訪問的預設首頁地址;

  • root指令用於指定虛擬主機的網頁根目錄,這個目錄可以是相對路徑,也可以是絕對路徑;

  • charset用於設定網頁的預設編碼格式。

  • access_log用來指定此虛擬主機的訪問日誌存放路徑。最後的main用於指定訪問日誌的輸出格式。

(6).URL匹配配置

URL地址匹配是Nginx配置中最靈活的部分。 location支援正則表示式匹配,也支援條件判斷匹配,使用者可以通過location指令實現Nginx對動、靜態網頁的過濾處理。

格式:location [ = | ~ | ~* | ^~ ] uri { ... }

location URI {}:對當前路徑及子路徑下的所有物件都生效;

location = URI {}:精確匹配指定的路徑,不包括子路徑,因此,只對當前資源生效;

location ~ URI {},location ~* URI {}:模式匹配URI,此處的URI可使用正則表示式,~區分字元大小寫,~*不區分字元大小寫;

location ^~ URI {}:不使用正則表示式

案例1:

1234location~.*\.(gif|jpg|jpeg|png|bmp|swf)${root/web/www/www.test.net;expires30d;}

說明:上面這段設定是通過location指令來對網頁URL進行分析處理,所有副檔名為.gif、.jpg、.jpeg、.png、.bmp、.swf的靜態檔案都交給Nginx處理,而expires用來指定靜態檔案的過期時間,這裡是30天。

案例2:

1234location~^/(upload|html)/{root/web/www/www.test.net;expires30d;}

說明:上面這段設定是將upload和html下的所有檔案都交給Nginx來處理,當然,upload和html目錄包含/web/www/www.test.net目錄中。

案例3:

1234location~.*.jsp${indexindex.jsp;proxy_passhttp://localhost:8080;}

說明:在最後這段設定中,location是對此虛擬主機下動態網頁的過濾處理,也就是將所有以.jsp為字尾的檔案都交給本機的8080埠處理。

location [ = | ~ | ~* | ^~ ] 優先順序

  • ocation = URI {}:精確匹配指定的路徑,不包括子路徑,因此,只對當前資源生效;(優先順序最高)

  • location ^~ URI {}:不使用正則表示式;(優先順序次之)

  • location ~ URI {},location ~* URI {}:模式匹配URI,此處的URI可使用正則表示式,~區分字元大小寫,~*不區分字元大小寫;(優先順序次之)

  • location URI {}:對當前路徑及子路徑下的所有物件都生效;(優先順序最低)

(7).StubStatus模組配置

StubStatus模組能夠獲取Nginx自上次啟動以來的工作狀態,此模組非核心模組,需要在Nginx編譯安裝時手工指定才能使用。以下指令指定啟用獲取Nginx工作狀態的功能。

123456location/NginxStatus{stub_statuson;access_loglogs/NginxStatus.log;auth_basic"NginxStatus";auth_basic_user_file../htpasswd;}
  • stub_status為“on”表示啟用StubStatus的工作狀態統計功能;

  • access_log 用來指定StubStatus模組的訪問日誌檔案;

  • auth_basic是Nginx的一種認證機制;

  • auth_basic_user_file用來指定認證的密碼檔案。

由於Nginx的auth_basic認證採用的是與Apache相容的密碼檔案,因此需要用Apache的htpasswd命令來生成密碼檔案。例如要新增一個webadmin使用者,可以使用下面的方式生成密碼檔案:

/usr/local/apache/bin/htpasswd -c /opt/nginx/conf/htpasswd webadmin

要檢視Nginx的執行狀態,可以輸入http://ip/ NginxStatus,然後輸入剛剛建立的使用者名稱和密碼就可以看到如下資訊:

1234Activeconnections:1serveracceptshandledrequests393411393411393799Reading:0Writing:1Waiting:0
  • Active connections表示當前活躍的連線數。

  • 第三行的3個數字表示 Nginx當前總共處理了393411個連線, 成功建立了393 411次握手,總共處理了393 799個請求。

  • 最後一行的Reading表示Nginx讀取到客戶端Header資訊數; Writing表示Nginx返回給客戶端的Header資訊數;Waiting表示Nginx已經處理完、正在等候下一次請求指令時的駐留連線數。

補充說明:

12345error_page404/404.html;error_page500502503504/50x.html;location=/50x.html{roothtml;}

在最後這段設定中,設定了虛擬主機的錯誤資訊返回頁面,通過error_page指令可以定製各種錯誤資訊的返回頁面。在預設情況下,Nginx會在主目錄的html目錄中查詢指定的返回頁面。特別需要注意的是,這些錯誤資訊的返回頁面大小一定要超過512KB,否則會被IE瀏覽器替換為IE預設的錯誤頁面。好了,到這裡nginx的配置檔案講解全部完成。下面我們來說一說nginx命令引數。


3、配置檔案深入介紹

(1).優化效能相關的配置

  • worker_rlimit_nofile #; 指定一個worker程序所能夠開啟的最大檔案控制代碼數;

  • worker_rlimit_sigpending #; 設定每個使用者能夠發往worker程序的訊號的數量;

  • worker_processes #; worker程序的個數;通常其數值應該為CPU的物理核心數減1;

  • worker_cpu_affinity cpumask ...; CPU親源性及使各個woeker程序分別執行在指定的CPU上,注意CPU是使用掩碼格式來填寫。但是這種方法並不能禁止系統使用該CPU進行其他的操作,還需要結合系統調優及CPU隔離才能很好的使用此選項,從而有效的減少CPU的上下文切換。舉例:worker_processes 6; worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000;

  • ssl_engine device; 在存在ssl硬體加速器的伺服器上,指定所使用的ssl硬體加速裝置;

  • timer_resolution t; 每次核心事件呼叫返回時,都會使用gettimeofday()來更新nginx快取時鐘;timer_resolution用於定義每隔多久才會由gettimeofday()更新一次快取時鐘;x86-64系統上,gettimeofday()代價已經很小,可以忽略此配置;

  • worker_priority nice; worker程序的優先順序,預設為0建議調小點,但不能過小。-20,19之間的值;

(2).事件相關的配置

  • accept_mutex [on|off] ; 是否開啟Ningx的負載均衡鎖;此鎖能夠讓多個worker進輪流地、序列化地與新的客戶端建立連線;而通常當一個worker程序的負載達到其上限的7/8,master就儘可能不再將請求排程此worker;

  • lock_file /path/to/lock_file; lock檔案

  • accept_mutex_delay #ms; accept鎖模式中,一個worker程序為取得accept鎖的等待時長;如果某worker程序在某次試圖取得鎖時失敗了,至少要等待#ms才能再一次請求鎖;預設500ms。

  • multi_accept on|off; 是否允許一次性地響應多個使用者請求;預設為Off;

  • use [epoll|rtsig|select|poll]; 定義使用的事件模型,建議讓nginx自動選擇;

  • worker_connections #; 每個worker能夠併發響應最大請求數;

(3).除錯、定位nginx問題

  • daemon on|off; 是否讓ningx執行後臺;預設為on,除錯時可以設定為off,使得所有資訊去接輸出控制檯;

  • master_process on|off 是否以master/worker模式執行nginx;預設為on;除錯時可設定off以方便追蹤;

  • error_log /path/to/error_log level; 錯誤日誌檔案及其級別;預設為error級別;除錯時可以使用debug級別,但要求在編譯時必須使用--with-debug啟用debug功能;

(4).虛擬主機相關的配置

  • server {} 定義一個虛擬主機;nginx支援使用基於主機名或IP的虛擬主機;

  • listen address[:port] [default_server] [ssl] [spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];

說明:

default_server:定義此server為http中預設的server;如果所有的server中沒有任何一個listen使用此引數,那麼第一個server即為預設server;

backlog=number:指明tcp協議的backlog佇列的大小,預設為-1,表示不設定後援佇列;

rcvbuf=SIZE: 接收緩衝大小;

sndbuf=SIZE: 傳送緩衝大小;

ssl: https server;

  • server_name [...];server_name可以跟多個主機名,名稱中可以使用萬用字元和正則表示式(通常以~開頭);當nginx收到一個請求時,會取出其首部的server的值,而後跟眾server_name進行比較;比較方式:

    • 先做精確匹配;www.example.com

    • 左側萬用字元匹配;*.example.com

    • 右側萬用字元匹配;www.*

    • 正則表示式匹配: ~^.*\.example\.com$

  • server_name_hash_bucket_size 32|64|128; 為了實現快速主機查詢,nginx使用hash表來儲存主機名;

  • location [ = | ~ | ~* | ^~ ] uri { ... } | location @name { ... }功能:允許根據使用者請求的URI來匹配指定的各location以進行訪問配置;匹配到時,將被location塊中的配置所處理;比如:http://www.example.com/p_w_picpaths/logo.gif

=:精確匹配;

~:正則表示式模式匹配,匹配時區分字元大小寫

~*:正則表示式模式匹配,匹配時忽略字元大小寫

^~: URI前半部分匹配,不檢查正則表示式

12345678910111213141516location=/{[configurationA]}location/{[configurationB]}location/documents/{[configurationC]}location^~/p_w_picpaths/{[configurationD]}location~*\.(gif|jpg|jpeg)${[configurationE]}


http://www.example.com/index.html 匹配到B。

http://www.example.com/ 匹配到A。

http://www.example.com/documents/index.html 匹配到C。

http://www.example.com/p_w_picpaths/index.html 匹配到D。

http://www.example.com/p_w_picpaths/a.jpg 匹配到E。

匹配優先順序:字元字面量最精確匹配-->正則表示式檢索(由第一個匹配到所處理)-->按字元字面量。

(5).檔案路徑定義

  • root path設定web資源路徑,用於指定請求的根文件目錄;

123456location/{root/www/htdocs;}location^~/p_w_picpaths/{root/web;}


匹配的檔案路徑為root: root/URI/

  • alias path 只能用於location中,用於路徑別名;

123456location/{root/www/htdocs;}location^~/p_w_picpaths/{alias/web;}


匹配的檔案路徑為alias: alias/

  • index file ...; 定義預設頁面,可參跟多個值;

  • error_page code ... [=[response]] uri; 當對於某個請求返回錯誤時,如果匹配上了error_page指令中設定的code,則重定向到新的URI中。即錯誤頁面重定向;

  • try_files path1 [path2 ...] uri; 自左至右嘗試讀取由path所指定路徑,在第一次找到即停止並返回;如果所有path均不存在,則返回最後一個uri;

(6).網路連線相關的設定

  • keepalive_timeout time; 保持連線的超時時長;預設為75秒;

  • keepalive_requests n; 在一次長連線上允許承載的最大請求數;

  • keepalive_disable [msie6 | safari | none ] 對指定的瀏覽器禁止使用長連線;

  • tcp_nodelay on|off; 對keepalive連線是否使用TCP_NODELAY選項;預設是啟用的,一般是啟動的。

  • client_header_timeout time; 讀取http請求首部的超時時長;

  • client_body_timeout time; 讀取http請求包體的超時時長;

  • send_timeout time; 傳送響應的超時時長;

(7).對客戶端請求的限制

  • limit_except method ... { ... } ;指定對範圍之外的其它方法的訪問控制;

  • client_max_body_size SIZE;http請求包體的最大值;常用於限定客戶所能夠請求的最大包體;根據請求首部中的Content-Length來檢測,以避免無用的傳輸;

  • limit_rate speed;限制客戶端每秒鐘傳輸的位元組數;預設為0,表示沒有限制;

  • limit_rate_after time;nginx向客戶傳送響應報文時,如果時長超出了此處指定的時長,則後續的傳送過程開始限速;

(8).檔案操作的優化

  • sendfile on|off 是否啟用sendfile功能;

  • aio on|off 是否啟用aio功能;

  • open_file_cache max=N [inactive=time]|off 是否開啟檔案快取功能;

max: 快取條目的最大值;當滿了以後將根據LRU演算法進行置換;

inactive: 某快取條目在指定時長時沒有被訪問過時,將自動被刪除;預設為60s;

快取的資訊包括:檔案控制代碼、檔案大小和上次修改時間。已經開啟的目錄結構。沒有找到或沒有訪問許可權的資訊;

  • open_file_cache_errors on|off 是否快取檔案找不到或沒有許可權訪問等相關資訊;

  • open_file_cache_valid time; 多長時間檢查一次快取中的條目是否超出非活動時長,預設為60s;

  • open_file_cache_min_use #; 在inactive指定的時長內被訪問超此處指定的次數地,才不會被刪除;

(9).對客戶端請求的特殊處理

  • ignore_invalid_headers on|off 是否忽略不合法的http首部,預設為on。off意味著請求首部中出現不合規的首部將拒絕響應,只能用於server和http;

  • log_not_found on|off 是否將檔案找不到的資訊也記錄進錯誤日誌中;

  • esolver address; 指定nginx使用的dns伺服器地址;

  • resover_timeout time; 指定DNS解析超時時長,預設為30s;

  • server_tokens on|off; 是否在錯誤頁面中顯示nginx的版本號;

(10).記憶體及磁碟資源分配

  • client_body_in_file_only on|clean|off HTTP的包體是否儲存在磁碟檔案中;非off表示儲存,即使包體大小為0也會建立一個磁碟檔案;on表示請求結束後包體檔案不會被刪除,clean表示會被刪除;

  • client_body_in_single_buffer on|off; HTTP的包體是否儲存在記憶體buffer當中;預設為off;

  • cleint_body_buffer_size size; nginx接收HTTP包體的記憶體緩衝區大小;

  • client_body_temp_path dir-path [level1 [level2 [level3]]]; HTTP包體存放的臨時目錄;

  • client_header_buffer_size size; 正常情況下接收使用者請求的http報文header部分時分配的buffer大小;預設為1k;

  • large_client_header_buffers number size; 儲存超大Http請求首部的記憶體buffer大小及個數;

  • connection_pool_size size; nginx對於每個建立成功的tcp連線都會預先分配一個記憶體池,此處即用於設定此記憶體池的初始大小;預設為256;

  • request_pool_size size;nginx在處理每個http請求時會預先分配一個記憶體池,此處即用於設定此記憶體池的初始大小;預設為4k;

(11).http核心模組的內建變數

  • $uri: 當前請求的uri,不帶引數;

  • $request_uri: 請求的uri,帶完整引數;

  • $host: http請求報文中host首部;如果請求中沒有host首部,則以處理此請求的虛擬主機的主機名代替;

  • $hostname: nginx服務執行在的主機的主機名;

  • $remote_addr: 客戶端IP

  • $remote_port: 客戶端Port

  • $remote_user: 使用使用者認證時客戶端使用者輸入的使用者名稱;

  • $request_filename: 使用者請求中的URI經過本地root或alias轉換後對映的本地的檔案路徑;

  • $request_method: 請求方法

  • $server_addr: 伺服器地址

  • $server_name: 伺服器名稱

  • $server_port: 伺服器埠

  • $server_protocol: 伺服器向客戶端傳送響應時的協議,如http/1.1, http/1.0

  • $scheme: 在請求中使用scheme, 如https://www.magedu.com/中的https;

  • $http_HEADER: 匹配請求報文中指定的HEADER,$http_host匹配請求報文中的host首部

  • $sent_http_HEADER: 匹配響應報文中指定的HEADER,例如$http_content_type匹配響應報文中的content-type首部;

  • $document_root:當前請求對映到的root配置;


本文出自 “粗茶淡飯” 部落格,請務必保留此出處http://cuchadanfan.blog.51cto.com/9940284/1693495


轉載於:https://blog.51cto.com/lucifer119/1734627