为许多并发用户配置 php5-fpm

为许多并发用户配置 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)的服务器上运行 WordPress 和 W3 Total Cache。括号中的数值是我为它们各自的缓存分配的容量。据我所知,内存从未超过 1.8 GB,但可能有点超额。不过通常不会造成任何问题……

导致问题的原因是 PHP5-FPM 总是在一段时间内占用 100% 的 CPU,然后就崩溃了,导致 nginx 发出 502 错误。日志建议增加子节点的最大数量,但我认为我已经达到了服务器可以处理的子节点数量的限制。我一直以pm.max_requests0(无限制)运行,但现在将其设置为 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_缓存对你有很大帮助。

相关内容