Nginx 备战-优化指南
Nginx 備戰-優化指南
作者:Zachary Orr
大多數關于 Nginx 的指南只告訴你那最基本的部分:apt-get 一個包,修改這里和那里的某些行,然后就得到了一個 web 服務器!而在大多數情況下,一個常見的 nginx 安裝也能為你的網站提供良好的服務。然而如果你的確想 進一步壓榨 nginx 的性能,那么就必須走得更遠一些。在這個指南中,我將會解釋通過調整 nginx 中的哪些設置可以得到更好的性能,來應對大量客戶端請求。同時要注意,這不是完整的調優指南。只是對一些可以調整來改進性能的設置的簡單概述。請務必具體 情況具體對待。
(優化后的)基礎配置
接下來唯一要修改的文件就是 nginx.conf,它保存有 nginx 不同模塊的全部設置。可以在服務器的 /etc/nginx 目錄找到 nginx.conf。首先,先探討一下一些全局的設置,然后看看配置里的每個模塊,并討論一下哪個設置能在巨大的客戶端連接數時,帶來更好的性能,以及 為什么它們可以提升性能。一個完整的配置文件可以在文章的結尾找到。
頂級配置
在 nginx.conf 文件中,有一些在模塊之外的頂級配置
user?www-data; pid?/var/run/nginx.pid;???? worker_processes?auto;???? worker_rlimit_nofile?8192;user 和 pid 應當使用默認值——由于它對我們的目的沒有任何影響,所以我們不會修改這部分。
worker_processes 定義了 nginx 在為你的網站提供服務時,worker 進程的數量。優化值受到包括(單不限于)CPU 內核數、存儲數據的磁盤數、負載值在內的許多因素的影響。如果不確定的話,將其設置為可用的 CPU 內核的數量是一個不錯的開始(設置為“auto”,將會嘗試自動檢測可用的值)。
worker_rlimit_nofile 修改了 worker 進程打開文件數的最大值限制。如果不設置,操作系統會限制它。當操作系統和 nginx 處理超過“ulimit -n”的數量的文件的情況時產生報告,因此將這個數值調大,這樣 nginx 就不會遇到“too many open files”的問題。
#?bump?up?our?hard?limitsudo? sh?-c?ulimit?-HSn?100000為了讓這個設置(在重啟以后)永久生效,需要修改系統的配置文件。添加(如果已經有了,就修改)下面的行
> sudo nano /etc/security/limits.conf
*?soft?nofile?200000 *?hard?nofile?200000events 模塊
events 模塊包括了 nginx 中處理鏈接的全部設置
events?{????worker_connections?2048;????multi_accept?on;????use?epoll;???? }worker_connections 設置了一個 worker 進程可以同時打開的鏈接數。由于已經調整了 worker_rlimit_nofile,所以可以安全的將這個數值調整得很大。
multi_accept 告訴 nginx 在收到新鏈接的請求的通知時,盡可能接受鏈接。
use 設置了線程使用哪個池化方法來多個客戶端。如果使用 Linux 2.6+,應當設置為 epoll。如果使用 *BSD,應當設置為 kqueue。想了解更多關于事件池?讓 Wikipedia 做你的向導吧(警告,如果要弄明白所有事情,一副馬克思式的大胡子和一門操作系統課程是必須的)。
(需要注意的是,如果沒有指定 nginx 使用哪個池化方法,它將會根據操作系統選擇最合適的那個
HTTP 模塊
HTTP 模塊控制了 nginx 的 http 處理的核心功能。雖然這里只有很少的設置項,但我們還是要簡單的了解一下。每個配置的片段都應當放在 http 模塊中,后面不再特別說明。
http?{sendfile?on;????tcp_nopush?on;????tcp_nodelay?on;????...???? }sendfile 激活了 sendfile()。sendfile() 在磁盤和 TCP 端口(或者任意兩個文件描述符)之間復制數據。在 sendfile 出現之前,為了傳輸這樣的數據需要在用戶空間上分配一塊數據緩存。使用 read() 從源文件讀取數據到緩存,然后使用 write() 將緩存寫入到網絡。sendfile() 直接從磁盤上讀取數據到操作系統緩沖。由于這個操作是在內核中完成的,sendfile() 比伴隨上下文切換/緩沖垃圾的 read() 和 write() 聯合使用要更加有效率(了解更多關于 sendfile)。
tcp_nopush 告訴 nginx 在一個包中發送全部的頭文件,而不是一個一個發送。
tcp_nodelay 告訴 nginx 不要緩存數據,應該快速的發送小數據——這僅僅應該使用在哪些頻繁發送小的碎片信息而無需立刻獲取響應的,需要實時傳遞數據的應用中。
access_log?off; error_log?/var/log/nginx/error.log?crit;access_log 確定了 nginx 是否保存訪問日志。將這個設置為關閉可以降低磁盤 IO 而提升速度(換句話說,你只有一條命)。
error_log 告訴 nginx 應當記錄臨界錯誤。
keepalive_timeout?20; client_header_timeout?20;???? client_body_timeout?20;???? reset_timedout_connection?on;???? send_timeout?20;keepalive_timeout 指定了與客戶端的 keep-alive 鏈接的超時時間。服務器會在這個時間后關閉鏈接。我們會降低這個值,以避免讓 worker 過長時間的忙碌。
client_header_timeout 和 client_body_timeout (分別)設置了請求頭和請求體的超時時間。這個值也應該設置得較低。
reset_timedout_connection 告訴 nginx 當客戶端失去相應時關閉鏈接。這將會釋放為該客戶端分配的所有內存。
send_timeout 指定了響應客戶端的超時時間。這個時間并不是指整個傳輸時間,而是在客戶端兩次讀操作之間的間隔。如果客戶端在這個時間內沒有準備好再次讀取數據,nginx 會關閉鏈接。
limit_conn_zone?$binary_remote_addr?zone=addr:5m; limit_conn?addr?100;limit_conn_zone 設定了可以按照鍵保存數據的共享內存區(例如當前鏈接數)的參數。5m 表示 5 兆字節,應當足夠存儲(32k * 5)32 字節狀態,或者(16k * 5)64 字節狀態。
limit_conn 設置了指定鍵值的最大連接接數。這里鍵為 addr,值為 100,因此將只允許每個 IP 100 個并發連接。
include?/etc/nginx/mime.types; default_type?text/html;???? charset?UTF-8;include 會直接包含其他文件的內容到當前文件。這里加載了 MIME 的列表以待使用。
default_type 設置了文件默認的 MIME 類型。
charset 設置了頭中包含的默認的字符集。
下面的兩個性能改進的選項在 WebMasters StackExchange 的這個偉大問題中給予了說明
gzip?on; #?gzip_static?on;???? gzip_proxied?any;???? gzip_min_length?256;???? gzip_comp_level?4;???? gzip_typestext/plain?text/css? application/json?application/x-javascript?text/xml? application/xml?application/xml+rss?text/javascript;gzip 告訴 nginx gzip 壓縮發送的數據。這會減少需要發送的數據的數量。
gzip_static 告訴 nginx 告訴 nginx 在對內容進行 gzip 之前,尋找相同名字的已經 gzip 過的內容。這需要你預先壓縮文件(在這個例子中被注釋掉了),但這樣可以使用最高的壓縮比,同時 nginx 不再壓縮這些文件(在這里了解更多關于 gzip_static 的信息)。
gzip_proxied 允許或禁止基于請求/響應的壓縮。設置為 any,就可以 gzip 所有的請求。
gzip_min_length 設置了 gzip 數據的最小的字節數。由于 gzip 壓縮會降低處理請求的速度,所以如果一個請求小于 1000 字節,將不對其進行壓縮。
gzip_comp_level 設置了數據壓縮的等級。等級可以是 1-9 的任意一個值,9 表示最慢但是最高比例的壓縮。設置為 4 是一個不錯的折中選擇。
gzip_types 設置進行 gzip 的類型。有上面這些,不過還可以添加更多。
?#?cache?informations?about?file?descriptors,?frequently?accessed?files????#?can?boost?performance,?but?you?need?to?test?those?values????open_file_cache?max=100000?inactive=20s;?????open_file_cache_valid?30s;?????open_file_cache_min_uses?2;????open_file_cache_errors?on;????##????#?Virtual?Host?Configs????#?aka?our?settings?for?specific?servers????##????include?/etc/nginx/conf.d/*.conf;????include?/etc/nginx/sites-enabled/*;???? }open_file_cache 啟用了緩沖區并指定了在緩存區中的實體數量,以及緩存的時長。最大值設置一個盡可能大的值,而它們超過 20 秒未被使用的話,就將其移除緩沖區。
open_file_cache_valid 指定了檢查 open_file_cache 中信息的有效性的時間間隔。
open_file_cache_min_uses 定義了 open_file_cache 中在指定時間間隔里,閑置文件的最小使用次數。
open_file_cache_errors 指定了在查找一個文件的時候,是否緩存錯誤。
include 再次向配置添加了一些文件。引入了定義在不同文件中的服務模塊。如果你的服務模塊不在這個路徑下,你應當修改這幾行到正確的路徑。
完整的配置文件:
user?www-data;pid?/var/run/nginx.pid;???? worker_processes?auto;???? worker_rlimit_nofile?8192;???? events?{????worker_connections?2048;????multi_accept?on;????use?epoll;???? }???? http?{????sendfile?on;????tcp_nopush?on;????tcp_nodelay?on;????access_log?off;????error_log?/var/log/nginx/error.log?crit;????keepalive_timeout?20;????client_header_timeout?20;????client_body_timeout?20;????reset_timedout_connection?on;????send_timeout?20;????limit_conn_zone?$binary_remote_addr?zone=addr:5m;????limit_conn?addr?100;????include?/etc/nginx/mime.types;????default_type?text/html;????charset?UTF-8;????gzip?on;????gzip_proxied?any;????gzip_min_length?256;????gzip_comp_level?4;????gzip_typestext/plain?text/css?application/json?application/x-javascript?text/xml? application/xml?application/xml+rss?text/javascript;????open_file_cache?max=100000?inactive=20s;?????open_file_cache_valid?30s;?????open_file_cache_min_uses?2;????open_file_cache_errors?on;????include?/etc/nginx/conf.d/*.conf;????include?/etc/nginx/sites-enabled/*;???? }本文轉自:http://mikespook.com/2013/11/%E7%BF%BB%E8%AF%91-nginx-%E5%A4%87%E6%88%98-%E4%BC%98%E5%8C%96%E6%8C%87%E5%8D%97/
轉載于:https://blog.51cto.com/kaibinyuan/1640736
總結
以上是生活随笔為你收集整理的Nginx 备战-优化指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java Swing编程之仿js树状折叠
- 下一篇: ios网址解析中,中文部分如何处理