Ошибка Nginx recv() завершилась неудачно (104: Сброс соединения по пиру)
Так как пару дней назад я получаю некоторые ошибки на моем сервере. Я использую CentOS 6.5 с Parallels 12.0.18, сервер Apache для обслуживания динамического контента и Nginx в качестве прокси для обслуживания статического контента.
Сначала я получил следующую ошибку:
[error] 29951#0: *5138862 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 89.7.24.108, server: , request: "GET /page/2/ HTTP/1.1", upstream: "http://ip:7080/page/2/", host: "domain.es", referrer: "http://domain.es/"
Затем я изменил некоторую конфигурацию, например, увеличил MaxClients в моем файле "httpd.conf" и добавил в мой файл /etc/nginx/conf.d/timeout.conf:
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
Казалось, что все работало нормально, пока я снова не получил те же ошибки, наряду с новой:
[error] 15228#0: *130292 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 89.130.25.154, server: domain.com, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:7080/", host: "domain.com"
У меня есть два разных сайта на одном сервере. Вот почему вы видите там двух разных хостов.
Вот проблема: когда я получил эти ошибки, я получил "502 Bad Gateway", и сервер становится настолько медленным, что я даже не могу войти в систему, используя терминал SSH. Я могу исправить это только временно, сбросив службу httpd.
Я знаю, что есть другие темы, похожие на эту, но я обнаружил только проблемы с PHP-FPM, которые я не использую.
Вот мой файл конфигурации Nginx: пользователь nginx; рабочий_процесс 16;
error_log /var/log/nginx/error.log;
events {
worker_connections 1024;
}
http {
server_names_hash_max_size 2048;
server_names_hash_bucket_size 512;
server_tokens off;
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 10;
# Gzip on
gzip on;
gzip_vary on;
gzip_min_length 10240;
gzip_proxied expired no-cache no-store private auth;
gzip_buffers 4 32k;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript text/x-js;
gzip_disable "MSIE [1-6]\.";
# Other configurations
ignore_invalid_headers on;
client_max_body_size 8m;
client_header_timeout 3m;
client_body_timeout 3m;
#send_timeout 3m;
connection_pool_size 256;
client_header_buffer_size 4k;
large_client_header_buffers 4 32k;
request_pool_size 4k;
output_buffers 4 32k;
postpone_output 1460;
# Cache most accessed static files
open_file_cache max=10000 inactive=10m;
open_file_cache_valid 2m;
open_file_cache_min_uses 1;
open_file_cache_errors on;
# virtual hosts includes
include "/etc/nginx/conf.d/*.conf";
}
Вот мой файл Nginx vhost: server { listen ip:80 default_server;
server_name domain.es;
server_name www.domain.es;
server_name ipv4.domain.es;
client_max_body_size 128m;
root "/var/www/vhosts/domain.es/httpdocs";
access_log "/var/www/vhosts/system/domain.es/logs/proxy_access_log";
error_log "/var/www/vhosts/system/domain.es/logs/proxy_error_log";
if ($host ~* ^www.domain.es$) {
rewrite ^(.*)$ http://domain.es$1 permanent;
}
location / {
proxy_pass http://82.194.74.41:7080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log off;
}
location @fallback {
proxy_pass http://ip:7080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log off;
}
location ~ ^/plesk-stat/ {
proxy_pass http://ip:7080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log off;
}
location ~ ^/(.*\.(ac3|avi|bmp|bz2|css|cue|dat|doc|docx|dts|exe|flv|gif|gz|htm|html|ico|img|iso|jpeg|jpg|js|mkv|mp3|mp4|mpeg|mpg|ogg|pdf|png|ppt|pptx|qt|rar|rm|swf|tar|tgz|txt|wav|xls|xlsx|zip))$ {
access_log off;
expires 7d;
add_header Cache-Control public;
try_files $uri @fallback;
}
include "/var/www/vhosts/system/domain.es/conf/vhost_nginx.conf";
}
И некоторые из конфигурационных переменных, которые я использую с Apache (httpd.conf):
<IfModule prefork.c>
StartServers 14
MinSpareServers 8
MaxSpareServers 14
ServerLimit 1000
MaxClients 1000
MaxRequestsPerChild 2000
</IfModule>
Заранее большое спасибо!
4 ответа
В моем случае расширение php отсутствует, после того как я его выключил, оно восстановилось! Проверьте /var/log/messages
чтобы увидеть, есть ли segfault
,
Кажется, ваш Apache более занят, чем ваш Nginx. Когда Nginx получает некоторые запросы, но Apache не может их обработать, вы получаете "502 Bad Gateway", что означает, что Apache отказался работать на Nginx.
Попробуйте уменьшить 'worker_connections' и 'worker_processes' в Nginx и увеличить 'MaxClients', 'ServerLimit'
Убедитесь, что worker_connections * worker_processes
Проследите свой код, чтобы определить, есть ли у вас такие вызовы, как «opendir» без «closedir».
В одном случае, который я недавно видел, эта ошибка регистрировалась для 95% запросов, но и веб-сервер, и сервер приложений были почти бездействующими, и было открыто только несколько соединений. Остальные 5% были успешными.
Оказалось, что наши дружелюбные коллеги по сетям настроили устройство IPS между веб-сервером и сервером приложений, и оно начало отбрасывать и прерывать соединения, когда трафик увеличивался, потому что он думал, что происходит атака грубой силы. Ложноположительный. Так что ничего общего с Nginx или Apache нет, но перенастройка IPS устранила проблему.