我的 php-fpm 配置有什么问题?

App*_*rew 8 server-crashes nginx fastcgi php-fpm

我有一个 64 位服务器,但只有 256MB 的 RAM。因此,我使用 fast-cgi 移至 nginx 服务器以连接到 PHP。我正在运行 PHP 5.3.6。

问题是,每隔两三天,当我尝试访问任何 PHP 页面时,就会出现服务器内部错误。唯一的方法是手动重启 php-fpm。这意味着我应该设置一些错误的参数,导致它窒息。下面我列出了相关的配置。

/etc/php-fpm.conf :-

include=/etc/php-fpm.d/*.conf
log_level = error
;emergency_restart_threshold = 0
;emergency_restart_interval = 0
;process_control_timeout = 0
Run Code Online (Sandbox Code Playgroud)

/etc/php-fpm.d/www.conf :-

[www]
pm = dynamic
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 500
Run Code Online (Sandbox Code Playgroud)

/etc/nginx/php.conf :-

location ~ \.php {
        fastcgi_param  QUERY_STRING       $query_string;
        fastcgi_param  REQUEST_METHOD     $request_method;
        fastcgi_param  CONTENT_TYPE       $content_type;
        fastcgi_param  CONTENT_LENGTH     $content_length;

        fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
        fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param  REQUEST_URI        $request_uri;
        fastcgi_param  DOCUMENT_URI       $document_uri;
        fastcgi_param  DOCUMENT_ROOT      $document_root;
        fastcgi_param  SERVER_PROTOCOL    $server_protocol;

        fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
        fastcgi_param  SERVER_SOFTWARE    nginx;

        fastcgi_param  REMOTE_ADDR        $remote_addr;
        fastcgi_param  REMOTE_PORT        $remote_port;
        fastcgi_param  SERVER_ADDR        $server_addr;
        fastcgi_param  SERVER_PORT        $server_port;
        fastcgi_param  SERVER_NAME        $server_name;

        fastcgi_pass unix:---some-location---;
}
Run Code Online (Sandbox Code Playgroud)

更新 1

我有四个 nginx 进程正在运行。平均每个 php-fpm 进程需要 35MB 的 RAM(每个虚拟内存大小为 320MB)。我也有一个 MySql 进程正在运行。

更新 2

我忘记粘贴日志了。

php-fpm 错误日志:-

WARNING: [pool www] seems busy (you may need to increase start_servers, or min/max_spare_servers), spawning 8 children, there are 1 idle, and 7 total children
WARNING: [pool www] server reached max_children setting (10), consider raising it
NOTICE: Terminating ...
Run Code Online (Sandbox Code Playgroud)

php-fpm www.error 日志:-

PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 122880 bytes) in /home/webadmin/blog.applegrew.com/html/wordpress/wp-content/plugins/jetpack/class.jetpack-signature.php on line 137
PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 122880 bytes) in /home/webadmin/blog.applegrew.com/html/wordpress/wp-content/plugins/jetpack/class.jetpack-signature.php on line 137
PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 122880 bytes) in /home/webadmin/blog.applegrew.com/html/wordpress/wp-content/plugins/jetpack/class.jetpack-signature.php on line 137
Run Code Online (Sandbox Code Playgroud)

cyb*_*x86 18

一个临时的建议是降低你的设定值 - 可能将它们减半。

你有: pm.max_children = 10 如果你说 35MB/process = 350MB; 在 256MB 的盒子上,这意味着要进行大量交换或内存不足 - 两者都不好。

我会说其他进程至少需要 100MB,甚至 150MB 是安全的,然后将该数字除以 35MB 以获得您的 max_children。保持所有其他数字一致:

pm = dynamic
pm.max_children = 4
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 500
Run Code Online (Sandbox Code Playgroud)

停止 PHP-FPM 并运行free以了解您的可用内存 - 除以您的 35MB 以获得您的 max_children。

根据 MySQL 需要多少内存,您可能必须将 max_children 降为 3。

我确实发现 PHP-FPM 进程共享大量内存,做一个快速实验来确定真正使用了多少。停止 PHP-FPM 并运行free. 启动 PHP-FPM 访问几个常见页面(因为内存会根据加载的页面而增加),并检查使用的总内存,再次使用free- 除以进程数的差异。它不是一个完美的系统,但我确实发现它相当准确(有时顶部的数据列也不错)。


inv*_*ass 6

您的 php-fpm 设置似乎没问题。

但是您正在运行的服务器在某种程度上是资源受限的。从日志中可以明显看出 PHP 进程正在耗尽可用内存。

添加到cyberx86提供的建议:

您可以尝试编辑 php.ini 文件中的 memory_limit 参数(请参阅此处)(尽管我不确定它会做得很好)

鉴于系统内存很少,我认为您应该认真考虑切换到 32 位操作系统。使用 x64 操作系统实际上是在伤害你而不是有益。

如果您没有在 MySql 数据库中使用 InnoDB 存储,您还可以考虑在 my.cnf 中关闭 InnoDB - 它会再节省 100 MB 的 RAM。

Lowendbox有一个关于如何针对低内存配置优化服务器的很棒的教程。