大多數的Nginx安裝指南告訴你如下基礎知識——透過apt-get安裝,修改這裡或那裡的幾行配置,好了,你已經有了一個Web伺服器了。而且,在大多數情況下,一個常規安裝的nginx對你的網站來說已經能很好地工作了。然而,如果你真的想擠壓出Nginx的性能,你必須更深入一些。在本指南中,我將解釋Nginx的那些設定可以微調,以優化處理大量客戶端時的效能。需要注意一點,這不是一個全面的微調指南。這是一個簡單的預覽——那些可以透過微調來提高效能設定的概述。你的情況可能不同。
基本的 (優化過的)配置
我們將修改的唯一檔案是nginx.conf,其中包含Nginx不同模組的所有設定。你應該能夠在伺服器的/etc/nginx目錄中找到nginx.conf。首先,我們將談論一些全域設置,然後按文件中的模組挨個來,談一下哪些設置能夠讓你在大量客戶端訪問時擁有良好的性能,為什麼它們會提高性能。本文的結尾有一個完整的設定檔。
高層的配置
nginx.conf檔案中,Nginx中有少數的幾個高階配置在模組部分之上。
<ol> <li>user www-data; </li> <li>pid /var/run/nginx.pid; </li> <li><span>worker_processes auto; </span></li> <li><span>worker_rlimit_nofile 100000; </span></li> </ol>
user和pid應該按預設設定 - 我們不會更改這些內容,因為更改與否沒有什麼不同。
worker_processes 定義了nginx對外提供web服務時的worker進程數。最優值取決於許多因素,包括(但不限於)CPU核的數量、儲存資料的硬碟數量及負載模式。不能確定的時候,將其設定為可用的CPU核心數將是一個好的開始(設定為「auto」將嘗試自動偵測它)。
worker_rlimit_nofile 更改worker進程的最大開啟檔案數限制。如果沒設定的話,這個值為作業系統的限制。設定後你的作業系統和Nginx可以處理比「ulimit -a」更多的文件,所以把這個值設高,這樣nginx就不會有「too many open files」問題了。
Events模組
events模組中包含nginx中所有處理連接的設定。
<ol> <li>events { </li> <li><span>worker_connections 2048; </span></li> <li>multi_accept on; </li> <li><span>use epoll; </span></li> <li>} </li> </ol>
worker_connections 設定可由一個worker進程同時開啟的最大連線數。如果設定了上面提到的worker_rlimit_nofile,我們可以將這個值設得很高。
記住,最大客戶數也由系統的可用socket連線數限制(~ 64K),所以設定不切實際的高沒什麼好處。
multi_accept 告訴nginx收到一個新連線通知後接受盡可能多的連線。
use 設定用於重複使用客戶端執行緒的輪詢方法。如果你使用Linux 2.6+,你應該使用epoll。如果你使用*BSD,你應該使用kqueue。
(值得注意的是如果你不知道Nginx該使用哪種輪詢方法的話,它會選擇一個最適合你操作系統的)
HTTP 模組
HTTP模組控制著nginx http處理的所有核心特性。因為這裡只有很少的配置,所以我們只節選配置的一小部分。所有這些設定都應該在http模組中,甚至你不會特別的注意到這段設定。
<ol> <li>http { </li> <li>server_tokens off; </li> <li>sendfile on; </li> <li>tcp_nopush on; </li> <li>tcp_nodelay on; </li> <li>... </li> <li>} </li> </ol>
server_tokens 並不會讓nginx執行的速度更快,但它可以關閉在錯誤頁面中的nginx版本數字,這樣對於安全性是有好處的。
sendfile 可以讓sendfile()發揮作用。 sendfile()可以在磁碟和TCP socket之間互相拷貝資料(或任意兩個檔案描述符)。 Pre-sendfile是傳送資料之前在使用者空間申請資料緩衝區。之後用read()將資料從檔案拷貝到這個緩衝區,write()將緩衝區資料寫入網路。 sendfile()是立即將資料從磁碟讀到OS快取。因為這種拷貝是在內核完成的,sendfile()要比組合read()和write()以及打開關閉丟棄緩衝更加有效(更多有關於sendfile)。
tcp_nopush 告訴nginx在一個封包裡發送所有頭文件,而不一個接一個的發送。
tcp_nodelay 告訴nginx不要緩存數據,而是一段一段的發送--當需要及時發送數據時,就應該給應用設置這個屬性,這樣發送一小塊數據信息時就不能立即得到返回值。
<ol> <li>access_log off; </li> <li>error_log /var/log/nginx/error.log crit; </li> </ol>
access_log 設定nginx是否將儲存存取日誌。關閉這個選項可以讓讀取磁碟IO操作更快(aka,YOLO)
error_log 告訴nginx只能記錄嚴重的錯誤:
<ol> <li>keepalive_timeout 10; </li> <li>client_header_timeout 10; </li> <li>client_body_timeout 10; </li> <li>reset_timedout_connection on; </li> <li>send_timeout 10; </li> </ol>
keepalive_timeout 給客戶端分配超時時間。伺服器將在這個超時時間過後關閉連結。我們將它設定低些可以讓ngnix持續工作的時間更長。
client_header_timeout 和client_body_timeout 設定請求頭和請求體(各自)的逾時時間。我們也可以把這個設定低些。
reset_timeout_connection 告訴nginx關閉不回應的客戶端連線。這將會釋放那個客戶端所佔有的記憶體空間。
send_timeout 指定客户端的响应超时时间。这个设置不会用于整个转发器,而是在两次客户端读取操作之间。如果在这段时间内,客户端没有读取任何数据,nginx就会关闭连接。
<ol> <li>limit_conn_zone $binary_remote_addr <span>zone</span>=<span>addr</span>:5m; </li> <li>limit_conn addr 100; </li> </ol>
limit_conn_zone 设置用于保存各种key(比如当前连接数)的共享内存的参数。5m就是5兆字节,这个值应该被设置的足够大以存储(32K*5)32byte状态或者(16K*5)64byte状态。
limit_conn 为给定的key设置最大连接数。这里key是addr,我们设置的值是100,也就是说我们允许每一个IP地址最多同时打开有100个连接。
<ol> <li>include /etc/nginx/mime.types; </li> <li>default_type text/html; </li> <li>charset UTF-8; </li> </ol>
include 只是一个在当前文件中包含另一个文件内容的指令。这里我们使用它来加载稍后会用到的一系列的MIME类型。
default_type 设置文件使用的默认的MIME-type。
charset 设置我们的头文件中的默认的字符集
<ol> <li>gzip on; </li> <li>gzip_disable "msie6"; </li> <li># gzip_static on; </li> <li>gzip_proxied any; </li> <li>gzip_min_length 1000; </li> <li>gzip_comp_level 4; </li> <li>gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; </li> </ol>
gzip 是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量。
gzip_disable 为指定的客户端禁用gzip功能。我们设置成IE6或者更低版本以使我们的方案能够广泛兼容。
gzip_static 告诉nginx在压缩资源之前,先查找是否有预先gzip处理过的资源。这要求你预先压缩你的文件(在这个例子中被注释掉了),从而允许你使用最高压缩比,这样nginx就不用再压缩这些文件了(想要更详尽的gzip_static的信息,请点击这里)。
gzip_proxied 允许或者禁止压缩基于请求和响应的响应流。我们设置为any,意味着将会压缩所有的请求。
gzip_min_length 设置对数据启用压缩的最少字节数。如果一个请求小于1000字节,我们最好不要压缩它,因为压缩这些小的数据会降低处理此请求的所有进程的速度。
gzip_comp_level 设置数据的压缩等级。这个等级可以是1-9之间的任意数值,9是最慢但是压缩比最大的。我们设置为4,这是一个比较折中的设置。
gzip_type 设置需要压缩的数据格式。上面例子中已经有一些了,你也可以再添加更多的格式。
<ol> <li># cache informations about file descriptors, frequently accessed files </li> <li># can boost performance, but you need to test those values </li> <li>open_file_cache <span>max</span>=<span>100000</span> <span>inactive</span>=<span>20s</span>; </li> <li>open_file_cache_valid 30s; </li> <li>open_file_cache_min_uses 2; </li> <li>open_file_cache_errors on; </li> <li>## </li> <li># Virtual Host Configs </li> <li># aka our settings for specific servers </li> <li>## </li> <li>include /etc/nginx/conf.d/*.conf; </li> <li>include /etc/nginx/sites-enabled/*; </li> </ol>
open_file_cache 打开缓存的同时也指定了缓存最大数目,以及缓存的时间。我们可以设置一个相对高的最大时间,这样我们可以在它们不活动超过20秒后清除掉。
open_file_cache_valid 在open_file_cache中指定检测正确信息的间隔时间。
open_file_cache_min_uses 定义了open_file_cache中指令参数不活动时间期间里最小的文件数。
open_file_cache_errors 指定了当搜索一个文件时是否缓存错误信息,也包括再次给配置中添加文件。我们也包括了服务器模块,这些是在不同文件中定义的。如果你的服务器模块不在这些位置,你就得修改这一行来指定正确的位置。
一个完整的配置
<ol> <li>user www-data; </li> <li>pid /var/run/nginx.pid; </li> <li>worker_processes auto; </li> <li>worker_rlimit_nofile 100000; </li> <li>events { </li> <li>worker_connections 2048; </li> <li>multi_accept on; </li> <li>use epoll; </li> <li>} </li> <li>http { </li> <li>server_tokens off; </li> <li>sendfile on; </li> <li>tcp_nopush on; </li> <li>tcp_nodelay on; </li> <li>access_log off; </li> <li>error_log /var/log/nginx/error.log crit; </li> <li>keepalive_timeout 10; </li> <li>client_header_timeout 10; </li> <li>client_body_timeout 10; </li> <li>reset_timedout_connection on; </li> <li>send_timeout 10; </li> <li>limit_conn_zone $binary_remote_addr <span>zone</span>=<span>addr</span>:5m; </li> <li>limit_conn addr 100; </li> <li>include /etc/nginx/mime.types; </li> <li>default_type text/html; </li> <li>charset UTF-8; </li> <li>gzip on; </li> <li>gzip_disable "msie6"; </li> <li>gzip_proxied any; </li> <li>gzip_min_length 1000; </li> <li>gzip_comp_level 6; </li> <li>gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; </li> <li>open_file_cache <span>max</span>=<span>100000</span> <span>inactive</span>=<span>20s</span>; </li> <li>open_file_cache_valid 30s; </li> <li>open_file_cache_min_uses 2; </li> <li>open_file_cache_errors on; </li> <li>include /etc/nginx/conf.d/*.conf; </li> <li>include /etc/nginx/sites-enabled/*; </li> <li>} </li> </ol>
编辑完配置后,确认重启nginx使设置生效。
<ol><li>sudo service nginx restart</li></ol>
以上就介绍了Nginx 相关配置优化,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。