初學Nginx,感覺Nginx配置文件中指令以及參數各類繁多,總結成博客備忘,也便廣大Linux愛好者學習交流,因爲時間原因,總結的不夠全面後續會不斷完善此博文,筆者水平有限,如有疏漏不妥之處,還請不吝賜教!
以下內容部分參考互聯網和 南非螞蟻(高俊峯)所著的 《高性能Linux服務器構建實戰運行監控、性能調優與集羣應用》一書,
感謝開源前輩以及Linux先行者提供的寶貴資料,如有侵權之處,請馬上通知,本人立即刪除;
#user nobody; #指定 Nginx Worker進程運行用戶以及用戶組,默認由 nobody運行; worker_processes 1; #指定Nginx要開啓的進程數,默認情況下是1,如果存在多顆CPU,設置爲和CPU同樣的數量即可;
# 全局錯誤日誌位置及PID文件位置:
#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid;
events { # 用來設定Nginx的工作模式及連接數上限; worker_connections 1024; 用於定義Nginx每個進程的最大連接數,默認爲12024; # 併發總數是 worker_processes 和 worker_connections 的乘積 # 即 max_clients = worker_processes * worker_connections # 進程的最大連接數受Linux系統進程的最大打開 文件數限制,在執行操作系統命令"ulimit -n 65536"後 worker_connections的設置纔會生效; } http { include mime.types; # 設定mime類型,類型由mime.type文件定義; default_type application/octet-stream; # 默認類型爲二進制流,當文件類型未定義時使用這種方式; }
#定義日誌格式:
#log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; #訪問日誌記錄位置 並使用main格式記錄
log_format:Nginx的HttpLog模塊指令,用於指定Nginx日誌的輸出格式,main 爲此日誌格式名稱;
$remote_addr:客戶端IP地址
$remote_user:如果需要客戶端登陸才能訪問,記錄客戶端使用哪個用戶登陸;
$time_local:訪問時間與時區;
$request:用戶的原始請求URL,與http協議(包含整個請求符);
$status:狀態碼,成功即爲200
$body_bytes_sent:發送給客戶端的主體內容大小
$http_referer:從哪個頁面鏈接跳轉過來
$http_user_agent:客戶端瀏覽器類型
$http_x_forwarded_for:客戶端的IP地址
$remote_addr與$http_x_forwarded_for的區別:
通常web服務器放在反向代理的後面,這樣就不能獲取到客戶的IP地址了,通過$remote_add拿到的IP地址是反向代理服務器的iP地址。反向代理服務器在轉發請求的http頭信息中,可以增加x_forwarded_for信息,用以記錄原有客戶端的IP地址和原來客戶端的請求的服務器地址;
client_max_body_size 20m; # 允許客戶端請求的最大單個文件字節數(通過Nginx上傳單個文件大小); client_header_buffer_size 32k; # 指定來自客戶端請求頭的headerbuffer大小,對於大多數請求1KB緩衝區大小已經足夠,如果自定義了消息頭或有更大的cookie,可以增加緩衝區大小,此處定義爲32KB; large_client_header_buffers 4 32k; # 用來指定客戶端請求中較大的消息頭緩存最大數量和大小,4代表個數,128K代表大小,最大緩存爲4個128KB; # nginx默認會用client_header_buffer_size這個buffer來讀取header值,如果header過大,它會使用large_client_header_buffers來讀取如果設置過小HTTP頭/Cookie過大 會報400 錯誤nginx 400 bad request 求行如果超過buffer,就會報HTTP 414錯誤(URI Too Long)nginx接受最長的HTTP頭部大小必須比其中一個buffer大,否則就會報400的HTTP錯誤(Bad Request)。
sendfile on; # 開啓高效文件傳輸模式, 指定nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件 # 對於普通應用,必須設爲 on, # 如果用來進行下載等應用磁盤IO重負載應用,可設置爲 off, # 以平衡磁盤與網絡I/O處理速度,降低系統的uptime. tcp_nopush on; # 此選項允許或禁止使用socke的TCP_CORK的選項,此選項僅在使用sendfile的時候使用 tcp_nodelay on; keepalive_timeout 0; keepalive_timeout 65; # 此處將保持時間設置爲 65; # 用於設置客戶端連接保持活動的超時時間,開啓長連接以後,超過這個時間服務器會自動關閉這個連接; client_header_timeout 10; # 設置客戶端請求頭讀取超時時間,如果超過時間客戶端還沒有發送任何數據,Nginx將返回 "Request time out (408)" 錯誤; client_body_timeout 10; # 設置客戶端請求主體讀取超時時間,默認爲60。超過這個時間,客戶端沒有發送任何數據,Nginx將返回 "Request time out (408)"錯誤;
send_timeout 10; # 用於指定響應客戶端的超時時間,超時僅限於兩個連接活動之間的時間,如果超過這個時間,客戶端沒有任何活動,Nginx將會關閉連接; proxy_connect_timeout 90; # 後端服務器連接的超時時間_發起握手等候響應超時時間 proxy_read_timeout 180; # 連接成功後等候後端服務器響應時間其實已經進入後端的排隊之中等候處理(也可以說是後端服務器處理請求的時間) proxy_send_timeout 180; # 後端服務器數據回傳時間_就是在規定時間之內後端服務器必須傳完所有的數據 proxy_buffer_size 256k; # 設置從被代理服務器讀取的第一部分應答的緩衝區大小,通常情況下這部分應答中包含一個小的應答頭,默認情況下這個值的大小爲指令proxy_buffers中指定的一個緩衝區的大小,不過可以將其設置爲更小 proxy_buffers 4 256k; # 設置用於讀取應答(來自被代理服務器)的緩衝區數目和大小,默認情況也爲分頁大小,根據操作系統的不同可能是4k或者8k proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k; # 設置在寫入proxy_temp_path時數據的大小,預防一個工作進程在傳遞文件時阻塞太長 proxy_temp_path /data0/proxy_temp_dir;
注意:此下的所有設置只有在編譯時安裝了 HttpGzip 模塊纔會被啓用:
#gzip on; #gzip_min_length 1k; #gzip_buffers 4 16k; #gzip_http_version 1.1; #gzip_comp_level 2; #gzip_types text/plain application/x-javascript text/css application/xml; #gzip_vary on;
# gzip 用於設置開啓或關閉gzip模塊,"gzip on"表示 開啓gzip壓縮;
# gzip_min_length 設置 允許壓縮的頁面最小字節數,頁面字節數從header頭的Content-length中獲
取,默認值爲0,不管頁面多大都進行壓縮,建議更改成大於1K,不然會越壓越大;
# gzip_buffers 表示申請4個單位爲16K的內存作爲壓縮結果流緩存,默認值是申請與原始數據大小相
同的內存空間來存儲gzip壓縮結果;
# gzip_http_version 設置識別HTTP協議版本,默認爲1.1,目前大部分瀏覽器已經支持gzip解壓,使
用默認即可;
# gzip_comp_level 指定gzip壓縮比,範圍1-9 1壓縮比最小,處理速度快,9壓縮比最大,傳輸速度
快節約帶寬,但處理起來慢,也較消耗CPU資源;
# gzip_types 指定壓縮哪些文件,無論是否指定,默認情況下 text/html 類型總會被壓縮
# gzip_vary 可以讓前端緩存服務器緩存經過gzip壓縮的頁面;
server{ # 用來標誌虛擬主機開始 listen 80; # 指定虛擬主機監聽在哪個套接字上; server_name 192.16.12.188 www.nginx.com; # 設置 IP地址或域名,多個域名間用空格分開 index index.html index.htm index.jsp; # 設置 訪問的默認首頁地址 root /web/www/; # 指定虛擬主機的網頁根目錄,這個目錄可是相對路徑,也可是絕對路徑; charset gb2312; # 設置 網頁默認編碼格式; access_log logs/nginx.access.log main; # 設定本虛擬主機的訪問日誌 }
Nginx地址匹配相當強大,location 支持正則表達式匹配,也支持條件判斷匹配,用戶可以通過location指定實現Nginx對動靜態網頁的過濾處理:
匹配方法:
=:精確匹配,把用戶請求的URI,與各location匹配
~:正則表達式模式匹配,匹配時區分字符大小寫
~*:正則表達式模式匹配,不區分字符大小寫
^~:做URI的前半部分匹配,匹配時不檢查正則表達式;
匹配規則:
匹配優先級:精確匹配(=)、^~、~ 和 ~*、最後由不帶符號的URL進行左側匹配
當被多個location所匹配時,這些優先級還一樣,就會被第一個location所匹配;
此處有三個小例子:
1、通過location指令來對網頁URL進行分析處理,~ 代表使用正則表達式 .* 代表以任意開頭任意長度,.代表本身的意義,可以是擴號內的任何結尾,也就是說所有擴展名爲.gif、.jpg、.jpeg、.png、.bmp、.swf的靜態文件都交給Nginx處理;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { root /web/www/www.nginx.com; # 匹配到哪個目錄 expries 30d; # 靜態文件過期時間 }
2、將upload和html下的所有文件都交給Nginx來處理,前提是upload和html目錄包含在/web/www/www.nginx.com目錄中
location ~ ^/(upload|html)/ { root /web/www/www.nginx.com; expries 30d; }
3、location 將所有以 .jsp 爲後綴的文件都交給本機的 8080 端口處理;
location ~ .*.jsp$ { index index.jsp; proxy_pass http://localhost:8080; }