Nginx php5-fpm upstream time (110: время ожидания соединения) при подключении к восходящему потоку
У нас есть веб-сервер, работающий с настройкой nginx php5-fpm apc.
Однако в последнее время мы столкнулись с ошибками тайм-аута подключения к восходящему потоку и замедлением во время рендеринга страниц. Быстрый перезапуск php5-fpm устранил проблему, но мы не смогли найти причину.
У нас есть еще один веб-сервер, на котором работает apache2 под другим поддоменом, подключая одну и ту же базу данных, выполняя ту же работу. Но замедление происходит только на сервере nginx-fpm.
Я думаю, что php5-fpm или apc могут вызвать проблемы.
Журналы сообщают, что различные тайм-ауты подключения:
upstream timed out (110: Connection timed out) while connecting to upstream bla bla bla
Журнал php5-fpm ничего не показывает. Просто ребенок начинает и заканчивает:
Apr 07 22:37:27.562177 [NOTICE] [pool www] child 29122 started
Apr 07 22:41:47.962883 [NOTICE] [pool www] child 28346 exited with code 0 after 2132.076556 seconds from start
Apr 07 22:41:47.963408 [NOTICE] [pool www] child 29172 started
Apr 07 22:43:57.235164 [NOTICE] [pool www] child 28372 exited with code 0 after 2129.135717 seconds from start
Сервер не загружался при возникновении ошибки, а загрузка была всего 2 (2cpus 16cores), и процессы php5-fpm, казалось, работали нормально.
nginx conf:
user www-data;
worker_processes 14;
pid /var/run/nginx.pid;
# set open fd limit to 30000
worker_rlimit_nofile 30000;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
сайт с поддержкой nginx conf:
location ~* \.php$ {
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_pass backend;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
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_intercept_errors off;
fastcgi_ignore_client_abort off;
fastcgi_connect_timeout 20;
fastcgi_send_timeout 20;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}
## Disable viewing .htaccess & .htpassword
location ~ /\.ht {
deny all;
}
}
upstream backend {
server 127.0.0.1:9000;
}
fpm conf:
pm.max_children = 500
pm.start_servers = 100
pm.min_spare_servers = 50
pm.max_spare_servers = 100
pm.max_requests = 10000
В файле fpm conf есть параметры аварийного перезапуска.
Я не знаю, помогают ли они нам решить проблему?
emergency_restart_interval = 0
Ответы
Ответ 1
Во-первых, уменьшите PHP-FPM max_requests
до 100; вы хотите, чтобы потоки PHP перезапускались намного раньше, чем 10000 req.
Во-вторых, у вас есть только один процесс PHP с большим количеством детей. Это хорошо для разработки, но в производстве вы хотите иметь больше процессов PHP с меньшим количеством детей, так что если этот процесс по какой-либо причине снизится, есть и другие, которые могут занять слабину. Таким образом, вместо соотношения 1:50, как у вас сейчас, переходите к соотношению 10: 5. Это будет намного более стабильным.
Чтобы добиться этого, вы можете посмотреть что-то вроде supervisor для управления вашими PHP-процессами. Мы используем это в производстве, и это действительно помогло увеличить время безотказной работы и сократить время, затрачиваемое на управление/мониторинг серверов. Вот пример нашей конфигурации:
/etc/php5/php-fpm.conf:
[global]
daemonize = no
[www]
listen = /tmp/php.socket
/etc/supervisor.d/php-fpm.conf:
[program:php]
user=root
command=/usr/sbin/php-fpm -c /etc/php5/php.ini -y /etc/php5/php-fpm.conf
numprocs=10
process_name=%(program_name)s
/etc/nginx/conf/php.backend:
upstream backend {
server unix:/tmp/php.socket
}
EDIT:
Как и во всех настройках сервера, не полагайтесь на догадки, чтобы отслеживать, где ваши проблемы. Я рекомендую установить Munin вместе с различными плагинами PHP (-FPM) и Nginx; они помогут вам отслеживать жесткую статистику по запросам, времени отклика, использования памяти, доступов к диску, уровней потоков/процессов... все это важно при отслеживании проблем.
Кроме того, как я уже упоминал в комментарии ниже, добавление кэширования на сервере и на стороне клиента к вашей настройке даже на скромном уровне может помочь в обеспечении лучшего опыта для пользователей, независимо от того, использует ли он nginx native поддержка кеширования или что-то более конкретное, как varnishd. Даже самые динамичные сайты/приложения имеют множество статических элементов, которые могут храниться в памяти и работать быстрее. Обслуживание их из кеша может помочь снизить общую нагрузку и обеспечить, чтобы те элементы, которые абсолютно должны быть динамическими, имеют все необходимые ресурсы, когда они им нужны.