環境:centos7 nginx1.16.1
如下配置均在配置文件中進行:/etc/nginx/nginx.confhtml
1.設置工做進程的全部者和所屬組node
user 全部者 所屬組; nginx
設置後要在操做系統中設置該用戶和用戶組web
/usr/sbin/groupadd www /usr/sbin/useradd -g www wwwcentos
2. 網絡鏈接事件模型設置 瀏覽器
event{服務器
accept_mutex on; #設置網路鏈接序列化,防止驚羣現象發生,默認爲oncookie
multi_accept on; #設置一個進程是否同時接受多個網絡鏈接,默認爲off網絡
worker_connections 1024; #每一個工做進程的最大鏈接數,默認爲512併發
use epoll; #參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
}
3. 服務器返回文件的MIME類型設置
include mime.types; #引入的mime.types文件用來幫助http協議判斷網頁文件的MIME類型,該項做用域 http server
mime.types文件:文件擴展名與文件類型映射表 服務器根據mime.types文件,由網頁文件擴展名獲得其MIME類型,並加在響應頭中發送給瀏覽器
default_type application/octet-stream #當文件類型未定義時,默認返回的MIME類型。做用域爲 location http
注意:圖片,音頻,視頻等文件要在html文件才能被瀏覽器展現和播放,但若是不設置default_type application/octet-stream 這一項,服務器直接返回MIME類型爲
image/jpeg ,audio/mp4...的響應頭,瀏覽器不會有任何動做,設置此類文件爲二進制流後,瀏覽器接受到該響應頭,會產生一個下載窗口,從而在客戶端獲取服務器文件
設置MIME類型爲application/octet-stream(二進制流文件,瀏覽器打開會出現下載)
4. 客戶端相關配置
client_max_body_size 10m; #客戶端請求服務器時發送的請求主體最大容量。該配置項做用域http,server,location 。值爲0,則不受限制
client_header_buffer_size 32k; #用於指定來自客戶端請求頭緩衝區大小,對於大多數請求,1KB的緩衝區大小已經足夠,若是自定義了消息頭或有更大的cookie,能夠增長緩衝區大小。
large_client_header_buffers 4 64k; #設置客戶端請求頭的緩衝區的最大數目和大小。請求行不能超過一個緩衝區的大小,請求頭字段也不能超過一個緩衝區的大小。緩衝區僅按需分配。
默認狀況下,緩衝區大小等於8K字節。若是在請求處理結束後,鏈接轉換爲keep alive狀態,則釋放這些緩衝區。
client_body_temp_path filename [level1] [level2 ] [lever3 ]; #設定服務器用於存儲客戶端請求報body部分的臨時存儲路徑及子目錄結構和數量
level1:一級目錄個數,1表示目錄數不超過1位16進制數,故最大值爲16
level2:二級目錄個數,2表示目錄數不超過2位16進制數,故最大值爲16*16=256
level3:三級目錄個數
client_body_buffer_size 32k; #設定服務器用於接收每一個客戶端請求報文的body部分的緩衝區大小;默認爲16k;
5. 文件傳輸方式設置
sendfile on; #以sendfile方式傳輸文件,默認開啓。做用域:http location server
指定是否使用sendfile系統調用來傳輸文件。sendfile系統調用在兩個文件描述符之間直接傳遞數據(徹底在內核中操做),
從而避免了數據在內核緩衝區和用戶緩衝區之間的拷貝,操做效率很高,被稱之爲零拷貝。
傳統文件傳輸方式:read,write/send 步驟以下:
-
- 調用read函數,文件數據拷貝到內核緩衝區
- read函數返回,數據從內核緩衝區拷貝到用戶緩衝區
- 調用write/send函數,將數據從用戶緩衝區拷貝到內核socket緩衝區
- 數據從內核socket緩衝區拷貝到協議引擎中
在這個過程中,文件數據其實是通過了四次拷貝操做:
硬盤—>內核緩衝區—>用戶緩衝區—>內核socket緩衝區—>協議引擎
sendfile傳輸方式:
1. sendfile系統調用利用DMA引擎將文件數據拷貝到內核緩衝區,以後數據被拷貝到內核socket緩衝區中
2. DMA引擎將數據從內核socket緩衝區拷貝到協議引擎中
硬盤—>內核緩衝區—>內核socket緩衝區—>協議引擎
sendfile_max_chunk 100k; #每一個進程調用sendfile傳輸數據的最大值
6. 設置超時
a. nginx與客戶端的超時設置
(1)客戶端請求頭超時時間
client_header_timeout 60s; #一次TCP鏈接中,nginx服務器接收到客戶端一個完整請求頭的最長時間,超過則斷開tcp鏈接,並返回408
(2)客戶端請求體超時時間
client_body_timeout 60s; #一次TCP鏈接中,nginx服務器接收到客戶端一個完整請求體的最長時間,超過則斷開tcp鏈接,並返回408
(3)send_timeout 60s; #一次TCP鏈接中,2次向客戶端發送響應報文的間隔最大時間,超過這個時間則斷開TCP鏈接
b. nginx與代理服務器的超時設置
proxy_connect_timeout 65s; #默認60s,不能超過75秒,發起握手到等候響應的時間(創建請求的時間)
proxy_read_timeout 60s; #創建tcp鏈接後,等候服務器響應的時間(處理請求的時間),大於這個時間則斷開鏈接
proxy_send_timeout 60s; #upstream服務器從開始響應到響應結束的時間,大於這個時間則斷開鏈接
server 主機地址 [fail_timeout=30] [max_fails=1]; #可選項不寫則默認 10s 1, 做用域upstream
在fail_timeout時間內,某個server鏈接失敗了max_fails次,則認爲這個主機不工做了,並在接下來的 fail_timeout時間內,nginx再也不將請求分發給失效的server
c.其它超時設置
(1)設置延遲關閉鏈接時間
lingering_timeout 5s; #默認值5s,做用域 http serverr location。
在關閉鏈接前,會檢測是否有用戶發送的數據到達服務器,
若是超過lingering_timeout時間後尚未數據可讀,就直接關閉鏈接;不然,必須在讀取完鏈接緩衝區上的數據並丟棄掉後纔會關閉鏈接。
(2)設置DNS解析超時時間
resolver_timeout 5s; #默認值30s
(3)設置長鏈接的時間
keepalive_timeout 65s; #一個http請求完成以後,保持TCP鏈接的時長,默認75s
(4)
504 Gateway Time-out
通常看來, 這種狀況多是因爲nginx默認的fastcgi進程響應的緩衝區過小形成的, 這將致使fastcgi進程被掛起, 若是你的fastcgi服務對這個掛起處理的很差,
那麼最後就極有可能致使504 Gateway Time-out。如今的網站, 尤爲某些論壇有大量的回覆和不少內容的, 一個頁面甚至有幾百K默認的fastcgi進程響應的緩衝區是8K,
咱們能夠設置大點在nginx.conf裏, 加入:fastcgi_buffers 8 128k 這表示設置fastcgi緩衝區爲8×128k,固然若是您在進行某一項即時的操做, 可能須要nginx的超時參數調大點,
例如設置成60秒: send_timeout 60;
(
7. 長鏈接配置
(1)一次長鏈接的請求數
keepalive_requests 60; #一次tcp鏈接中,服務器接收請求的最大次數,超過則關閉鏈接
(2)瀏覽器長鏈接設置
keepalive_disable none | 瀏覽器名; #對哪一種瀏覽器禁用長鏈接,none表示全部瀏覽器都開啓
Mozilla--火狐 Opera--歐鵬 MSIE--IE瀏覽器
8. 錯誤頁配置
error_page 404 [200] https://www.baidu.com; #發生404錯誤時顯示的頁面。做用域server location http
可選參數爲發生錯誤時,返回給客戶端的狀態碼,防止返回404後頁面被劫持
9. 引入配置文件
include 文件名; #引入額外配置文件到主配置文件。做用域 http
10. TCP相關設置
tcp_nodelay on | off; #請求是否延遲發送。做用域http server location
當爲off時,延遲發送,合併多個請求後再發送,湊齊多個請求後在發送給後臺處理,可是這個狀況可能會致使客戶端等待,會比較慢,因此通常是不延遲發送,默認on時,不延遲發送
tcp_nopush on; #防止網絡阻塞
11. 監聽端口設置
listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [ssl] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]]; #監聽的主機及端口,不寫端口默認80,網絡數據都是經過該監聽的端口傳輸
address 監聽的主機,即web服務主機
default_server 該虛擬主機設定爲默認虛擬主機
ssl 限制僅可以經過ssl鏈接提供服務,即只能以https訪問
backlog=number 超過併發鏈接數後,新請求進入後援隊列的長度
rcvbuf=size 接收緩衝區大小
sndbuf=size 發送緩衝區大小
12. 響應報文的設置
server_tokens on | off | build | string; #是否在響應報文的首部顯示nginx版本,默認是on,建議設置爲off,隱藏版本號
13.