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:頂層配置,約束服務器的行爲

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模塊的內嵌變量,如果變存在的話,會做爲日誌輸出。如:remoteaddr request等,更多變量請參考:http://nginx.org/en/docs/http/ngx_http_core_module.html#variables
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;
        }

        ...
    }

    ...

}
發佈了103 篇原創文章 · 獲贊 213 · 訪問量 172萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章