轉載別人的文章,nginx調優。鏈接如下:http://blog.csdn.net/xifeijian/article/details/20956605
大多數的Nginx安裝指南告訴你如下基礎知識——通過apt-get安裝,修改這里或那里的幾行配置,好了,你已經有了一個Web服務器了。而且,在大多數情況下,一個常規安裝的nginx對你的網站來說已經能很好地工作了。然而,如果你真的想擠壓出Nginx的性能,你必須更深入一些。在本指南中,我將解釋Nginx的那些設置可以微調,以優化處理大量客戶端時的性能。需要注意一點,這不是一個全面的微調指南。這是一個簡單的預覽——那些可以通過微調來提高性能設置的概述。你的情況可能不同。
基本的 (優化過的)配置
我們將修改的唯一文件是nginx.conf,其中包含Nginx不同模塊的所有設置。你應該能夠在服務器的/etc/nginx目錄中找到nginx.conf。首先,我們將談論一些全局設置,然后按文件中的模塊挨個來,談一下哪些設置能夠讓你在大量客戶端訪問時擁有良好的性能,為什么它們會提高性能。本文的結尾有一個完整的配置文件。
高層的配置
nginx.conf文件中,Nginx中有少數的幾個高級配置在模塊部分之上。
user?www-data;?
pid?/var/run/nginx.pid;?
worker_processes?auto;?
worker_rlimit_nofile?100000;?
user和pid應該按默認設置 - 我們不會更改這些內容,因為更改與否沒有什么不同。
worker_processes?定義了nginx對外提供web服務時的worker進程數。最優值取決于許多因素,包括(但不限于)CPU核的數量、存儲數據的硬盤數量及負載模式。不能確定的時候,將其設置為可用的CPU內核數將是一個好的開始(設置為“auto”將嘗試自動檢測它)。
worker_rlimit_nofile?更改worker進程的最大打開文件數限制。如果沒設置的話,這個值為操作系統的限制。設置后你的操作系統和Nginx可以處理比“ulimit -a”更多的文件,所以把這個值設高,這樣nginx就不會有“too many open files”問題了。
Events模塊
events模塊中包含nginx中所有處理連接的設置。
events?{?
worker_connections?2048;?
multi_accept?on;?
use?epoll;?
}?
worker_connections?設置可由一個worker進程同時打開的最大連接數。如果設置了上面提到的worker_rlimit_nofile,我們可以將這個值設得很高。
記住,最大客戶數也由系統的可用socket連接數限制(~ 64K),所以設置不切實際的高沒什么好處。
multi_accept?告訴nginx收到一個新連接通知后接受盡可能多的連接。
use?設置用于復用客戶端線程的輪詢方法。如果你使用Linux 2.6+,你應該使用epoll。如果你使用*BSD,你應該使用kqueue。
(值得注意的是如果你不知道Nginx該使用哪種輪詢方法的話,它會選擇一個最適合你操作系統的)
HTTP 模塊
HTTP模塊控制著nginx http處理的所有核心特性。因為這里只有很少的配置,所以我們只節選配置的一小部分。所有這些設置都應該在http模塊中,甚至你不會特別的注意到這段設置。
http?{?
server_tokens?off;?
sendfile?on;?
tcp_nopush?on;?
tcp_nodelay?on;?
...?
}?
server_tokens ?并不會讓nginx執行的速度更快,但它可以關閉在錯誤頁面中的nginx版本數字,這樣對于安全性是有好處的。
sendfile?可以讓sendfile()發揮作用。sendfile()可以在磁盤和TCP socket之間互相拷貝數據(或任意兩個文件描述符)。Pre-sendfile是傳送數據之前在用戶空間申請數據緩沖區。之后用read()將數據從文件拷貝到這個緩沖區,write()將緩沖區數據寫入網絡。sendfile()是立即將數據從磁盤讀到OS緩存。因為這種拷貝是在內核完成的,sendfile()要比組合read()和write()以及打開關閉丟棄緩沖更加有效(更多有關于sendfile)。
tcp_nopush?告訴nginx在一個數據包里發送所有頭文件,而不一個接一個的發送。
tcp_nodelay?告訴nginx不要緩存數據,而是一段一段的發送--當需要及時發送數據時,就應該給應用設置這個屬性,這樣發送一小塊數據信息時就不能立即得到返回值。
access_log?off;?
error_log?/var/log/nginx/error.log?crit;?
access_log?設置nginx是否將存儲訪問日志。關閉這個選項可以讓讀取磁盤IO操作更快(aka,YOLO)
error_log?告訴nginx只能記錄嚴重的錯誤:
keepalive_timeout?10;?
client_header_timeout?10;?
client_body_timeout?10;?
reset_timedout_connection?on;?
send_timeout?10;?
keepalive_timeout?給客戶端分配keep-alive鏈接超時時間。服務器將在這個超時時間過后關閉鏈接。我們將它設置低些可以讓ngnix持續工作的時間更長。
client_header_timeout 和client_body_timeout?設置請求頭和請求體(各自)的超時時間。我們也可以把這個設置低些。
reset_timeout_connection?告訴nginx關閉不響應的客戶端連接。這將會釋放那個客戶端所占有的內存空間。
send_timeout?指定客戶端的響應超時時間。這個設置不會用于整個轉發器,而是在兩次客戶端讀取操作之間。如果在這段時間內,客戶端沒有讀取任何數據,nginx就會關閉連接。
limit_conn_zone?$binary_remote_addr?zone=addr:5m;?
limit_conn?addr?100;?
limit_conn_zone?設置用于保存各種key(比如當前連接數)的共享內存的參數。5m就是5兆字節,這個值應該被設置的足夠大以存儲(32K*5)32byte狀態或者(16K*5)64byte狀態。
limit_conn?為給定的key設置最大連接數。這里key是addr,我們設置的值是100,也就是說我們允許每一個IP地址最多同時打開有100個連接。
include?/etc/nginx/mime.types;?
default_type?text/html;?
charset?UTF-8;?
include?只是一個在當前文件中包含另一個文件內容的指令。這里我們使用它來加載稍后會用到的一系列的MIME類型。
default_type?設置文件使用的默認的MIME-type。
charset?設置我們的頭文件中的默認的字符集
gzip?on;?
gzip_disable?"msie6";?
#?gzip_static?on;?
gzip_proxied?any;?
gzip_min_length?1000;?
gzip_comp_level?4;?
gzip_types?text/plain?text/css?application/json?application/x-javascript?text/xml?application/xml?application/xml+rss?text/javascript;?
gzip?是告訴nginx采用gzip壓縮的形式發送數據。這將會減少我們發送的數據量。
gzip_disable?為指定的客戶端禁用gzip功能。我們設置成IE6或者更低版本以使我們的方案能夠廣泛兼容。
gzip_static?告訴nginx在壓縮資源之前,先查找是否有預先gzip處理過的資源。這要求你預先壓縮你的文件(在這個例子中被注釋掉了),從而允許你使用最高壓縮比,這樣nginx就不用再壓縮這些文件了(想要更詳盡的gzip_static的信息,請點擊這里)。
gzip_proxied?允許或者禁止壓縮基于請求和響應的響應流。我們設置為any,意味著將會壓縮所有的請求。
gzip_min_length?設置對數據啟用壓縮的最少字節數。如果一個請求小于1000字節,我們最好不要壓縮它,因為壓縮這些小的數據會降低處理此請求的所有進程的速度。
gzip_comp_level?設置數據的壓縮等級。這個等級可以是1-9之間的任意數值,9是最慢但是壓縮比最大的。我們設置為4,這是一個比較折中的設置。
gzip_type?設置需要壓縮的數據格式。上面例子中已經有一些了,你也可以再添加更多的格式。
#?cache?informations?about?file?descriptors,?frequently?accessed?files?
#?can?boost?performance,?but?you?need?to?test?those?values?
open_file_cachemax=100000?inactive=20s;?
open_file_cache_valid?30s;?
open_file_cache_min_uses?2;?
open_file_cache_errors?on;?
##?
#?Virtual?Host?Configs?
#?aka?our?settings?for?specific?servers?
##?
include?/etc/nginx/conf.d/*.conf;?
include?/etc/nginx/sites-enabled/*;?
open_file_cache?打開緩存的同時也指定了緩存最大數目,以及緩存的時間。我們可以設置一個相對高的最大時間,這樣我們可以在它們不活動超過20秒后清除掉。
open_file_cache_valid?在open_file_cache中指定檢測正確信息的間隔時間。
open_file_cache_min_uses?定義了open_file_cache中指令參數不活動時間期間里最小的文件數。
open_file_cache_errors?指定了當搜索一個文件時是否緩存錯誤信息,也包括再次給配置中添加文件。我們也包括了服務器模塊,這些是在不同文件中定義的。如果你的服務器模塊不在這些位置,你就得修改這一行來指定正確的位置。
一個完整的配置
user?www-data;?
pid?/var/run/nginx.pid;?
worker_processes?auto;?
worker_rlimit_nofile?100000;?
events?{?
worker_connections?2048;?
multi_accept?on;?
use?epoll;?
}?
http?{?
server_tokens?off;?
sendfile?on;?
tcp_nopush?on;?
tcp_nodelay?on;?
access_log?off;?
error_log?/var/log/nginx/error.log?crit;?
keepalive_timeout?10;?
client_header_timeout?10;?
client_body_timeout?10;?
reset_timedout_connection?on;?
send_timeout?10;?
limit_conn_zone?$binary_remote_addrzone=addr:5m;?
limit_conn?addr?100;?
include?/etc/nginx/mime.types;?
default_type?text/html;?
charset?UTF-8;?
gzip?on;?
gzip_disable?"msie6";?
gzip_proxied?any;?
gzip_min_length?1000;?
gzip_comp_level?6;?
gzip_types?text/plain?text/css?application/json?application/x-javascript?text/xml?application/xml?application/xml+rss?text/javascript;?
open_file_cachemax=100000?inactive=20s;?
open_file_cache_valid?30s;?
open_file_cache_min_uses?2;?
open_file_cache_errors?on;?
include?/etc/nginx/conf.d/*.conf;?
include?/etc/nginx/sites-enabled/*;?
}?
編輯完配置后,確認重啟nginx使設置生效。
下面這描述也是非常好的:http://blog.csdn.net/xyang81/article/details/51814787
Nginx的配置是以模塊為單位來組織的,每一個模塊包含一個或多個指令,指令是配置文件中的最小配置單元,一切配置項皆為指令。如http核心模塊中的include、default_type、sendfile指令,都屬于http模塊。nginx所有模塊中的指令見官方文檔說明:http://nginx.org/en/docs/dirindex.html
注意:以下配置中的“上下文”表示指令可以配置在哪些模塊中。
main:頂層配置,約束服務器的行為
指令上下文語法默認值功能描述
usermainuser nobody nobyd;nobody以哪個用戶權限運行工作線程
daemonmaindaemon yes;yesnginx是否以守護進程運行
worker_processesmainworker_processes number;1配置工作進程數。傳統的web服務器(如apache)都是同步阻塞模型,一請求一進(線)程模式,當進(線)程數增達到一定程度后,更多CPU時間浪費在線程和進程切換當中,性能急劇下降,所以負載率不高。Nginx是基于事件的非阻塞多路復用(epoll或kquene)模型,一個進程在短時間內就可以響應大量的請求。建議將該值設置<=cpu核心數量,一般高于cpu核心數量不會帶來好處,反而可能會有進程切換開銷的負面影響。
worker_connectionseventsworker_connections number;1024并發響應能力的關鍵配置值,表示每個進程允許的最大同時連接數。maxConnection = work_connections * worker_processes;一般一個瀏覽器會同時開兩條連接,如果是反向代理,nginx到后服務器的連接數量也要占用2條連接數,所以,做靜態服務器,一般maxConnection = work_connections * worker_processes / 2; 做反代理服務器時maxConnection = work_connections * worker_processes / 4;
useeventsuse epoll;根據不同的平臺,選擇最高效的連接處理方法指定處理連接請求的方法。linux內核2.6以上默認使用epoll方法,其它平臺請參考:http://nginx.org/en/docs/events.html?備注:要達到超高負載下最好的網絡響應能力,還有必要優化與網絡相關的linux內核參數
worker_cpu_affinitymainworker_cpu_affinity cpumask …;無將工作進程綁定到特定的CPU上,減少CPU在進程之間切換的開銷。用二進制bit位表示進程綁定在哪個CPU內核。如8內核4進程時的設置方法:worker_cpu_affinity 00000001 00000010 00000100 10000000
worker_rlimit_nofilemainworker_rlimit_core size;受linux內核文件描述符數量限制設置nginx最大能打開的文件描述符數量。因為Linux對每個進程所能打開的文件描述數量是有限制的,默認一般是1024個,可通過ulimit -n FILECNT或/etc/securit/limits.conf配置修改linux默認能打開的文件句柄數限制。建議值為:系統最大數量/進程數。但進程間工作量并不是平均分配的,所以可以設置在大一些。推薦值為:655350
error_logmain, http, mail, stream, server, locationerror_log 日志文件路徑 日志級別;error_log logs/error.log error;配置錯誤日志文件的路徑和日志級別。日志級別有debug, info, notice, warn, error, crit, alert和emerg幾種。nginx的日志使用syslog輸出,所以輸出的日志格式是有規律的,系統運維人員可以根據日志規則進行查錯或統計分析。更多說明請參考官方文檔:http://nginx.org/en/docs/ngx_core_module.html#error_log
pidmainpid 守護進程socket文件路徑;pid logs/nginx.pid配置nginx守護進程ID存儲文件路徑(不是工作進程)
以上是nginx的頂層配置,管理服務器級別的行為。更多配置請參考官方文檔:http://nginx.org/en/docs/ngx_core_module.html#working_directory
nginx做為一個HTTP反向代理服務器,平時接觸得最多的應該是針對http請求的相關配置了,和http模塊有關的所有配置都放在http { ... }配置中。
指令上下文語法功能描述
typeshttp, server, locationtypes { mime類型 文件后綴;};配置能處理的文件類型。如:text/html html htm shtml;
includeanyinclude 文件路徑;將外部文件的內容做為配置拷貝到nginx.conf文件中。如:include mime.type; 將當前目錄下的mime.type配置文件拷貝到nginx配置文件中。文件路徑可以是相對路徑或絕對路徑。文件名可以用*來表示通配符。
default_typehttp, server, locationdefault_type mime類型;文件名到后綴的映射關系。配置默認的mime類型,當在types指令中找不到請求的文件類型時,就使用default_type指定的類型。默認為text/plain類型。
access_loghttp, server, location, if in location, limit_exceptaccess_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
關閉或開啟訪問日志。默認配置為:access_log logs/access.log combined; 表示根據combined定義的日志格式,寫入logs/access.log文件中,combined是http模塊默認格式。如果定義了buffer和gzip其中一個參數,日志默認會先寫入緩存中,當緩存滿了之后,通過gzip壓縮緩存中的日志并寫入文件,啟用了gzip壓縮必須保證nginx安裝的時候添加了gzip模塊。緩存大小默認為64K。可以配置gzip的1~9的壓縮級別,級別越高壓縮效率越大,日志文件占用的空間越小,但要求系統性能也越高。默認值是1。http://nginx.org/en/docs/http/ngx_http_log_module.html#access_log
log_formathttplog_format 格式名稱 日志格式;定義http訪問日志的格式,在日志格式中可以訪問http模塊的內嵌變量,如果變存在的話,會做為日志輸出。如:remoteaddr,request等,更多變量請參考:http://nginx.org/en/docs/http/ngx_http_core_module.html#variables
sendfilehttp, server, location, if in locationsendfile on | off;啟用內核復制模式。作為靜態服務器可以提高最大的IO訪問速度。傳統的文件讀寫采用read和write方式,流程為:硬盤 >> kernel buffer >> user buffer>> kernel socket buffer >>協議棧,采用sendfile文件讀寫的流程為:硬盤 >> kernel buffer (快速拷貝到kernelsocket buffer) >>協議棧,很明顯sendfile這個系統調用減少了內核到用戶模式之間的切換和數據拷貝次數,直接從內核緩存的數據拷貝到協議棧,提高了很大的效率。這篇文章介紹比較詳細:http://xiaorui.cc/?p=1673
tcp_nodelayhttp, server, locationoff|on;
tcp_nopushhttp, server, locationoff|on;tcp_nodelay和tcp_nopush這兩個參數是配合使用的,啟動這兩項配置,會在數據包達到一定大小后再發送數據。這樣會減少網絡通信次數,降低阻塞概率,但也會影響響應及時性。比較適合于文件下載這類的大數據通信場景。
keepalive_timeouthttp, server, locationkeepalive_time 65;客戶端到服務器建立連接的超時時長,超過指定的時間服務器就會斷開連接。默認為75秒。降低每個連接的alive時間可在一定程度上提高可響應連接數量,所以一般可適當降低此值
gziphttp, server, location, if in locationgzip on | off;開啟內容壓縮,可以有效降低客戶端的訪問流量和網絡帶寬
gzip_min_lengthhttp, server, locationgzip_min_length length;單位為k,默認為20k。內容超過最少長度后才開啟壓縮,因為太短的內容壓縮效果不佳,且壓縮過程還會浪費系統資源。這個壓縮長度會作為http響應頭Content-Length字段返回給客戶端。 建議值:1000
gzip_comp_levelhttp, server, locationgzip_comp_level 1~9;壓縮級別,默認值為1。范圍為1~9級,壓縮級別越高壓縮率越高,但對系統性能要求越高。建議值:4
gzip_typeshttp, server, locationgzip_types mime-type …;壓縮內容類型,默認為text/html;。只壓縮html文本,一般我們都會壓縮js、css、json之類的,可以把這些常見的文本數據都配上。如:text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
open_file_cachehttp, server, locationopen_file_cache off; open_file_cache max=N [inactive=time];默認值為off; 設置最大緩存數量,及緩存文件未使用的存活期。建議值:max=655350(和worker_rlimit_nofile參數一致) inactive=20s;
open_file_
cache_min_uses
http, server, locationopen_file_cache_min_uses number;默認為1,有效期內文件最少使有的次數。建議值:2
open_file
_cache_valid
http, server, locationopen_file_cache_valid time;默認為60s,驗證緩存有效期時間間隔。 表示每隔60s檢查一下緩存的文件當中,有哪些文件在20s以內沒有使用超過2次的,就從緩存中刪除。采用lru算法。
serverserver { … }httpHTTP服務器的核心配置,用于配置HTTP服務器的虛擬主機,可以配置多個
listenlisten ip[:端口]server配置虛擬主機監聽的IP地址和端口,默認監聽本機IP地址和80或8000端口。如果只設置了IP沒設端口,默認使用80端口。如果只設置了端口,沒設置IP默認使用本機IP。詳細配置請參考:http://nginx.org/en/docs/http/ngx_http_core_module.html#listen
server_nameserver_name domain_name …;server配置虛擬主機的域名,可以指定多個,用空格分隔。默認為空
charsethttp, server, location, if in locationcharset charset | off;設置請求編碼,和url參數亂碼問題有關。
locationserver, locationlocation [ = | ~ | ~* | ^~ ] uri { … }?
location @name { … }
http請求中的一個重要配置項,用于配置客戶端請求服務器url地址的匹配規則。可以配置多個匹配規則
# nginx不同于apache服務器,當進行了大量優化設置后會魔術般的明顯性能提升效果# nginx在安裝完成后,大部分參數就已經是最優化了,我們需要管理的東西并不多#user? nobody;#阻塞和非阻塞網絡模型:#同步阻塞模型,一請求一進(線)程,當進(線)程增加到一定程度后#更多CPU時間浪費到切換一,性能急劇下降,所以負載率不高#Nginx基于事件的非阻塞多路復用(epoll或kquene)模型#一個進程在短時間內可以響應大量的請求#建議值 <= cpu核心數量,一般高于cpu數量不會帶好處,也許還有進程切換開銷的負面影響worker_processes4;#將work process綁定到特定cpu上,避免進程在cpu間切換的開銷worker_cpu_affinity0001001001001000#8內核4進程時的設置方法 worker_cpu_affinity 00000001 00000010 00000100 10000000# 每進程最大可打開文件描述符數量(linux上文件描述符比較廣義,網絡端口、設備、磁盤文件都是)# 文件描述符用完了,新的連接會被拒絕,產生502類錯誤# linux最大可打開文件數可通過ulimit -n FILECNT或 /etc/security/limits.conf配置# 理論值 系統最大數量 / 進程數。但進程間工作量并不是平均分配的,所以可以設置的大一些worker_rlimit_nofile65535;#error_log? logs/error.log;#error_log? logs/error.log? notice;#error_log? logs/error.log? info;#pid? ? ? ? logs/nginx.pid;events {# 并發響應能力的關鍵配置值# 每個進程允許的最大同時連接數,work_connectins * worker_processes = maxConnection;# 要注意maxConnections不等同于可響應的用戶數量,# 因為一般一個瀏覽器會同時開兩條連接,如果反向代理,nginx到后端服務器的連接也要占用連接數# 所以,做靜態服務器時,一般 maxClient = work_connectins * worker_processes / 2# 做反向代理服務器時 maxClient = work_connectins * worker_processes / 4# 這個值理論上越大越好,但最多可承受多少請求與配件和網絡相關,也可最大可打開文件,最大可用sockets數量(約64K)有關worker_connections65535;# 指明使用epoll 或 kquene (*BSD)use epoll;# 備注:要達到超高負載下最好的網絡響應能力,還有必要優化與網絡相關的linux內核參數}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"';# 關閉此項可減少IO開銷,但也無法記錄訪問信息,不利用業務分析,一般運維情況不建議使用access_log off# 只記錄更為嚴重的錯誤日志,可減少IO壓力error_log logs/error.log crit;#access_log? logs/access.log? main;# 啟用內核復制模式,應該保持開啟達到最快IO效率sendfile? ? ? ? on;# 簡單說,啟動如下兩項配置,會在數據包達到一定大小后再發送數據# 這樣會減少網絡通信次數,降低阻塞概率,但也會影響響應及時性# 比較適合于文件下載這類的大數據包通信場景#tcp_nopush? ? on; 在 #tcp_nodelay on|off on禁用Nagle算法 #keepalive_timeout? 0;# HTTP1.1支持持久連接alive# 降低每個連接的alive時間可在一定程度上提高可響應連接數量,所以一般可適當降低此值keepalive_timeout? 30s;# 啟動內容壓縮,有效降低網絡流量gzip on;# 過短的內容壓縮效果不佳,壓縮過程還會浪費系統資源gzip_min_length1000;# 可選值1~9,壓縮級別越高壓縮率越高,但對系統性能要求越高gzip_comp_level4;# 壓縮的內容類別gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;# 靜態文件緩存# 最大緩存數量,文件未使用存活期open_file_cache max=65535inactive=20s;# 驗證緩存有效期時間間隔open_file_cache_valid 30s;# 有效期內文件最少使用次數open_file_cache_min_uses2;? ? server {? ? ? ? listen80;? ? ? ? server_name? localhost;? ? ? ? charset utf-8;#access_log? logs/host.access.log? main;location / {? ? ? ? ? ? root? html;? ? ? ? ? ? index? index.html index.htm;? ? ? ? }#error_page? 404? ? ? ? ? ? ? /404.html;# redirect server error pages to the static page /50x.html#error_page500502503504/50x.html;? ? ? ? location = /50x.html {? ? ? ? ? ? root? html;? ? ? ? }...}...}
下面這篇文章講解了nginx監控后端接口健康情況:
http://blog.csdn.net/moqiang02/article/details/42846221