天天看點

高性能Nginx伺服器優化實戰

環境:Centos6.6   nginx-1.9.0

本文講述nginx各種細節上優化,以達到高性能高可用的目地

#下載下傳nginx

wget  http://nginx.org/download/nginx-1.9.0.tar.gz

#編譯安裝,在安裝Nginx之前,確定系統已經安裝了gcc、openssl-devel、pcre-devel和zlib-devel軟體庫

cd nginx-1.9.0

./configure \

--prefix=/usr/local/nginx --with-http_stub_status_module --with-http_gzip_static_module

make

make install

在上面的configure選項中,--with-http_stub_status_module是用來啟用Nginx的NginxStatus功能,以監控Nginx的目前狀态。

                                                 --with-http_gzip_static_module是用來啟用HttpGzip子產品,支援線上實時壓縮輸出資料流。

#Nginx的全局配置

user  nginx   nginx;
worker_processes  1;
error_log  logs/error.log  info;
pid        logs/nginx.pid;
worker_rlimit_nofile  65535;
events {
    use epoll;
    worker_connections  65536;
}
           

user 指定NginxWorker程序運作使用者以及使用者組,預設由nobody賬号運作

worker_processes 指定Nginx要開啟的程序數。每個程序平均耗費10MB~12MB記憶體。根據經驗,一般指定一個程序足夠了,如果是多核CPU,建議指定和CPU的數量一樣多的程序數即可。

error_log 用來定義全局錯誤日志檔案。日志輸出級别有debug、info、notice、warn、error、crit,debug輸出日志最詳細,crit最少

pid 指定程序id的存儲檔案位置。

work_rlimit_nofile 用于綁定worker程序和cpu

events 用來設定Nginx的工作模式及連接配接數上限

use 是個事件子產品指令,用來指定Nginx的工作模式。支援的工作模式有:select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标準的工作模式,kqueue和epoll中高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系統中。對于Linux系統,epoll工作模式是首選。

worker_connections 也是個事件子產品指令,用于定義Nginx每個程序的最大連接配接數,預設是1024。

#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"';
    client_max_body_size        20m;
    client_header_buffer_size   32k;
    large_client_header_buffers  4  32k;
    sendfile       on;
    tcp_nopush     on;
    tcp_nodelay    on;
    keepalive_timeout        60;
    client_header_timeout    10;
    client_body_timeout      10;
    send_timeout             10;
           

include 是個主子產品指令,實作對配置檔案包含檔案的設定,可以減少主配置檔案的複雜度。類似于Apache的include

default_type 屬于http核心子產品指令,這裡設定預設類型是二程序流,也就是當檔案類型未定義時使用這種方式,例如在沒有配置PH環境時,Nginx是不予解析的,此時,用浏覽器通路PHP檔案就會出現下載下傳視窗。

log_format 是httplog子產品指令,用于指定nginx日志的輸出格式。main是此日志輸出格式的名稱

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

client_header_buffer_size 指定來自用戶端請求頭的headerbuffer大小

large_client_header_buffers 指定用戶端請求中較大的消息頭的緩存最大數量和大小,4為個數,32k為大小,最大緩存為4個128KB。

sendfile 開啟高效檔案傳輸模式。将tcp_nopush和tcp_nodely兩個指令設定為on,用于防止網絡阻塞。

keepalive_timeout 設定用戶端連接配接保持活動的逾時時間

client_header_timeout 設定用戶端請求頭讀取逾時時間

client_body_timeout 設定用戶端請求主體讀取逾時時間

send_timeout 指定響應用戶端的逾時時間。

#HttpGzip子產品配置       gzip   on ;         gzip_min_length     1 k ;      gzip_buffers             4  16 k ;      gzip_http_version     1.1 ;      gzip_comp_level       2 ;      gzip_types               text / plain  application / x - javascript  text / css  application / xml ;      gzip_vary                on ; gzip on 開啟gzip壓縮,實時壓縮輸出資料流。

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

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

gzip_http_version 設定識别HTTP協定版本,預設是1.1

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

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

gzip_vary 可以讓前端的緩存伺服器緩存經過gzip壓縮的頁面

#負載均衡群

upstream myServers {
        server 192.168.212.99:8080 max_fails=3 fail_timeout=10s;
        server 192.168.212.128:80 max_fails=3 fail_timeout=10s;
        }
           

upstream 是Nginx的HTTP Upstream子產品,這個子產品通過一個簡單的排程算法來實作用戶端IP到後端伺服器的負載均衡。Nginx的負載均衡子產品目前支援4種調試算法,輪詢、ip_hash、fair、url_hash,後兩項屬于第三方調試算法,在另一篇文章中有做詳細的介紹,這就不廢話了,上面使用的是輪詢   

#server虛拟主機配置,建議将虛拟主機的配置檔案寫進另一個檔案,然後通過include指令包含進來,這樣更便于維護和管理。

include       server/default.conf; 
server {
listen          80;
server_name     www.wnt.com;
index     	index.html index.htm;
root            html;
charset         utf-8;
access_log    logs/www.wnt.com-access.log main;
	}
           

 listen 指定虛拟主機的伺服器端口  server_name 指定IP位址或者域名,多個域名之間用空格分開。

 index 設定通路的預設首頁文檔

 root 指定虛拟主機的網頁根目錄,可以相對路徑,也可以是絕對路徑

 charset 設定網頁的預設編碼格式

 access_log 指定些虛拟主機的通路日志存放路徑。最後的main是通路日志的輸出格式。

  #負載均衡配置 location   /   {           proxy_pass        http : //myServers;           proxy_next_upstream   http_500   http_502   http_503   error   timeout   invalid_header ;           include           server / proxy . conf ;           } proxy_next_upstream 用來定義故障轉移政策,當後端服務節點傳回500、502、503和執行逾時等錯誤時,自動将請求轉發到upstream負載均衡群中的另一台伺服器,實作故障轉移。最後通過include指令包含進來一個proxy.conf檔案,詳細配置在下面寫出

