Tengo un servidor de 64 bits pero solo 256 MB de RAM. Entonces, me mudé al servidor nginx con fast-cgi para conectarme a PHP. Tengo PHP 5.3.6 ejecutándose.
El problema es que después de cada dos o tres días, cuando intento acceder a cualquier página PHP, aparece un error interno del servidor. La única forma de hacerlo es reiniciar php-fpm manualmente. Esto significa que debería haber establecido algunos parámetros incorrectos que están causando que se ahogue. A continuación he enumerado las configuraciones relevantes.
/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---;
}
Actualización 1
Y tengo cuatro procesos nginx ejecutándose. En promedio, cada proceso php-fpm requiere 35 MB de RAM (tamaño de memoria virtual de 320 MB cada uno). También tengo un proceso MySql en ejecución.
Actualización 2
Olvidé pegar los registros.
registro de errores de 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 log: -
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
fuente
free
y empiezo. Divido esa memoria libre por 35 para obtener elmax_children value
. No entendí el propósito del último párrafo.max_children
que 3.free
tiene en cuenta? ¿El de la fila '- / + buffers / cache' que se usa para caché de disco, pero en realidad es gratis para aplicaciones?Su configuración de php-fpm parece estar bien.
Pero el servidor que está ejecutando tiene limitaciones de recursos. Es obvio de los registros que los procesos PHP están agotando la memoria disponible.
Agregando a las sugerencias proporcionadas por cyberx86:
Puede intentar editar el parámetro memory_limit en el archivo php.ini (ver aquí ) (aunque no estoy seguro de que sirva de mucho)
Dada la pequeña cantidad de memoria del sistema, creo que debería considerar seriamente cambiar al sistema operativo de 32 bits. El uso de un sistema operativo x64 te está lastimando en lugar de ser beneficioso.
Si no está utilizando el almacenamiento de InnoDB en su base de datos MySql, también puede considerar desactivar InnoDB en su my.cnf, ya que ahorrará otros 100 MB de RAM.
Lowendbox tiene un excelente tutorial sobre cómo optimizar los servidores para la configuración de poca memoria.
fuente
Un comando muy útil para encontrar la memoria tomada por php:
Luego divide la RAM que desea dedicar a php, ¡y tiene su valor max_children!
Además, puede monitorear manualmente (debe configurar el punto final php-status) o con Nagios.
fuente
awk: fatal: division by zero attempted
ps --no-headers -o "rss,cmd" | grep php5-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'
De alguna manera -C opciones no funciona.