nginx 實戰--第二章 nginx配置檔案詳解
阿新 • • 發佈:2018-11-26
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;
# }
#}