Actualicé a PHP7 (PHP 7.0.14) en un servidor de producción (CentOS 6.8) hace dos días. Ahora recibo el siguiente error en los registros de nginx (1.10.2-1).
2017/01/20 08:20:04 [error] 7654#7654: *153301 upstream envió un registro FastCGI inesperado: 3 mientras leía el encabezado de respuesta desde upstream, cliente: XXX.XXX.XXX.XXX, servidor: ejemplo.com, solicitud : "GET / HTTP/1.0", ascendente: "fastcgi://unix:/var/run/php-fpm/example.fpm.sock:", host: "www.example.com"
- Tenemos varios sitios web, todos ejecutando su grupo php-fpm individual y este error aparece en todos los sitios web al mismo tiempo.
- El navegador muestra "502 Bad Gateway" durante este error en todos los sitios web.
- Este error aparece durante 1-2 minutos y luego todo vuelve a la normalidad automáticamente.
- Ocurrió tres veces al día en diferentes momentos.
- No hubo ningún problema con PHP5.
- Intenté poner en la lista negra todas las carpetas de caché de aplicaciones en opcache
Tenemos otro servidor con una configuración similar que se actualizó a PHP7 y no tiene tales problemas.
¿Cómo debo solucionar y encontrar una solución a este problema?
ACTUALIZACIÓN 1
Detalles del servidor
CPU: 2 CPU Intel(R) Xeon(R) E5-2620 0 a 2,00 GHz
RAM: 256 GB
SO: CentOS versión 6.8
Kernal: 2.6.32-504.8.1.el6.x86_64
PHP: uso de 7.0.14-3 del repositorio de IUS
Nginx: 1.10.2-1
El servidor se utiliza como servidor web para ejecutar varios sitios que ejecutan una popular aplicación PHP de código abierto. Usamos Nginx con php-fpm como backend. Cada sitio web tiene un grupo php-fpm separado y diferentes sockets. La aplicación PHP ya es compatible con php7 y el único cambio es la actualización a PHP7.
ACTUALIZACIÓN 2
Configuración principal de Nginx
user apache;
worker_processes auto;
error_log /var/log/nginx/error.log alert;
pid /var/run/nginx.pid;
events {
use epoll;
worker_connections 4024;
multi_accept on;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 256;
server_names_hash_max_size 1024;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
client_max_body_size 512M;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
gzip on;
gzip_http_version 1.1;
gzip_vary on;
gzip_comp_level 6;
gzip_proxied any;
gzip_min_length 1000;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/javascript text/xml application/xml application/rss+xml application/atom+xml application/rdf+xmli font/ttf font/otf image/svg+xm;
gzip_buffers 16 24k;
gzip_disable msie6;
fastcgi_connect_timeout 120;
fastcgi_send_timeout 1200;
fastcgi_read_timeout 1200;
fastcgi_buffer_size 256k;
fastcgi_buffers 16 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
keepalive_requests 10000;
include /etc/nginx/conf.d/*.conf;
# Load all vhosts !
include /etc/nginx/sites-enabled/*.conf;
}
Plantilla de sitio nginx individual
server {
server_name @@HOSTNAME@@ www.@@HOSTNAME@@;
root "@@PATH@@";
index index.php index.html index.htm;
add_header Cache-Control public;
client_max_body_size 512m;
access_log @@LOG_PATH@@/access.log;
error_log @@LOG_PATH@@/error.log;
location / {
# This is cool because no php is touched for static content
try_files $uri $uri/ $uri/index.php @rewrite /index.php$uri?$args;
}
location @rewrite {
rewrite ^ /index.php;
}
location ~ \.php$ {
send_timeout 1200;
proxy_read_timeout 1200;
proxy_connect_timeout 120;
fastcgi_read_timeout 1200;
fastcgi_pass unix:@@SOCKET@@;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
access_log off;
}
location ~* \.(html|htm)$ {
expires 30m;
}
location ~* /\.(ht|git|svn|bak) {
deny all;
}
location ~ ^/sites/.*/files/styles/ {
try_files $uri @rewrite;
}
}
Plantilla de grupo PHP FPM
[@@USER@@]
listen = /var/run/php-fpm/@@USER@@.fpm.sock
listen.owner = nobody
listen.group = nobody
listen.mode = 0666
user = @@USER@@
group = @@USER@@
pm = ondemand
pm.max_children = 50
pm.process_idle_timeout = 300s
pm.max_requests = 5000
rlimit_files = 1024
request_terminate_timeout = 1200s
security.limit_extensions = .php
php_admin_value[session.save_path] = "@@HOME_DIR@@/_sessions"
php_admin_value[error_log] = "@@HOME_DIR@@/logs/www-error.log"
ACTUALIZACIÓN 3 Cuando ocurre el problema
Solicitud 1
GET /moodle/ HTTP/1.0
User-Agent: Pingdom.com_bot_version_1.4_(http://www.pingdom.com/)
Host: www.example.com
encabezado recibido
502 Bad Gateway
Server: nginx/1.10.2
Date: Wed, 25 Jan 2017 12:32:00 GMT
Content-Type: text/html
Content-Length: 173
Connection: close
Contenido recibido
<html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx/1.10.2</center>
</body>
</html>
Respuesta1
Ok, todos los grupos de php-fpm están inactivos durante varios minutos al mismo tiempo, y lo único que cambió con php 5.6 => php 7. ¿Qué cambió con php7? ¿Qué es global en todos los grupos de php-fpm? El opcaché. ¿Sería tan amable de proporcionarnos su php.ini? De lo contrario, verifique su configuración de opcache y verifique al menos estos parámetros:
zend_extension=opcache.so;
opcache.enable=1; # on or off on your config ?
opcache.memory_consumption=64; # Too small for you ?
opcache.max_accelerated_files=2000; # maybe to small for you ?
opcache.force_restart_timeout="180"; # Oh!!! This is the time of your outage!!
cambie force_restart_timeout de 180 a 120, cambie opcache.log_verbosity_level a algo >=3 y observe si la interrupción es más corta de lo habitual. Entonces le sugiero su revisión.configuración del tiempo de ejecución de opcachey sintonícelo correctamente para su sitio.
Respuesta2
Parece que fue un error en PHP que se solucionó en la versión 7.0.16 del 16 de febrero de 2017.
Error corregido #67583(doble fastcgi_end_request en el límite max_children).
Respuesta3
Verifique el bloque del servidor parafastcgi_passen la configuración del sitio nginx.
Para actualizar fastcgi_pass para todas las configuraciones del sitio, ejecute:
sed "s/php5/php/php7.0/g" *.conf -i
servicio nginx && php7.0-fpm