我的php-fpmconfiguration有什么问题?

我有一个64位的服务器,但只有256MB的RAM。 所以,我用fast-cgi移动到nginx服务器来连接到PHP。 我有PHP 5.3.6运行。

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

/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.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 

    另外一个build议是降低你的设定值 – 可能把他们减半。

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

    我认为其他进程至less需要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占用多less内存,可能必须将max_children降到3。

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

    你的php-fpm设置好像没问题。

    但是你运行的服务器有一定的资源限制。 从日志中可以明显看出,PHP进程耗尽了可用的内存。

    添加cyberx86提供的build议:

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

    考虑到less量的系统内存,我认为你应该认真考虑切换到32位操作系统。 使用x64操作系统实际上是伤害你,而不是有益的。

    如果你在MySql数据库中没有使用InnoDB存储,你也可以考虑在你的my.cnf中closuresInnoDB,这样可以节省100MB的内存。

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

    一个非常方便的命令来查找由PHP采取的内存:

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

    然后你把你想要奉献给php的RAM分开,并且你有你的max_children值!

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