1. 程式人生 > >nginx 實戰--第二章 nginx配置檔案詳解

nginx 實戰--第二章 nginx配置檔案詳解

1.nginx 配置檔案結構

配置檔案結構

  • 全域性配置(user、worker_processes、error_log、pid)
  • events(網路連線相關,worker_connections)
  • http(最重要的部分,大部分功能都放這裡)
  • server(虛擬主機相關)
  • location(server裡面)

2. 全域性配置

nginx.conf全域性配置
 user nobody;
定義執行nginx服務的使用者,還可以加上組,如 user nobody nobody;

worker_processes 1;
定義nginx子程序數量,即提供服務的程序數量,該數值建議和服務cpu核數保持一致。
除了可以定義數字外,還可以定義為auto,表示讓系統自動調整。

error_log logs/error.log;
定義錯誤日誌的路徑,可以是相對路徑(相對prefix路徑的),也可以是絕對路徑。
該配置可以在此處定義,也可以定義到http、server、location裡

error_log logs/error.log notice;
定義錯誤日誌路徑以及日誌級別.
錯誤日誌級別:常見的錯誤日誌級別有[debug|info|notice|warn|error|crit|alert|emerg],級別越高記錄的資訊越少。
如果不定義預設是error

pid logs/nginx.pid;
定義nginx程序pid檔案所在路徑,可以是相對路徑,也可以是絕對路徑。

worker_rlimit_nofile 100000;
定義nginx最多開啟檔案數限制。如果沒設定的話,這個值為作業系統(ulimit -n)的限制保持一致。
把這個值設高,nginx就不會有“too many open files”問題了。

3.events配置項結構

events配置部分
worker_connections 1024;
定義每個work_process同時開啟的最大連線數,即允許最多隻能有這麼多連線。

accept_mutex on;
當某一個時刻只有一個網路連線請求伺服器時,伺服器上有多個睡眠的程序會被同時叫醒,這樣會損耗一定的伺服器效能。
Nginx中的accept_mutex設定為on,將會對多個Nginx程序(worker processer)接收連線時進行序列化,防止多個程序爭搶資源。
預設就是on。

multi_accept on;
nginx worker processer可以做到同時接收多個新到達的網路連線,前提是把該引數設定為on。
預設為off,即每個worker process一次只能接收一個新到達的網路連線。

use epoll;
Nginx伺服器提供了多個事件驅動器模型來處理網路訊息。
其支援的型別有:select、poll、kqueue、epoll、rtsing、/dev/poll以及eventport。

* select:只能在Windows下使用,這個事件模型不建議在高負載的系統使用

* poll:Nginx預設首選,但不是在所有系統下都可用

* kqueue:這種方式在FreeBSD 4.1+, OpenBSD2.9+, NetBSD 2.0, 和 MacOS X系統中是最高效的

* epoll: 這種方式是在Linux 2.6+核心中最高效的方式

* rtsig:實時訊號,可用在Linux 2.2.19的核心中,但不適用在高流量的系統中

* /dev/poll: Solaris 7 11/99+,HP/UX 11.22+, IRIX 6.5.15+, and Tru64 UNIX 5.1A+作業系統最高效的方式

* eventport: Solaris 10最高效的方式

4. httpd配置項

MIME-Type
include       mime.types;  //cat conf/mime.types
定義nginx能識別的網路資源媒體型別(如,文字、html、js、css、流媒體等)


default_type  application/octet-stream;
定義預設的type,如果不定義改行,預設為text/plain.
log_format
log_format main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

其中main為日誌格式的名字,後面的為nginx的內部變數組成的一串字串。

access_log logs/access.log main;
定義日誌的路徑以及採用的日誌格式,該引數可以在server配置塊中定義。

sendfile on;
是否呼叫sendfile函式傳輸檔案,預設為off,使用sendfile函式傳輸,可以減少user mode和kernel mode的切換,從而提升伺服器效能。
對於普通應用設為 on,如果用來進行下載等應用磁碟IO重負載應用,可設定為off,以平衡磁碟與網路I/O處理速度,降低系統的負載。

sendfile_max_chunk 128k;
該引數限定Nginx worker process每次呼叫sendfile()函式傳輸資料的最大值,預設值為0,如果設定為0則無限制。

tcp_nopush on;
當tcp_nopush設定為on時,會呼叫tcp_cork方法進行資料傳輸。
使用該方法會產生這樣的效果:當應用程式產生資料時,核心不會立馬封裝包,而是當資料量積累到一定量時才會封裝,然後傳輸。這樣有助於解決網路堵塞問題。
預設值為on。舉例:快遞員收快遞、發快遞,包裹累積到一定量才會發,節省運輸成本。

keepalive_timeout 65 60;
該引數有兩個值,第一個值設定nginx伺服器與客戶端會話結束後仍舊保持連線的最長時間,單位是秒,預設為75s。
第二個值可以省略,它是針對客戶端的瀏覽器來設定的,可以通過curl -I看到header資訊中有一項Keep-Alive: timeout=60,如果不設定就沒有這一項。
第二個數值設定後,瀏覽器就會根據這個數值決定何時主動關閉連線,Nginx伺服器就不操心了。但有的瀏覽器並不認可該引數。

send_timeout
這個超時時間是傳送響應的超時時間,即Nginx伺服器向客戶端傳送了資料包,但客戶端一直沒有去接收這個資料包。
如果某個連線超過send_timeout定義的超時時間,那麼Nginx將會關閉這個連線。
client_max_body_size 10m;
瀏覽器在傳送含有較大HTTP包體的請求時,其頭部會有一個Content-Length欄位,client_max_body_size是用來限制Content-Length所示值的大小的。
這個限制包體的配置不用等Nginx接收完所有的HTTP包體,就可以告訴使用者請求過大不被接受。會返回413狀態碼。
例如,使用者試圖上傳一個1GB的檔案,Nginx在收完包頭後,發現Content-Length超過client_max_body_size定義的值,
就直接傳送413(Request Entity Too Large)響應給客戶端。

