原文鏈接:http://blog.csdn.net/xyang81/article/details/51814787
Nginx的配置是以模塊爲單位來組織的,每一個模塊包含一個或多個指令,指令是配置文件中的最小配置單元,一切配置項皆爲指令。如http核心模塊中的include、default_type、sendfile指令,都屬於http模塊。nginx所有模塊中的指令見官方文檔說明:http://nginx.org/en/docs/dirindex.html
注意:以下配置中的“上下文”表示指令可以配置在哪些模塊中。
main:頂層配置,約束服務器的行爲
1、服務器級別核心配置
指令 | 上下文 | 語法 | 默認值 | 功能描述 |
---|---|---|---|---|
user | main | user nobody nobyd; | nobody | 以哪個用戶權限運行工作線程 |
daemon | main | daemon yes; | yes | nginx是否以守護進程運行 |
worker_processes | main | worker_processes number; | 1 | 配置工作進程數。傳統的web服務器(如apache)都是同步阻塞模型,一請求一進(線)程模式,當進(線)程數增達到一定程度後,更多CPU時間浪費在線程和進程切換當中,性能急劇下降,所以負載率不高。Nginx是基於事件的非阻塞多路複用(epoll或kquene)模型,一個進程在短時間內就可以響應大量的請求。建議將該值設置<=cpu核心數量,一般高於cpu核心數量不會帶來好處,反而可能會有進程切換開銷的負面影響。 |
worker_connections | events | worker_connections number; | 1024 | 併發響應能力的關鍵配置值,表示每個進程允許的最大同時連接數。maxConnection = work_connections * worker_processes;一般一個瀏覽器會同時開兩條連接,如果是反向代理,nginx到後服務器的連接數量也要佔用2條連接數,所以,做靜態服務器,一般maxConnection = work_connections * worker_processes / 2; 做反代理服務器時maxConnection = work_connections * worker_processes / 4; |
use | events | use epoll; | 根據不同的平臺,選擇最高效的連接處理方法 | 指定處理連接請求的方法。linux內核2.6以上默認使用epoll方法,其它平臺請參考:http://nginx.org/en/docs/events.html 備註:要達到超高負載下最好的網絡響應能力,還有必要優化與網絡相關的linux內核參數 |
worker_cpu_affinity | main | worker_cpu_affinity cpumask …; | 無 | 將工作進程綁定到特定的CPU上,減少CPU在進程之間切換的開銷。用二進制bit位表示進程綁定在哪個CPU內核。如8內核4進程時的設置方法:worker_cpu_affinity 00000001 00000010 00000100 10000000 |
worker_rlimit_nofile | main | worker_rlimit_core size; | 受linux內核文件描述符數量限制 | 設置nginx最大能打開的文件描述符數量。因爲Linux對每個進程所能打開的文件描述數量是有限制的,默認一般是1024個,可通過ulimit -n FILECNT或/etc/securit/limits.conf配置修改linux默認能打開的文件句柄數限制。建議值爲:系統最大數量/進程數。但進程間工作量並不是平均分配的,所以可以設置在大一些。推薦值爲:655350 |
error_log | main, http, mail, stream, server, location | error_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 |
pid | main | pid 守護進程socket文件路徑; | pid logs/nginx.pid | 配置nginx守護進程ID存儲文件路徑(不是工作進程) |
以上是nginx的頂層配置,管理服務器級別的行爲。更多配置請參考官方文檔:http://nginx.org/en/docs/ngx_core_module.html#working_directory
2、HTTP模塊核心配置
nginx做爲一個HTTP反向代理服務器,平時接觸得最多的應該是針對http請求的相關配置了,和http模塊有關的所有配置都放在http { ... }
配置中。
指令 | 上下文 | 語法 | 功能描述 |
---|---|---|---|
types | http, server, location | types { mime類型 文件後綴;}; | 配置能處理的文件類型。如:text/html html htm shtml; |
include | any | include 文件路徑; | 將外部文件的內容做爲配置拷貝到nginx.conf文件中。如:include mime.type; 將當前目錄下的mime.type配置文件拷貝到nginx配置文件中。文件路徑可以是相對路徑或絕對路徑。文件名可以用*來表示通配符。 |
default_type | http, server, location | default_type mime類型; | 文件名到後綴的映射關係。配置默認的mime類型,當在types指令中找不到請求的文件類型時,就使用default_type指定的類型。默認爲text/plain類型。 |
access_log | http, server, location, if in location, limit_except | access_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_format | http | log_format 格式名稱 日誌格式; | 定義http訪問日誌的格式,在日誌格式中可以訪問http模塊的內嵌變量,如果變存在的話,會做爲日誌輸出。如: |
sendfile | http, server, location, if in location | sendfile on | off; | 啓用內核複製模式。作爲靜態服務器可以提高最大的IO訪問速度。傳統的文件讀寫採用read和write方式,流程爲:硬盤 >> kernel buffer >> user buffer>> kernel socket buffer >>協議棧,採用sendfile文件讀寫的流程爲:硬盤 >> kernel buffer (快速拷貝到kernelsocket buffer) >>協議棧,很明顯sendfile這個系統調用減少了內核到用戶模式之間的切換和數據拷貝次數,直接從內核緩存的數據拷貝到協議棧,提高了很大的效率。這篇文章介紹比較詳細:http://xiaorui.cc/?p=1673 |
tcp_nodelay | http, server, location | off|on; | |
tcp_nopush | http, server, location | off|on; | tcp_nodelay和tcp_nopush這兩個參數是配合使用的,啓動這兩項配置,會在數據包達到一定大小後再發送數據。這樣會減少網絡通信次數,降低阻塞概率,但也會影響響應及時性。比較適合於文件下載這類的大數據通信場景。 |
keepalive_timeout | http, server, location | keepalive_time 65; | 客戶端到服務器建立連接的超時時長,超過指定的時間服務器就會斷開連接。默認爲75秒。降低每個連接的alive時間可在一定程度上提高可響應連接數量,所以一般可適當降低此值 |
gzip | http, server, location, if in location | gzip on | off; | 開啓內容壓縮,可以有效降低客戶端的訪問流量和網絡帶寬 |
gzip_min_length | http, server, location | gzip_min_length length; | 單位爲k,默認爲20k。內容超過最少長度後纔開啓壓縮,因爲太短的內容壓縮效果不佳,且壓縮過程還會浪費系統資源。這個壓縮長度會作爲http響應頭Content-Length字段返回給客戶端。 建議值:1000 |
gzip_comp_level | http, server, location | gzip_comp_level 1~9; | 壓縮級別,默認值爲1。範圍爲1~9級,壓縮級別越高壓縮率越高,但對系統性能要求越高。建議值:4 |
gzip_types | http, server, location | gzip_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_cache | http, server, location | open_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, location | open_file_cache_min_uses number; | 默認爲1,有效期內文件最少使有的次數。建議值:2 |
open_file _cache_valid |
http, server, location | open_file_cache_valid time; | 默認爲60s,驗證緩存有效期時間間隔。 表示每隔60s檢查一下緩存的文件當中,有哪些文件在20s以內沒有使用超過2次的,就從緩存中刪除。採用lru算法。 |
server | server { … } | http | HTTP服務器的核心配置,用於配置HTTP服務器的虛擬主機,可以配置多個 |
listen | listen ip[:端口] | server | 配置虛擬主機監聽的IP地址和端口,默認監聽本機IP地址和80或8000端口。如果只設置了IP沒設端口,默認使用80端口。如果只設置了端口,沒設置IP默認使用本機IP。詳細配置請參考:http://nginx.org/en/docs/http/ngx_http_core_module.html#listen |
server_name | server_name domain_name …; | server | 配置虛擬主機的域名,可以指定多個,用空格分隔。默認爲空 |
charset | http, server, location, if in location | charset charset | off; | 設置請求編碼,和url參數亂碼問題有關。 |
location | server, location | location [ = | ~ | ~* | ^~ ] uri { … } location @name { … } |
http請求中的一個重要配置項,用於配置客戶端請求服務器url地址的匹配規則。可以配置多個匹配規則 |
3、核心配置優化
# nginx不同於apache服務器,當進行了大量優化設置後會魔術般的明顯性能提升效果
# nginx在安裝完成後,大部分參數就已經是最優化了,我們需要管理的東西並不多
#user nobody;
#阻塞和非阻塞網絡模型:
#同步阻塞模型,一請求一進(線)程,當進(線)程增加到一定程度後
#更多CPU時間浪費到切換一,性能急劇下降,所以負載率不高
#Nginx基於事件的非阻塞多路複用(epoll或kquene)模型
#一個進程在短時間內可以響應大量的請求
#建議值 <= cpu核心數量,一般高於cpu數量不會帶好處,也許還有進程切換開銷的負面影響
worker_processes 4;
#將work process綁定到特定cpu上,避免進程在cpu間切換的開銷
worker_cpu_affinity 0001 0010 0100 1000
#8內核4進程時的設置方法 worker_cpu_affinity 00000001 00000010 00000100 10000000
# 每進程最大可打開文件描述符數量(linux上文件描述符比較廣義,網絡端口、設備、磁盤文件都是)
# 文件描述符用完了,新的連接會被拒絕,產生502類錯誤
# linux最大可打開文件數可通過ulimit -n FILECNT或 /etc/security/limits.conf配置
# 理論值 系統最大數量 / 進程數。但進程間工作量並不是平均分配的,所以可以設置的大一些
worker_rlimit_nofile 65535;
#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_connections 65535;
# 指明使用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_length 1000;
# 可選值1~9,壓縮級別越高壓縮率越高,但對系統性能要求越高
gzip_comp_level 4;
# 壓縮的內容類別
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
# 靜態文件緩存
# 最大緩存數量,文件未使用存活期
open_file_cache max=65535 inactive=20s;
# 驗證緩存有效期時間間隔
open_file_cache_valid 30s;
# 有效期內文件最少使用次數
open_file_cache_min_uses 2;
server {
listen 80;
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_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
...
}
...
}