Nginx配置文件優化詳解

Nginx配置文件優化詳解

對nginx進行優化是重點也是難點,這裏給出一些常用的優化措施,以及相關參數的所代表的意思。有些參數需要結合公司服務器進行設置。

全局變量的優化:

#定義Nginx運行的用戶和用戶組user  www  www;
#啓動進程,通常設置成和cpu的數量相等
worker_processes  8;
#爲每個進程分配cpu。
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
#該指令是當一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(ulimit -n)與nginx進程數相除,
#但是nginx分配請求並不是那麼均勻,所以最好與ulimit -n的值保持一致。
worker_rlimit_nofile  102400;
#全局錯誤日誌及PID文件
error_log  /usr/local/nginx/logs/error.log; 
#錯誤日誌定義等級,[ debug | info | notice | warn | error | crit ]加在後面即可。
#定義pid文件
pid        /usr/local/nginx/nginx.pid;

events {
use   epoll;             	
#epoll是多路複用IO(I/O Multiplexing)中的一種方式,可以大大提高nginx的性能。
worker_connections  10240;	
#單個後臺worker process進程的最大併發鏈接數 (最大連接數=連接數*進程數)
multi_accept  on; 
#儘可能多的接受請求.
}
#設定http服務器,利用它的反向代理功能提供負載均衡支持
http {
#設定mime類型,類型由mime.type文件定義
include       mime.types;
#定義默認的MIME類型;default_type  application/octet-stream;
#定義日誌格式
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$request_time"';
#設定訪問日誌路徑
access_log    /usr/local/nginx/log/nginx/access.log;
sendfile      on;
#sendfile 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件,對於普通應用必須設爲on
#如果用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡I/O處理速度,降低系統的uptime。
#autoindex  on;  
#開啓目錄列表訪問,適合下載服務器,默認關閉。
tcp_nopush on;   
#防止網絡阻塞,只有在sendfile被使用時纔會激活。
keepalive_timeout  120;
#keepalive超時時間,客戶端到服務器端的連接持續有效時間,當出現對服務器的後繼請求時,
#keepalive-timeout功能可避免建立或重新建立連接。(節省服務器資源、CPU、內存、網卡)
tcp_nodelay   on; 
#提高數據的實時響應性,僅在將連接轉變爲長連接的時候才被啓用(在upstream發送響應到客戶端時也會啓用)
#開啓gzip壓縮
gzip on;
#設置允許壓縮的頁面最小字節數。
gzip_min_length  1k;
#設置系統獲取幾個單位的緩存用於存儲gzip的壓縮結果數據流。 
#4 16k代表以16k爲單位,按照原始數據大小以16k爲單位的4倍申請內存。
gzip_buffers     4 16k;
#設置支持http協議的最小壓縮版本。現在大多瀏覽器都支持。
gzip_http_version 1.1;
#壓縮級別大小,最大爲9,值越小,壓縮後比例越小,CPU處理更快。
#值越大,消耗CPU比較高。
gzip_comp_level  6; 
#支持壓縮的類型。
gzip_types       text/plain application/x-javascript text/css application/xml;
#在http頭文件中加個“Vary: Accept-Encoding”,給代理服務器用的,有的瀏覽器支持壓縮,有的不支持
#所以避免浪費不支持的也壓縮,所以根據客戶端的HTTP頭來判斷,是否需要壓縮
gzip_vary on;
#對IE6進行壓縮,不過IE6目前已經淘汰。
#gzip_disable "MSIE [1-6]."
client_max_body_size 10m;      
#允許客戶端請求的最大單文件字節數
client_body_buffer_size 128k; 
#緩衝區代理緩衝用戶端請求的最大字節數.
proxy_connect_timeout 90;      
#nginx跟後端服務器連接超時時間(代理連接超時)
proxy_send_timeout 90;         
#後端服務器數據回傳時間(代理髮送超時)
proxy_read_timeout 90;         
#連接成功後,後端服務器響應時間(代理接收超時)
proxy_buffer_size 4k;          
#設置代理服務器(nginx)保存用戶頭信息的緩衝區大小
proxy_buffers 4 32k;           
#proxy_buffers緩衝區,網頁平均在32k以下的話,這樣設置
proxy_busy_buffers_size 64k;   
#高負荷下緩衝大小(proxy_buffers*2)
large_client_header_buffers  4 4k;
#設置讀取客戶端請求超大請求的緩衝最大number(數量)和每塊緩衝的size(容量)。 
#HTTP請求行的長度不能超過一塊緩衝的容量,否則nginx返回錯誤414 (Request-URI Too Large)到客戶端。 
#每個請求頭的長度也不能超過一塊緩衝的容量,否則nginx返回錯誤400 (Bad Request)到客戶端。
client_header_buffer_size 4k;
#客戶端請求頭部的緩衝區大小,這個可以根據你的系統分頁大小來設置,一般一個請求的頭部大小不會超過1k
#不過由於一般系統分頁都要大於1k,所以這裏設置爲分頁大小。分頁大小可以用命令getconf PAGESIZE取得。
open_file_cache max=102400 inactive=20s;
#這個將爲打開文件指定緩存,默認是沒有啓用的,max指定緩存數量,建議和打開文件數一致,inactive是指經過多長時間文件沒被請求後刪除緩存。
open_file_cache_valid 30s;
#這個是指多長時間檢查一次緩存的有效信息。open_file_cache_min_uses 1;
#open_file_cache指令中的inactive參數時間內文件的最少使用次數,如果超過這個數字,文件描述符一直是在緩存中打開的,如上例,如果有一個文件在inactive
#包含其它配置文件,如自定義的虛擬主機
include vhosts.conf;

虛擬主機配置文件的優化

upstream backend {        
        #配置後端服務器的權重。如果在30秒內請求失敗兩次自動剔除
		server   127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=30s;
		server   127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=30s;
		server   127.0.0.1:8082 weight=1 max_fails=2 fail_timeout=30s;
		server   127.0.0.1:8083 weight=1 max_fails=2 fail_timeout=30s;
	}   
	#虛擬主機配置
	server {		#偵聽80端口
        listen       80;        #定義使用www.abc.com訪問
        server_name  www.abc.com;        #設定本虛擬主機的訪問日誌
        access_log  logs/access.log  main;
			root   /data/webapps/www;  #定義服務器的默認網站根目錄位置
        index index.php index.html index.htm;   #定義首頁索引文件的名稱
        #默認請求
        location ~ /{
          root   /data/webapps/www;      #定義服務器的默認網站根目錄位置
          index index.php index.html index.htm;   #定義首頁索引文件的名稱
          
          #以下是一些反向代理的配置.
          proxy_next_upstream http_502 http_504 error timeout invalid_header;		 
	  #如果後端的服務器返回502、504、執行超時等錯誤,自動將請求轉發到upstream負載均衡池中的另一臺服務器,實現故障轉移。
          proxy_redirect off;        
           #允許重新定義或者添加發往後端服務器的請求頭
          proxy_set_header Host $host;          
          #把真實客戶端IP寫入到請求頭X-Real-IP,在NginxBackend輸出$http_x_real_ip獲取到了真實客戶端IP
          #而Nginx Backend的“$remote_addr”輸出爲最後一個反向代理的IP;
          proxy_set_header X-Real-IP $remote_addr;          
          #把請求頭中的X-Forwarded-For與$remote_addr用逗號合起來,
          #如果請求頭中沒有X-Forwarded-For則$proxy_add_x_forwarded_for爲$remote_addr。
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;          
          #設置代理使用的HTTP協議版本。默認使用的版本是1.0
          proxy_http_version 1.1;
          proxy_set_header Connection "";         
           #設置允許客戶端請求正文的最大長度。
          client_max_body_size    100m;          
          #請求轉向後端定義的均衡模塊,和前面的指定對應。
           proxy_pass  http://backend;   
        # 定義錯誤提示頁面
			error_page   500 502 503 504 /50x.html;  
            location = /50x.html {
            root   html;
        }		#配置Nginx動靜分離,定義的靜態頁面直接從Nginx發佈目錄讀取。
		location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
		{
			root /data/webapps/www;			
			#expires定義用戶瀏覽器緩存的時間爲3天,如果靜態頁面不常更新,可以設置更長,這樣可以節省帶寬和緩解服務器的壓力,在瀏覽器保存該類型文件的天數。
			expires      3d;
		}       
        #PHP腳本請求全部轉發到 FastCGI處理. 使用FastCGI默認配置.
        location ~ \.php$ {
            root /root;
            FastCGI_pass 127.0.0.1:9000;
            FastCGI_index index.php;
            FastCGI_param SCRIPT_FILENAME /data/webapps/www$FastCGI_script_name;
            include FastCGI_params;
        }        
        #設定查看Nginx狀態的地址
        location /NginxStatus {
            stub_status  on;
        }
     }
}

主要涉及開啓的線程數量,綁定CPU,啓動壓縮,如果有代理還涉及到後後端服務器的交互時間等優化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章