Назад | Перейти на главную страницу

Nginx - неожиданная запись FastCGI PHP7 при чтении заголовка ответа из восходящего потока

Два дня назад я обновился до PHP7 (PHP 7.0.14) на рабочем сервере (CentOS 6.8). Теперь я получаю следующую ошибку в журналах nginx (1.10.2-1).

2017/01/20 08:20:04 [ошибка] 7654 # 7654: * 153301 восходящий поток отправил неожиданную запись FastCGI: 3 при чтении заголовка ответа от восходящего потока, клиент: XXX.XXX.XXX.XXX, сервер: example.com, запрос : "GET / HTTP / 1.0", восходящий поток: "fastcgi: // unix: /var/run/php-fpm/example.fpm.sock:", host: "www.example.com"

  1. У нас есть несколько веб-сайтов, на каждом из которых работает свой индивидуальный пул php-fpm, и эта ошибка появляется на всех веб-сайтах одновременно.
  2. Браузер показывает "502 Bad Gateway" во время этой ошибки на всех веб-сайтах.
  3. Эта ошибка возникает на 1-2 минуты, после чего все автоматически возвращается в норму.
  4. Это происходило трижды в день в разное время.
  5. С PHP5 проблем не было.
  6. Я попытался внести в черный список все папки кеша приложений в opcache

У нас есть еще один сервер с аналогичной настройкой, который был обновлен до PHP7, у него нет таких проблем.

Как мне устранить неполадки и найти решение этой проблемы?

ОБНОВЛЕНИЕ 1 Сведения о сервере
Процессор: 2x Intel (R) Xeon (R) CPU E5-2620 0 @ 2,00 ГГц
Оперативная память: 256 ГБ
ОС: CentOS версии 6.8
Ядро: 2.6.32-504.8.1.el6.x86_64
PHP: использование 7.0.14-3 из репозитория IUS
Nginx: 1.10.2-1

Сервер используется в качестве веб-сервера для запуска нескольких сайтов с популярным приложением PHP с открытым исходным кодом. Мы используем Nginx с php-fpm в качестве бэкэнда. На каждом веб-сайте есть пул php-fpm и разные сокеты. Приложение PHP уже совместимо с php7, и единственное изменение - обновление до PHP7.

ОБНОВЛЕНИЕ 2

Основная конфигурация 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;
}

Индивидуальный шаблон сайта nginx

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

}

Шаблон пула 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"

ОБНОВЛЕНИЕ 3 Когда возникает проблема

Запрос 1

GET /moodle/ HTTP/1.0
User-Agent: Pingdom.com_bot_version_1.4_(http://www.pingdom.com/)
Host: www.example.com

Полученный заголовок

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

Полученный контент

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

Хорошо, все пулы php-fpm отключены на несколько минут одновременно, и единственное, что изменилось с php 5.6 => php 7. Что изменилось с php7? Что является глобальным для всех пулов php-fpm? Файл opcache. Не могли бы вы предоставить свой php.ini? Если нет, проверьте конфигурацию opcache и проверьте хотя бы следующие параметры:

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!!

измените force_restart_timeout со 180 на 120, измените opcache.log_verbosity_level на что-то> = 3 и посмотрите, не короче ли отключение, чем обычно .. Тогда предлагаю ваш обзор конфигурация времени выполнения opcache и правильно настройте его для своего сайта.

Похоже, это была ошибка в PHP, которая была исправлена ​​в версии 7.0.16 от 16 февраля 2017 года.

Исправлена ​​ошибка #67583 (двойной fastcgi_end_request на ограничении max_children).

Проверить блок сервера на fastcgi_pass в конфигурации сайта nginx.

Чтобы обновить fastcgi_pass для всех конфигураций сайта, запустите:

sed "s / php5 / php / php7.0 / g" * .conf -i

сервис nginx && php7.0-fpm