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

Не отвечает nginx при выполнении «перезагрузки nginx»

При перезагрузке nginx я начал получать ошибки в журнале сообщений «возможно SYN-флуд на порт 443», и похоже, что nginx в это время полностью перестает отвечать на запросы (довольно долго), потому что zabbix сообщает «nginx не работает» с пингом 0s. RPS на тот момент около 1800.

Но сервер продолжает реагировать на другие не веб-порты (SSH и т. Д.).

Куда мне обратиться и какие конфигурации (sysctl, nginx) я должен показать, чтобы найти первопричину этого.

Заранее спасибо.

UPD:

Дополнительная информация:

$ netstat -tpn |awk '/nginx/{print $6,$7}' |sort |uniq -c
   3266 ESTABLISHED 31253/nginx
   3289 ESTABLISHED 31254/nginx
   3265 ESTABLISHED 31255/nginx
   3186 ESTABLISHED 31256/nginx

Пример nginx.conf:

worker_processes  4;
timer_resolution 100ms;
worker_priority -15;
worker_rlimit_nofile 200000;

events {
  worker_connections  65536;
  multi_accept on;
  use epoll;
}

http {

  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;

  keepalive_requests 100;
  keepalive_timeout  65;

}

пользовательский sysctl.conf

net.ipv4.ip_local_port_range=1024 65535
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.all.send_redirects=0
net.core.netdev_max_backlog=10000
net.ipv4.tcp_syncookies=0
net.ipv4.tcp_max_syn_backlog=20480
net.ipv4.tcp_synack_retries=2
net.ipv4.tcp_syn_retries=2
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.netfilter.nf_conntrack_max=1048576
net.ipv4.tcp_congestion_control=htcp
net.ipv4.tcp_timestamps=1
net.ipv4.tcp_no_metrics_save=1
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=0
net.ipv4.tcp_max_tw_buckets=1400000
net.core.somaxconn=250000
net.ipv4.tcp_keepalive_time=900
net.ipv4.tcp_keepalive_intvl=15
net.ipv4.tcp_keepalive_probes=5
net.ipv4.tcp_fin_timeout=10

UPD2

При нормальной нагрузке со скоростью около 1800 RPS, когда я установил отставание на nginx до 10000 на 80 и 443 портах, а затем перезагрузил nginx, он стал использовать больше оперативной памяти (было использовано 3,8 ГБ из моего экземпляра 4 ГБ, и некоторые рабочие были убиты OOM -killer), а с worker_priority при -15 нагрузка была больше 6 (в то время как у моего экземпляра всего 4 ядра). Итак, экземпляр был довольно медленным, и я установил worker_priority на -5, а backlog на 1000 для каждого порта. На данный момент он использует меньше памяти, а пиковая нагрузка составила 3,8, но nginx по-прежнему не отвечает в течение минуты или двух после перезагрузки. Итак, проблема все еще сохраняется.

Некоторые подробности netstat:

netstat -tpn |awk '/:80/||/:443/{print $6}' |sort |uniq -c
      6 CLOSE_WAIT
     14 CLOSING
  17192 ESTABLISHED
    350 FIN_WAIT1
   1040 FIN_WAIT2
    216 LAST_ACK
    338 SYN_RECV
  52541 TIME_WAIT

Если у вас есть:

  keepalive_timeout  65;

Я могу себе представить, что может потребоваться некоторое время, чтобы соединения были прерваны, а работники перезапущены. Я не совсем уверен, не глядя в код, ожидает ли nginx истечения срока их действия после перезагрузки.

Вы можете попробовать уменьшить значение и посмотреть, поможет ли это.