Nginx配置指南

2021-08-19 09:04:12 字數 3011 閱讀 4494

對nginx的學習並不多,但使用起來特別順手且心中莫名放心,本文分享乙份自己的nginx配置,並選擇其中的一些配置項做些說明。

nginx配置檔案預設存放在/etc/nginx/nginx.conf,裡面主要是http上下文的配置內容,而server等內容常被拆分成子檔案通過include引入,以下是自己的nginx配置內容:

這份配置自己經常使用,偶爾根據環境不同做些區域性調整,下面從作用與目的方面挑選部分內容進行說明。

1-4行主要是全域性設定,內容比較簡單,由於自己的伺服器長期只使用root使用者,所以這裡忽視了一些安全性風險而堅持使用root使用者,避免檔案許可權帶來的訪問異常。

初學者在剛安裝並啟動nginx時,最常見的乙個錯誤就是403 forbidden,通常原因是因為nginx預設使用乙個名為nginx的使用者作為work程序的所有者,而所登入使用者的home目錄往往都有許可權限制,導致work程序沒有許可權訪問使用者home目錄下的資源,從而返回403。

nginx通常是由乙個master程序協調排程多個work程序,當accept_mutex開啟時,work程序會輪流接收新連線,此時為每個work程序所分配的負載相對均衡,如果關閉accept_mutex,當乙個新的連線到到達時,不同work程序需要以「爭奪」的方式獲得該連線。當系統處於正常負載下執行,短暫的爭奪會導致部分系統資源消耗過高與浪費,所以選擇開啟accept_mutex,避免這種浪費。

雖然開啟accept_mutex可以讓多個worker得到的連線相對均衡,卻並不一定就是優點,假設存在10個worker,100個連線請求在開啟accept_mutex的情況下會分配給每個worker10個,過了1分鐘又來了100個連線請求,這時候也許部分worker早就處理好了自己手上10個連線,還有部分worker由於得到的是棘手任務還在繼續忙活著處理之前的10個連線,這時候依舊平分這100個連線給10個worker是有些不合適的,可能會導致部分worker負載過高引起其它問題。這個場景完全是自己假想的,只為了表明有這種可能,主觀認為機率極微,故不考慮。

正常如果將乙個靜態資源傳送給客戶端,一般需要通過read將資料從硬碟讀取到記憶體,然後通過write將資料從記憶體寫入socket,這個過程的資料流向是:disk -> kernel buffer -> user buffer -> kernel socket buffer -> 協議棧 -> done,整個過程涉及4次user space與kernel space上下文切換以及4次資料拷貝。

sendfile系統呼叫目的是簡化通過網路在兩個本地檔案之間進行的資料傳輸過程,其資料流向是:disk -> kernel buffer -> 協議棧 -> done,整個過程只有2次user space與kernel space上下文切換以及2次資料拷貝,相比read/write減少了一半的上下文切換與資料拷貝次數,因而可以提高效能。

nginx中開啟sendfile配置選項即可享受sendfile系統呼叫所帶來的優化,但仍需注意該優化僅針對靜態資源處理有效,對於反向**並不起作用,這是因為sendfile中資料來源控制代碼只能是檔案控制代碼,而反向**的雙端都是socket控制代碼,導致不能使用sendfile。

由於sendfile系統呼叫導致資料不經過user space,因此與nginx中output-filter存在衝突,比如在同乙個上下文中同時開啟gzip與sendfile會導致sendfile失效。

這兩個引數其背後內容特別多,不做詳細闡述,簡單講就是:開啟tcp_nopush表示會累積小資料報到一定大小後再傳送到網路上,而開啟tcp_nodelay表示任何小資料報都會直接傳送到網路上。

這兩個引數看似衝突實則非也,同時開啟sendfile,tcp_nopush與tcp_nodelay時,針對資源傳送nginx會:

這個引數用來控制單個keepalive連線可以傳送request的最大數,預設為100,當乙個keepalive連線傳送超過100個請求時,服務端會斷開該連線。想不出需要在單個keepalive連線上限制總request數量的場景,所以這個設定乙個較大的值用來表示沒有限制。

配置中的三個值其實都是預設值,寫出來是為了在配置中顯式體現延遲關閉這個特性,當nginx打算關閉乙個http連線時,不會立即關閉tcp連線,而是先關閉寫然後等待30s或連續5s沒有收到資料後完全關閉tcp連線。

延遲客戶端的資料傳輸,盡可能讓nginx有至少所指定大小位元組的資料要傳送時,才開始傳送,此選項是在nginx層面所作的與tcp_cork類似優化。

map指令可以將乙個變數值按照匹配規則對映到另外乙個變數中,這裡對響應content-type對映得到不同的過期值,在server中使用如下:

server 

}

宣告乙個**快取分割槽,用於快取反向**中上游的返回結果,詳細護說明可以參考這篇部落格,server中的使用:

server  

location

@am******

}

上面的配置針對.html字尾的響應做了快取處理,因為upstream中資源生成的開銷相對較高,而html內容不經常變化,乙個小時的快取時間是可接受的。

根據請求ip限制請求頻率,在之前的一遍文章中有詳細講述,此處略過。

這兩個疑惑通過google沒有找到好的答案,需要真大神指導才行。

部落格原文

nginx的配置指南

1.基本的配置格式 nginx是由若干個下面的部分組成 配置檔案的位置 etc nginx nginx.conf 主配置檔案的位置 2.nginx的全域性配置引數 全域性引數作用於整個server都有效的引數 例如 user 和 work process error log,pid 3.使用incl...

Nginx快取配置指南

開啟簡單的快取配置,只需要兩個指令 proxy cache path和proxy cache。proxy cache path配置快取的存放位址和其他的一些常用配置,proxy cache指令是為了啟動快取。該指令用於定義滿足條件的響應不會被儲存到快取中。在條件字串中至少有乙個條件不為空或者0,符合...

Nginx指南和配置詳解

nginx指南 nginx engine x 是乙個高效能的 http 和 反向 伺服器,也是乙個 imap pop3 smtp 伺服器。nginx 因它的穩定性 豐富的功能集 示例配置檔案和低系統資源的消耗而聞名了。更多的請見官方wiki 其優點 nginx做為http伺服器,有以下幾項基本特性 ...