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
- 除以进程数的差异。它不是一个完美的系统,但我确实发现它相当准确(有时顶部的数据列也不错)。
您的 php-fpm 设置似乎没问题。
但是您正在运行的服务器在某种程度上是资源受限的。从日志中可以明显看出 PHP 进程正在耗尽可用内存。
添加到cyberx86提供的建议:
您可以尝试编辑 php.ini 文件中的 memory_limit 参数(请参阅此处)(尽管我不确定它会做得很好)
鉴于系统内存很少,我认为您应该认真考虑切换到 32 位操作系统。使用 x64 操作系统实际上是在伤害你而不是有益。
如果您没有在 MySql 数据库中使用 InnoDB 存储,您还可以考虑在 my.cnf 中关闭 InnoDB - 它会再节省 100 MB 的 RAM。
Lowendbox有一个关于如何针对低内存配置优化服务器的很棒的教程。
归档时间: |
|
查看次数: |
36144 次 |
最近记录: |