1. 程式人生 > >深入Nginx之《常用參數配置技巧》

深入Nginx之《常用參數配置技巧》

優化 應用 fin zip lis 靜態 服務器錯誤 keepal 分配

常見參配置實戰技巧

下面會講解實戰中應該怎麽配置更為合理。


1.user

默認是nobody,如果使用nobody,Nginx在運行過程中會出現很多操作沒有權限,比如寫硬盤。一般都是用低於root級別的用戶,比如www,並且可以在linux下設置www禁止ssh登錄服務器,提高安全性;

2.worker_processes

代表Nginx worker的進程數,一般情況下建議和機器的核數相同,也可以配置 worker_processes auto ; (Nginx1.2.5版本添加的) 自動根據cpu核數進行進程啟動;

但是實際應用中,服務器不一定只跑了Nginx,需要考慮機器資源會被分配到哪些服務上,避免進程啟動過多,和其他服務競爭cpu,導致過多上下文切換;

3.worker_cpu_affinity auto

Nginx 1.9.10添加的功能,表示可以根據服務器的核數自動配cpu親緣性,提升Nginx的性能;

4、error_log & access_log

關於日誌記錄的,error_log 配置為error級別, 減少不必要的日誌記錄, 如果是測試環境可以開啟info級別。日誌記錄需要考慮硬盤的獨立性,不要使用linux的根分區,避免大量的io影響Linux服務器吞吐能力。單獨掛載一個磁盤,獨立使用io;

另外硬盤的使用壽命需要註意,關註message的日誌,定期檢查硬盤(Nginx記錄日誌是異步處理,並且不會因為硬盤的問題,導致請求異常,但是會影響日誌的記錄) ;

5.worker_priority

配置Nginx在linux服務器上資源使用的優先級,作為反向代理服務,應該擁有極高的優先級,建議配置到-10;

6.gzip_comp_level

壓縮等級,等級最高為9,等級越高壓縮後的文件越小,但是消耗的cpu也會更多,經過測試,壓縮等級7 和 9 的文件大小相比,其實只有細微的差別,用5-7的等級足矣;

7.upstream塊

配置上遊服務器,可以結合 proxy_next_upstream 等指令做大量的優化,我會在下面的章節單獨說明;

8.error_page

錯誤重定向,可以捕獲上遊服務器錯誤的狀態碼後,將請求重定向到其它地方,比如提供友好頁面,關於error_page的更強大的使用方式。

9.location & root

通過root路徑可以讀取靜態文件,在1.7.11以前的版本,Nginx讀取硬盤的文件,都是阻塞型操作,後面引入了線程池,使得讀取硬盤提供了非阻塞的操作,極大的提升了硬盤的io,也提升了proxy_cache的能力。

Nginx的常見配置在使用中都有著不同的變化,那麽對於更為復雜的配置來說,其配置就顯得更為精妙了,所以熟悉Nginx的官方wiki是發揮它巨大作用的基礎。

常見配置註解


user www www;

#定義Nginx運行的用戶和用戶組

worker_processes 2;

#Nginx進程數

worker_cpu_affinity auto;

#配置Nginx進程cpu親源性

error_log /var/log/error_log info;

#全局錯誤日誌定義類型 ,默認是error

worker_rlimit_nofile 65535;

#一個Nginx進程打開的最多文件描述符數量

pid /var/run/nginx.pid;

#進程文件

worker_priority -10;

#linnx系統下的資源使用的優先級

worker_rlimit_nofile 65535;

#worker進程的最大打開文件數限制

worker_shutdown_timeout 30;

#30s內Nginx無法平滑退出,就強行關閉進程

events {

worker_connections 10000;

#單個進程最大連接數(整個Nginx最大連接數=連接數*進程數)

use epoll;

#epoll linux2.6+內核高性能的網絡io, 如果跑在FreeBSD上面,就用kqueue模型。

}

http {

include conf/mime.types;

#文件擴展名與文件類型映射表

default_type application/octet-stream;

#默認文件類型

log_format main ‘$remote_addr - $remote_user [$time_local] ‘

‘"$request" $status $bytes_sent ‘

‘"$http_referer" "$http_user_agent" ‘

‘"$http_cookie"‘;

#定義日誌格式

client_header_buffer_size 1k;

#設置用戶請求頭所使用的buffer大小

large_client_header_buffers 4 4k;

#當默認的緩沖不夠用時就會使用此參數。

server_names_hash_bucket_size 128;

#服務器名字的hash表大小

client_header_buffer_size 32k;

#上傳文件大小限制

gzip on;

#開啟gzip

gzip _comp_level 6;

#壓縮等級

gzip _min_length 1100;

#設置允許壓縮的頁面最小字節數

gzip _buffers 4 8k;

#設置系統獲取幾個單位的緩存用於存儲gzIP的壓縮結果數據流。4 8k 代表以8k為單位,按照原始數據大小以8k為單位的4倍申請內存。

gzip _types text/plain text/css;

#匹配MIME類型進行壓縮

output_buffers 2 32k;

#設置用於從磁盤讀取響應的緩沖區的數量和大小。 此設置為:按照原始數據大小以32K為單位的2倍大小申請內存空間。

sendfile on;

#啟用sendfile()函數

tcp_nopush on;

#防止網絡阻塞,需要sendfile開啟

tcp_nodelay on;

#防止網絡阻塞,需要sendfile開啟

keepalive_timeout 90s;

#長連接超時時間,單位是秒

upstream backend {

server 192.168.1.12:8081 weight=3;

server 192.168.1.13:8081 weight=2;

}

#upstream塊,weight是權重,權重越高,請求的比例越高。

server {

listen 80;

#http監聽端口

server_name your.example.com;

#域名

access_log /var/log/nginx.access_log main;

#訪問日誌記錄

charset koi8-r;

#默認編碼

location / {

proxy_pass http://backend ;

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; }

#後端的應用服務器通過X-Forwarded-For獲取用戶的真實IP

error_page 404 /404.html;

#對於後端應用服務器拋出的錯誤404 進行頁面重定向

location /404.html {

root /spool/www;

}

# 匹配URL為jpg,jpeg,gif結尾的,直接去系統文件讀取

location ~* \.(jpg|jpeg|gif)$ {

root /spool/www;

expires 30d;

#瀏覽器緩存的時間

}

}

深入Nginx之《常用參數配置技巧》