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,啓動壓縮,如果有代理還涉及到後後端服務器的交互時間等優化。