Как исправить ошибку «recv() failed (104: Connection reset by peer) 502» в php-fpm / nginx?

Здравствуйте. Имеется сервер fastvps.ru/dedicated тариф EX-4, установлена ОС Debian-70-wheezy-64. Крутится один основной сайт, на связке nginx и php-fpm. Если нагрузить сайт тестом Siege буквально 10 потоками, то в лог начинают валиться ошибки:

readv() failed (104: Connection reset by peer) while reading upstream
recv() failed (104: Connection reset by peer) while reading response

Optcache включен. Помогите разобраться, что не так с конфигами? Судя по всему, дело в php-fpm.

Конфиг php-fpm:
cosmopolite.ru/php_fpm.txt

Конфиг nginx:
user www-data;
worker_processes 4;
pid /var/run/nginx.pid;

events {
	worker_connections 768;
}

http {

	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 65;
	types_hash_max_size 2048;

	proxy_read_timeout 500;
	proxy_connect_timeout 500;
	client_max_body_size 100M;
	server_names_hash_bucket_size 64;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;

	gzip on;
	gzip_disable "msie6";

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
	include /usr/local/ispmgr/etc/nginx.domain;

}
  • Вопрос задан
  • 38106 просмотров
Решения вопроса 1
@CHADo
Siege разорвал соединение, пока nginx получал данные от php-fpm или что там у тебя в /etc/nginx/conf.d/*.conf;

Начни с тестов без php, сделай каталог с простым index.html и натрави туда. Если ошибки остались, дело в кол-во обработчиков: 4 процесса по 768 медленнее, чем 1 процесс с 3072 сокетами на современном железе. Подними worker_connections до 2048 хотя бы.

Далее с backlog
Через sysctl net.core.somaxconn узнай значение backlog, если оно меньше параметра worker_connections то в sysctl.conf увеличивай до значения = worker_connections
Такое же значение укажи в fpm listen.backlog
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
ptchol
@ptchol
Linux system administrator
Попробуйте в конфиге пула fpm'а установить

pm = static
pm.max_children = 60

и посмотреть, скажется ли это в положительную сторону на вашем тесте.
Если да, то вам нужно регулировать значения
pm.max_children \ pm.max_spare_servers в режиме dynamic.
Их значения будут зависеть от профиля вашей нагрузки, насколько он равномерный или наоборот "пиковый".

А чем вам не нравиться static ? У Вас как я погляжу на сервере 16Гб оперативки, не так уж и много займут воркеры в "пустом" состоянии.
Ответ написан
Andchir
@Andchir
PHP/Python/JS Фуллстек
Была такая проблема. Решилась выставлением правильного владельца на файлы
sudo chown -R www-data:www-data /var/www/mysite.com
Ответ написан
Комментировать
Проблема шире чем кажется:
Надо понимать, что это означает - отвалился php
отвалиться он может по нескольким причинам:
1) лимиты в самом php.ini - первое из них время выполнения php скрипта
2) лимиты удержания сокета (конекта) настройки php-fpm
3) лимиты ожидания ответа от php-fpm со стороны nginx
4) все процессы заняты (умерли)

И вот когда все таймауты правильно настроенны и вас нет ооооочень долго выполняющихся скриптов - тогда все чики пуки.

Тюнить надо одновременно все эти 4 составляющие, понимаю взаимодействие.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы