Nginx 作為web server 的優化要點
Nginx既可作為web server,也可作為反向proxy,這里先討論作為web server的一般性優化要點。
常用優化要點
nginx使用的是固定數量的workers, 每個worker都處理進入的請求。最佳實踐是每個CPU內核配置一個worker.
如何知道您的系統有幾個CPU?
$ grep ^processor /proc/cpuinfo | wc -l
對于一個四核處理器,配置文件類似:
# One worker per CPU-core.
worker_processes 4; events { worker_connections 8096; multi_accept on; use epoll; } worker_rlimit_nofile 40000; http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 15; # Your content here .. }
這里我們提高了 worker_connections 設置,定義了每個worker進程能處理多少連接。
服務器的最大連接數量是:
worker_processes * worker_connections (= 32384 本例中)
這里啟用了 multi_accept,該配置項使nginx能盡快接收盡可能多的請求,減少客戶端的連接初始化時間。
最后,本例中使用了 epoll 的事件模型,這也是最佳實踐建議。
壓縮
很多用戶會啟用 gzip壓縮模塊,使得返回客戶端的內容更簡短,傳輸更快。
但是壓縮會消耗用戶服務器資源,通過監控CPU使用率(可采用開源Hyperic),如果過高,可以考慮禁用壓縮。
通常只壓縮大文件,避免壓縮那些壓縮效果不好的文件,例如圖片,可執行文件等二進制文件。
用戶可參考下面配置:
gzip on; gzip_vary on; gzip_min_length 10240; gzip_proxied expired no-cache no-store private auth; gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml; gzip_disable "MSIE [1-6]\.";
上面配置,只對文件大于10k的文本文件進行壓縮。
客戶端緩存
如果客戶端(一般是瀏覽器)認為已經保存了要下載的最新內容,就不會向nginx服務器再發請求。
這需要做一些緩存設置。最簡單的辦法是將所有的圖片,js等靜態內容設置一個固定的時間長度:
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ { access_log off; log_not_found off; expires 30d; }
這里我們也禁用了媒體文件的日志,將一些文件后綴文件的過期時間設置為30天。
文件句柄緩存
如果需要處理大量靜態文件,需要保持這些文件句柄為打開狀態,避免后續再次打開。
下面示例,既可放在nginx配置的 server 部分,也可放在主 http 塊中。:
open_file_cache max=2000 inactive=20s; open_file_cache_valid 60s; open_file_cache_min_uses 5; open_file_cache_errors off;
這里設置服務器最大緩存2000個打開的文件句柄,關閉20秒內無請求的文件句柄,句柄的有效時間是60秒,并且只有訪問次數超過5次的才會被緩存。這樣只緩存頻繁訪問的文件,降低文件系統的訪問。
優化PHP
很多站點使用了PHP,例如drupal, wordpress。
由于nginx沒有自己的mod_php,推薦的方式是使用 PHP-FPM,需要將請求轉發,例如:
# execute all .php files via php-fpm location ~ .php$ { # connect to a unix domain-socket: fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_buffer_size 128k; fastcgi_buffers 256 16k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; # This file is present on Debian systems.. include fastcgi_params; }
注意這里使用了 Unix domain-socket 連接 FPM, 所以需要修改/etc/php5/fpm/pool.d/www.conf 如下:
listen = /var/run/php5-fpm.sock
這保證FPM監聽一個domain socket,而不是默認的( "listen=127.0.0.1:9000").
默認的PHP-FPM將啟動一些專用的worker,每個運行一個PHP實例。如果內存足夠,可以增加worker數量來提升并發吞吐量。
編輯文件 /etc/php5/fpm/pool.d/www.conf,改變數量,例如:
; set a fixed number of php workers pm = static ; start up 12 php processes pm.max_children = 12
該值需要根據實際環境調整。調整的依據是使用監控工具所采集的數據。
最后可配置PHP-FPM自動重啟。如果出現問題,例如下面的配置是,在1分鐘內十個子進程死掉,就重啟,允許進程有十秒失去控制。
下面是/etc/php5/fpm/php-fpm.conf 中的全局配置:
emergency_restart_threshold 10 emergency_restart_interval 1m process_control_timeout 10s
來自:http://my.oschina.net/hyperichq/blog/399792