gzip on;
是否開啟gzip壓縮。
gzip_min_length 1k;
設定允許壓縮的頁面最小位元組數,頁面位元組數從header頭得content-length中進行獲取。預設值是20。建議設定成大於1k的位元組數,小於1k可能會越壓越大。

gzip_buffers 4 16k;
設定系統獲取幾個單位的buffer用於儲存gzip的壓縮結果資料流。4 16k代表分配4個16k的buffer。

gzip_http_version 1.1;
用於識別 http 協議的版本,早期的瀏覽器不支援 Gzip 壓縮,使用者會看到亂碼,所以為了支援前期版本加上了這個選項。
如果你用了Nginx反向代理並期望也啟用Gzip壓縮的話,由於末端通訊是http/1.1,故請設定為 1.1。

gzip_comp_level 6;
gzip壓縮比,1壓縮比最小處理速度最快,9壓縮比最大但處理速度最慢(傳輸快但比較消耗cpu)
gzip_types mime-type ... ;
匹配mime型別進行壓縮,無論是否指定,”text/html”型別總是會被壓縮的。
在conf/mime.conf裡檢視對應的type。

示例:gzip_types       text/plain application/x-javascript text/css text/html application/xml;
gzip_proxied any;
Nginx作為反向代理的時候啟用,決定開啟或者關閉後端伺服器返回的結果是否壓縮,匹配的前提是後端伺服器必須要返回包含”Via”的 header頭。

以下為可用的值:
off - 關閉所有的代理結果資料的壓縮
expired - 啟用壓縮,如果header頭中包含 "Expires" 頭資訊
no-cache - 啟用壓縮,如果header頭中包含 "Cache-Control:no-cache" 頭資訊
no-store - 啟用壓縮,如果header頭中包含 "Cache-Control:no-store" 頭資訊
private - 啟用壓縮,如果header頭中包含 "Cache-Control:private" 頭資訊
no_last_modified - 啟用壓縮,如果header頭中不包含 "Last-Modified" 頭資訊
no_etag - 啟用壓縮 ,如果header頭中不包含 "ETag" 頭資訊
auth - 啟用壓縮 , 如果header頭中包含 "Authorization" 頭資訊
any - 無條件啟用壓縮
Copy

gzip_vary on;
和http頭有關係,會在響應頭加個 Vary: Accept-Encoding ,可以讓前端的快取伺服器快取經過gzip壓縮的頁面,例如,用Squid快取經過Nginx壓縮的資料。

5.server配置項

nginx.conf server部分配置

server{} 包含在http{}內部,每一個server{}都是一個虛擬主機(站點)。

以下為nginx.conf配置檔案中server{}部分的內容。

  server {
    listen       80;  //監聽埠為80,可以自定義其他埠,也可以加上IP地址,如,listen 127.0.0.1:8080;
    server_name  localhost; //定義網站域名,可以寫多個,用空格分隔。
    #charset koi8-r; //定義網站的字符集,一般不設定,而是在網頁程式碼中設定。
    #access_log  logs/host.access.log  main; //定義訪問日誌,可以針對每一個server(即每一個站點)設定它們自己的訪問日誌。

    ##在server{}裡有很多location配置段
    location / {
        root   html;  //定義網站根目錄,目錄可以是相對路徑也可以是絕對路徑。
        index  index.html index.htm; //定義站點的預設頁。
    }

    #error_page  404              /404.html;  //定義404頁面

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;  //當狀態碼為500、502、503、504時,則訪問50x.html
    location = /50x.html {
        root   html;  //定義50x.html所在路徑
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #定義訪問php指令碼時,將會執行本location{}部分指令
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;  //proxy_pass後面指定要訪問的url連結,用proxy_pass實現代理。
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;  //定義FastCGI伺服器監聽埠與地址,支援兩種形式,1 IP:Port, 2 unix:/path/to/sockt
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  //定義SCRIPT_FILENAME變數,後面的路徑/scripts為上面的root指定的目錄
    #    include        fastcgi_params; //引用prefix/conf/fastcgi_params檔案,該檔案定義了fastcgi相關的變數
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    # 
    #location ~ /\.ht {   //訪問的url中,以/.ht開頭的,如,www.example.com/.htaccess,會被拒絕,返回403狀態碼。
    #    deny  all;  //這裡的all指的是所有的請求。
    #}
}


# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
#    listen       8000;  //監聽8000埠
#    listen       somename:8080;  //指定ip:port
#    server_name  somename  alias  another.alias;  //指定多個server_name

#    location / {
#        root   html;
#        index  index.html index.htm;
#    }
#}


# HTTPS server
#
#server {
#    listen       443 ssl;  //監聽443埠,即ssl
#    server_name  localhost;

### 以下為ssl相關配置
#    ssl_certificate      cert.pem;    //指定pem檔案路徑
#    ssl_certificate_key  cert.key;  //指定key檔案路徑

#    ssl_session_cache    shared:SSL:1m;  //指定session cache大小
#    ssl_session_timeout  5m;  //指定session超時時間
#    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;   //指定ssl協議
#    ssl_ciphers  HIGH:!aNULL:!MD5;  //指定ssl演算法
#    ssl_prefer_server_ciphers  on;  //優先採取伺服器演算法
#    location / {
#        root   html;
#        index  index.html index.htm;
#    }
#}