Ответ
Я буду следовать системному подходу к диагностике, двигаясь по уровням сетевого стека (от приложения к сети).
1. Диагностика на уровне приложения и сервера:
- Проверю статус и логи сервиса:
sudo systemctl status nginx,sudo journalctl -u nginx --since "5 minutes ago". - Убежусь, что процесс слушает ожидаемый порт:
sudo ss -tlnp | grep :80илиsudo netstat -tulnp | grep :80. - Протестирую локальную доступность:
curl -v --connect-timeout 5 http://localhost/health.
2. Проверка системных ресурсов и конфигурации:
- Исключу нехватку ресурсов:
top,free -h,df -h. Высокая нагрузка на CPU/память или заполнение inodes могут приводить к отказам. - Проверю лимиты файловых дескрипторов:
cat /proc/$(pidof nginx)/limits | grep "open files". При исчерпании лимита новые соединения приниматься не будут. - Валидирую конфигурацию веб-сервера:
sudo nginx -t.
3. Анализ сетевого стека и правил:
- Проверю, не блокирует ли соединения межсетевой экран:
sudo iptables -L -n -vилиsudo nft list ruleset. - Изучу системные сетевые параметры, которые могут влиять на количество соединений (например,
net.core.somaxconn,net.ipv4.tcp_max_syn_backlog). - Использую
tcpdumpдля анализа трафика на интерфейсе:sudo tcpdump -i eth0 port 80 -n.
4. Восстановление и мониторинг:
- Если причина найдена и устранена, выполню graceful restart сервиса:
sudo systemctl reload nginx. - Настрою алертинг на ключевые метрики (количество активных соединений, ошибки) в Prometheus/Grafana для раннего обнаружения подобных инцидентов в будущем.
Пример быстрой проверки состояния сокетов для веб-сервера:
# Показать все TCP-сокеты в состоянии LISTEN
sudo ss -tln
# Показать количество соединений в разных состояниях для порта 80
sudo ss -tan | grep ':80 ' | awk '{print $1}' | sort | uniq -c