#靜态檔案緩存,指定類型的檔案和目錄,用expires指定過期時間,這裡是1天。

location ~.*\.(gif|jpg|jpeg|png|bmp|swf)$ {
        expires 1d;
        } 
    location ~ ^/(upload|html)/ {
        expires 1d;
        } 
           

#StubStatus子產品配置 ,stub_status 開啟子產品,access_log 指定StubStatus子產品的通路日志檔案

location  / NginxStatus  {          stub_status      on ;          access_log       logs / NginxStatus . log ;          }      #錯誤頁 

error_page  404     /404.html;
    error_page  500 502 503 504 /50x.html;
    location = /50x.html {
        }
           

#proxy檔案配置

proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size  4k;
proxy_buffers  4  32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
           

proxy_redirect 指定修改被代理伺服器傳回的響應頭中的“Location"和"Refresh

proxy_set_header 設定由後端的伺服器擷取使用者的主機名或真實IP位址,以及代理者的真實IP位址

client_body_buffer_size 用于指定用戶端請求主體緩沖區大小,可以了解為先儲存到本地再傳給使用者。

proxy_connect_timeout 表示與後端伺服器連接配接的逾時時間,即發起握手等候響應的逾時時間

proxy_send_timeout 表示後端伺服器的資料回傳時間,即在規定時間之内傳完所有的資料,否則,Nginx将斷開這個連接配接。

proxy_read_timeout 設定Nginx從代理的後端伺服器擷取資訊的時間,表示連接配接建立成功後,Nginx等待後端伺服器的響應時間,其實是Nginx已經進入後端的排除之中等候處理的時間。

proxy_buffer_size 設定緩沖區大小,預設該緩沖區大小等于指令proxy_buffers設定的大小

proxy_buffers 設定緩沖區的數量和大小。Nginx從代理的後端伺服器擷取的響應資訊,會放置到緩沖區。

proxy_busy_buffers_size 設定系統很忙時可以使用的proxy_buffers大小,官方推薦的大小為proxy_buffers X 2

proxy_temp_file_write_size 指定proxy緩存臨時檔案的大小。

  #Nginx核心參數優化,Linux系統針對nginx應用而進行的系統核心優化。将下面的核心參數加入/etc/sysctl.conf檔案中  /sbin/sysctl -p       #執行此指令使之生效 

net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.core.somaxconn = 262144
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30 
           

net.ipv4.tcp_max_tw_buckets 選項用來設定timewait的數量,預設是180000,這裡設為6000。

net.ipv4.ip_local_port_range 選項用來設定允許系統打開的端口範圍。

net.ipv4.tcp_tw_recycle 選項用于設定啟用timewait快速回收

net.ipv4.tcp_tw_reuse 選項用于設定開啟重用,允許将TIME-WAIT sockets重新用于新的TCP連接配接。

net.ipv4.tcp_syncookies 選項用于設定開啟SYN Cookies,當出現SYN等待隊列溢出時,啟用cookies進行處理。

net.core.somaxconn 選項的預設值是128,這個參數用于調節系統同時發起的tcp連接配接數,在高并發的請求中,預設的值可能會導緻連結逾時或者重傳,是以,需要結合并發請求數來調節此值。

net.core.netdev_max_backlog 選項表示當每個網絡接口接收資料包的速率比核心處理這些包的速度快時,允許發送到隊列的資料包的最大數目

net.ipv4.tcp_max_orphans 選項用于設定系統中最多有多少個TCP套接字不被關聯到任何一個使用者檔案句柄上。如果超過這個數字,孤立連接配接将立即被複位并列印出警告資訊。這個限制隻是為了防止簡單的Dos攻擊。不過過分依靠這個限制甚至人為減小這個值,更多的情況下應該增加這個值。

net.ipv4.tcp_max_syn_backlog 選項用于記錄那些尚未收到用戶端确認資訊的連接配接請求的最大值。對于有128MB記憶體的系統而方,此參數的預設值是1024,對小記憶體的系統則是128。

net.ipv4.tcp_synack_retries 參數的值決定了核心放棄連接配接之前發送SYN+ACK包的數量。

net.ipv4.tcp_syn_retries 選項表示在核心放棄建立連接配接之前發送的SYN包的數量

net.ipv4.tcp_fin_timeout 選項決定了套接字保持在FIN-WAIT-2狀态的時間。預設值是60秒。正确設定這個值非常重要,有時即使一個負載很小的Web伺服器,也會出現大量的死套接定而産生記憶體溢出的風險。

net.ipv4.tcp_keepalive_time 選項表示當keepalive啟用的時候,TCP發送keepalive消息的頻度。預設值是2(機關是小時) 

  #編譯安裝過程優化 ,減小Nginx編譯後的檔案大小

在編譯Nginx時,預設以debug模式進行,而在debug模式下會插入很多跟蹤和ACCERT之類的資訊,編譯完成後,一個Nginx有好幾兆位元組。而在編譯前取消Nginx的debug模式,編譯完成後Nginx隻有幾百千位元組。是以可以在編譯之前,修改相關源碼,取消debug模式。具體方法如下:

 在Nginx源碼檔案被解壓後,找到源碼目錄下的auto/cc/gcc檔案,在其中找到如下字段:  

# debug
#CFLAGS="$CFLAGS -g"
           

注釋掉這兩行,即可取消debug模式。

繼續閱讀