php-fpm 和 nginx 配置以获得最佳性能

php-fpm 和 nginx 配置以获得最佳性能

我正在使用 php-fpm 运行 nginx 服务器。

我正在使用“ c5d.xlarge”ec2 实例类型来托管我的网站。

c5d.xlarge = 4 vcpu 和 8GB RAM。

如果我的 ELB 上的活动连接数超过 10k,则我所有 15 台服务器的 CPU 利用率将超过 60-70%。

php-fpm 配置:

pm = dynamic
pm.max_children = 65
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 600

nginx配置:

user  www-data;
worker_processes  4;
pid        /var/run/nginx.pid;


events {
    worker_connections  3072;
}


http {
        ##
        # Basic Settings
        ##

        charset utf-8;
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        server_tokens off;
        log_not_found off;
        types_hash_max_size 2048;
        client_max_body_size 16M;
        keepalive_timeout  70;
        client_header_timeout 3000;
        client_body_timeout 3000;
        fastcgi_read_timeout 3000;
        fastcgi_buffers 8 128k;
        fastcgi_buffer_size 128k;

        # MIME
        include /etc/nginx/mime.types;
        default_type application/octet-stream;
   log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /home/ubuntu/apps/log/default/access.log  main buffer=32k;
    error_log   /home/ubuntu/apps/log/default/error.log;


    gzip on;
        gzip_disable "MSIE [1-6]\.";

        # Only allow proxy request with these headers to be gzipped.
        gzip_proxied expired no-cache no-store private auth;

        # Default is 6 (1<n<9), but 2 -- even 1 -- is enough. The higher it is, the
        # more CPU cycles will be wasted.
        gzip_comp_level 7;
        gzip_min_length 20; # Default 20

        gzip_types text/plain text/css application/json application/javascript  application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    include /etc/nginx/conf.d/*.conf;

顶部命令输出: top 命令输出

请建议这些配置是否合适。我不太确定这么多活动连接占用这么多 CPU 是否合适。如果有人能指导我设置 nginx 和 php-fpm 以获得最佳性能,我将不胜感激。

如果需要更多信息,请告诉我。

答案1

让我们开始吧php-fpm

pm = dynamic

动态进程模型让一群工作进程等待请求通过。同时,这些工作进程利用 CPU 周期和内存。ondemand是 FPM 进程模型的最佳选择,因为它可以根据需要扩展。在您说“好吧,守护进程将要处理新的子进程”之前(fork()这也是一项密集型任务),请记住,对于现代操作系统和硬件来说,这不是一项非常昂贵的操作。

pm.max_children = 65

这很可能是完全不可持续的,除非您的 phpmemory_limit设置为 100MB,但这永远不足以运行任何类型的 PHP 进程。请注意,如果您要让 FPM 扩展到 65 个工作者,它们都可能使用高达memory_limit。如果没有 RAM 来支持它,这个设置值就是锁定服务器的秘诀。

pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20

我不会对这些发表评论,因为它们足够合理。

pm.max_requests = 600

这个值在 PM 中毫无意义ondemand,但我会谈论它。在 600 个请求之后终止工作进程有什么意义?如果您的应用程序泄漏了那么多内存,以至于您需要回收它,那么您需要评估应用程序本身。

转到nginx

worker_process = 4

工作进程数实际上应设置auto为允许nginx找到正确的平衡。不过,通常情况下,一个就足以满足大多数用例的需求。

worker_connections  3072;

这是另一个潜在的危险设置。您是否ulimit -n查看过每个进程允许打开多少个文件?您的系统上有多少个可用核心(grep -c processor /proc/cpuinfo)?一般来说,这个值应该是$CPU_CORES * ulimit,在您的情况下,根据您选择的 EC2 实例,可能为2048

client_header_timeout 3000;
client_body_timeout 3000;
fastcgi_read_timeout 3000;

这是另一个可能让你吃不消的设置!你真的想让连接挂起近一个小时,等待超时吗?应用程序中过高的超时值可能会消耗大量服务器资源。超时值被设计为刚好高于特定事件发生所需的正常时间,不会高太多。否则,超时有什么意义呢?:)

相关内容