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


8

我有一个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

/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

/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---;
}

更新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 ...

php-fpm www。错误日志:-

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

Answers:


17

临时建议是降低您的设置值-可能将其减少一半。

您有:pm.max_children = 10如果您说35MB /进程= 350MB;在256 MB的盒子上,这意味着要么交换很多,要么内存不足-都不是好事。

我说其他进程至少要占用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

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

根据MySQL占用的内存量,您可能必须将max_children降至3。

我确实发现PHP-FPM进程共享大量内存,请进行快速实验以确定实际使用了多少内存。停止PHP-FPM并运行free。启动PHP-FPM时,请访问几个常用页面(由于内存增加取决于加载的页面,因此是必需的),并检查使用的总内存,再次使用free-将差除以进程数。它不是一个完美的系统,但我确实发现它相当准确(有时顶部的数据列也不错)。


我停下来,free然后开始。我将可用内存除以35得到max_children value。我没有达到最后一段的目的。
AppleGrew

看来我最多只能支持PHP 2.3进程。:P反正我现在已经max_children到3
AppleGrew

a)“最后一个参数”的目的是获得有关PHP进程消耗多少的更准确的值。我发现ps或top的值并不总是与可用内存的减少匹配。如果找到可用内存,运行一些PHP进程,然后重新测量可用内存(而不是查看进程使用的内存),则可以获得每个进程使用多少内存的“替代”(也许更好)的值。b)invarbrass建议的memory_limit参数也是一个很好的建议。c)看一下mysqltuner.pl脚本,它可能对您的数据库配置有帮助。
cyberx86

@ cyberx86,free您考虑到什么价值?“-/ +缓冲区/缓存”行中的一个用于磁盘缓存,但实际上对应用程序免费吗?
罗曼·纽瓦萨

@RomanNewaza-是的,您想查看应用程序可用的内存,因此将使用“-/ + buffers / cache”下的“ free”条目。
cyberx86

6

您的php-fpm设置似乎正常。

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

除了Cyber​​x86提供的建议外:

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

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

如果您没有在MySql数据库中使用InnoDB存储,则也可以考虑在my.cnf中关闭InnoDB-这将节省另外100 MB的RAM。

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


好吧,我的声音变得沙哑,试图与托管公司推理为我提供32位操作系统。这些公司似乎在整个网络上仅提供64位。我发现只有一家公司提供32位操作系统,但它们的成本要高得多。
AppleGrew

3

一个非常方便的命令来查找php占用的内存:

ps --no-headers -o "rss,cmd" -C php5-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'

然后,您将想要专用于RAM的内存划分为php,并且您拥有了max_children值!

另外,您可以手动监视(必须设置端点php-status)或使用Nagios进行监视。


awk: fatal: division by zero attempted
samayo 2014年

1
意味着您没有php5-fpm进程....您需要更改进程的名称“ php5-fpm”以适合您自己的名称。
Thomas Decaux 2014年

我使用了此命令,但ps --no-headers -o "rss,cmd" | grep php5-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'-C选项不起作用。
死于2014年

尝试单独运行命令(我的意思是ps --no-headers -o“ rss,cmd”首先,等等),这应该很容易调试
Thomas Decaux 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.