Nginx

為多個並髮使用者配置 php5-fpm

  • October 14, 2011

**編輯:**根據 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 等其他因素)這個伺服器確實有更多的記憶體,但原理是一樣的,你應該能夠輕鬆處理高峰時獲得的訪問者數量

引用自:https://serverfault.com/questions/321088