為多個並髮使用者配置 php5-fpm
**編輯:**根據 anthonysomerset 的要求,添加了一些配置並澄清了“多少”是多少。
**編輯 2:**按照 SleighBoy 的建議,將 fastcgi_cache 添加到 nginx 配置中。
我為一個朋友的站點執行一個伺服器,該站點時不時會出現流量高峰,大約有 200-300 個並髮使用者。在峰值之間,伺服器大約有 70-80 個並髮使用者,它可以毫無問題地處理流量。
該站點正在使用 Debian Squeeze、nginx、PHP5-FPM+APC (128MB)、MySQL 5、memcached (128MB) 和 Varnish (1GB) 的伺服器上執行帶有 W3 Total Cache 的 WordPress。parentesis 中的數量是我為它們各自的記憶體分配的數量。記憶體永遠不會超過 1.8 GB afaik,但它可能有點超額預訂。不過一般不會出什麼問題…
導致問題的原因始終是 PHP5-FPM 使用 100% CPU 一段時間然後就崩潰了,導致 nginx 噴出 502 錯誤。日誌建議增加孩子的最大數量,但我認為我已經達到了伺服器可以處理多少孩子的限制。我一直
pm.max_requests
以 0(無限制)執行,但現在將其設置為 1000,看看是否不時重生孩子會有所幫助。/etc/php5/fpm/pool.d/www.conf
[全球資訊網] 聽 = /var/run/php5-fpm.sock 使用者 = www-數據 組 = www-數據 下午 = 動態 pm.max_children = 200 pm.start_servers = 20 pm.min_spare_servers = 20 pm.max_spare_servers = 60 pm.max_requests = 1000
/etc/nginx/nginx.conf
使用者 www 數據; 工人程序 8; pid /var/run/nginx.pid; 事件{ worker_connections 1024; } http { 發送文件; tcp_nopush 開啟; tcp_nodelay 開啟; types_hash_max_size 2048; 包括/etc/nginx/mime.types; default_type 應用程序/八位字節流; access_log /var/log/nginx/access.log; 錯誤日誌/var/log/nginx/error.log; gzip打開; gzip_disable "msie6"; gzip_vary on; gzip_comp_level 9; gzip_buffers 16 8k; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; fastcgi_cache_path /var/cache/nginx 級別=1:2 keys_zone=PHP5FPMCACHE:10m 不活動=5m; fastcgi_cache_key "$scheme$request_method$host$request_uri"; 包括/etc/nginx/conf.d/*.conf; 包括/etc/nginx/sites-enabled/*; }
/etc/nginx/sites-available/website.com
上游 php5-fpm { 伺服器 unix:/var/run/php5-fpm.sock; } 伺服器 { server_name website.com *.website.com; server_name_in_redirect 關閉; 根 /var/www/website.com; 聽8080; client_max_body_size 64M; access_log /var/log/nginx/website.com.access.log; 錯誤日誌/var/log/nginx/website.com.error.log; keepalive_timeout 75; 地點 / { 索引 index.php; 最後重寫 ^.*/files/(.*) /wp-includes/ms-files.php?file=$1; if (!-e $request_filename) { 最後重寫 ^(.+)$ /index.php?q=$1; } } 位置 ~* ^.+\.(jpg|jpeg|gif|css|png|js|ico|xml)$ { 30天到期; access_log 關閉; } 位置 ~ \.php$ { fastcgi_pass php5-fpm; fastcgi_cache PHP5FPMCACHE; fastcgi_cache_valid 200 302 1h; fastcgi_cache_valid 301 1d; fastcgi_cache_valid 任意 1m; fastcgi_cache_min_uses 1; fastcgi_cache_use_stale 錯誤超時 invalid_header http_500; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 包括/etc/nginx/fastcgi_params; } }
/etc/varnish/website.vcl
後端預設{ .host = "127.0.0.1"; .port = "8080"; } 子 vcl_recv { # 標準化內容編碼 if (req.http.Accept-Encoding) { 如果 (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|lzma|tbz)(\?.*|)$") { 刪除 req.http.Accept-Encoding; } elsif (req.http.Accept-Encoding ~ "gzip") { 設置 req.http.Accept-Encoding = "gzip"; } elsif (req.http.Accept-Encoding ~ "deflate") { 設置 req.http.Accept-Encoding = "deflate"; } 別的 { 刪除 req.http.Accept-Encoding; } } # 刪除真實靜態文件的cookies和查詢字元串 if (req.url ~ "^/[^?]+\.(jpeg|jpg|png|gif|ico|js|css|txt|gz|zip|lzma|bz2|tgz|tbz|html|htm)( \?.*|)$") { 取消設置 req.http.cookie; 設置 req.url = regsub(req.url, "\?.*$", ""); } # 從首頁刪除cookies if (req.url ~ "^/$") { 取消設置 req.http.cookie; } }
這是一個具有 4 核和超執行緒(即“8 核”)和 2GB 記憶體的 VPS。我知道硬體節點(物理伺服器)遠沒有超額預訂和幾乎沒有使用(因為我在託管公司工作到一個月左右),所以它幾乎是一個專用伺服器。
如果您需要任何規格,請詢問。
我懷疑你的清漆記憶體沒有記憶體足夠多的命中
這是我在你的情況下會做的:
將 php max children 降低到 100 甚至 50(如果 varnish 正常工作,您不需要它們)也刪除 max requests 行以允許 php 程序不會過快重生,從而防止 APC 被清除過快,這是也不好
根據 nginx,IF 也不好 - http://wiki.nginx.org/IfIsEvil
我會改變這一行:
if (!-e $request_filename) { rewrite ^(.+)$ /index.php?q=$1 last; }
到:
try_files $uri $uri/ /index.php?$args;
如果您的 nginx 版本支持它(可以肯定,如果您的 nginx 版本> 0.7.51,那麼它支持它)
您還應該查看將 w3tc nginx 規則直接插入到您的 vhost 文件中,以啟用適當的磁碟增強頁面記憶體(這比使用 nginx 進行 APC 記憶體更快)
看看我用於網站的以下 varnish vcl - 您需要通讀並為您的網站編輯一些內容 - 它還假設伺服器上只有 WP 站點,伺服器上只有 1 個站點,它可以很容易為更多網站修改(看看 cookie 部分)
通用 vcl:https ://gist.github.com/b7332971a848bcb7ecef
使用此配置,我會主張刪除 fastcgi_cache 以防止記憶體鏈發生任何可能的問題,從而嘗試定位任何雜散的陳舊記憶體條目更加困難
還告訴 w3tc 清漆位於 127.0.0.1,它會為你清除它;)
我在周三晚上將其部署到伺服器(進行了一些特定於域的修改),該伺服器正在處理 2500 個活動站點訪問者,它將負載減少到不到 1,並且執行 php 子項的大約數量約為 10-20(這個數字確實取決於登錄使用者數量和 cookie 等其他因素)這個伺服器確實有更多的記憶體,但原理是一樣的,你應該能夠輕鬆處理高峰時獲得的訪問者數量