编辑:按照 anthonysomerset 的要求,添加了一些配置并澄清了“许多”是多少。
编辑2:按照 SleighBoy 的建议,将 fastcgi_cache 添加到 nginx 配置中。
我为一个朋友的网站运行服务器,该网站有时会出现流量高峰,大约有 200-300 个并发用户。高峰期间,服务器大约有 70-80 个并发用户,它可以毫无问题地处理流量。
该网站在一台装有 Debian Squeeze、nginx、PHP5-FPM+APC(128MB)、MySQL 5、memcached(128MB)和 Varnish(1GB)的服务器上运行 WordPress 和 W3 Total Cache。括号中的数值是我为它们各自的缓存分配的容量。据我所知,内存从未超过 1.8 GB,但可能有点超额。不过通常不会造成任何问题……
导致问题的原因是 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; 事件 { 工作者连接1024; } http { 发送文件; tcp_nopush 开启; tcp_nodelay开启; 类型_hash_max_size 2048; 包括/etc/nginx/mime.types; 默认类型应用程序/八位字节流; 访问日志/var/log/nginx/access.log; 错误日志/var/log/nginx/error.log; 开启 gzip; gzip_禁用“msie6”; gzip_vary开启; gzip_comp_level 9; gzip缓冲区 16 8k; gzip_types 文本/纯文本/css 应用程序/json 应用程序/x-javascript 文本/xml 应用程序/xml 应用程序/xml+rss 文本/javascript; fastcgi_cache_path /var/cache/nginx 级别=1:2 keys_zone=PHP5FPMCACHE:10m 非活动=5米; 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; } 服务器 { 服务器名称 website.com *.website.com; 服务器名称_in_redirect 关闭; 根/var/www/website.com; 听 8080; 客户端最大主体大小64M; 访问日志/var/log/nginx/website.com.access.log; 错误日志/var/log/nginx/website.com.error.log; 保持活动超时 75; 地点 / { 索引索引.php; 重写^.*/files/(.*) /wp-includes/ms-files.php?file=$1 最后; 如果(!-e $请求文件名){ 重写 ^(.+)$ /index.php?q=$1 最后; } } 位置 ~* ^.+\.(jpg|jpeg|gif|css|png|js|ico|xml)$ { 30天后到期; 访问登录关闭; } 位置 ~ \.php$ { fastcgi_pass php5-fpm; fastcgi_缓存 PHP5FPMCACHE; fastcgi_cache_valid 200 302 1小时; fastcgi_cache_valid 301 1d; fastcgi_cache_valid 任何 1m; fastcgi_cache_min_使用量 1; fastcgi_cache_use_stale 错误超时invalid_header http_500; fastcgi_index索引.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 包括/etc/nginx/fastcgi_params; } }
/etc/varnish/website.vcl
后端默认{ .主机 = “127.0.0.1”; .端口 = “8080”; } 子vcl_recv{ # 规范化内容编码 如果(请求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 和查询字符串 如果 (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 如果(req.url〜“ ^ / $”){ 取消设置 req.http.cookie; } }
这是一台具有 4 核和超线程(即“8 核”)以及 2GB RAM 的 VPS。我知道硬件节点(物理服务器)远没有超额预订,而且几乎没有使用(因为我在一个月前左右还在这家托管公司工作过),所以它几乎就是一台专用服务器。
如果您需要任何规格,请直接询问。
答案1
我怀疑你的 varnish 缓存没有缓存足够的命中数
在你的情况下我会这样做:
将 php 最大子进程数降低到 100 甚至 50(如果 varnish 工作正常,则不需要它们),同时删除最大请求数行以允许 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 varnish 位于 127.0.0.1,它就会帮你清除它 ;)
我于周三晚上将它部署到一台服务器上(对一些特定于域的修改),该服务器可处理 2500 名活跃站点访问者,它将负载减少到 1 以下,并且运行的 php 子进程数量大约为 10-20(这个数字取决于登录用户的数量和其他因素,如 cookie)这台服务器确实有更多的内存,但原理是一样的,您应该能够轻松处理高峰时的访客数量
答案2
亚太经合组织和 nginxfastcgi_缓存对你有很大帮助。