← Назад к справочнику Nginx
🔧
Решение проблем
Типичные ошибки Nginx и их решения
Found: 11 problems
502 Bad Gateway
CommonNginx не может подключиться к бэкенду
502errorbackend
🔴 Проблема:
Причины: 1. Backend не запущен или недоступен 2. Неправильный порт в proxy_pass 3. Файрволл блокирует соединение 4. Backend не успевает отвечать (timeout)
✅ Решение:
# 1. Проверить, что backend запущен
sudo systemctl status your-backend-service
# или для Docker
docker ps | grep backend
# 2. Проверить доступность порта
curl http://localhost:8000
# или
telnet localhost 8000
# 3. Проверить логи Nginx
sudo tail -f /var/log/nginx/error.log
# 4. Увеличить таймауты в Nginx
# В конфиге:
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 5. Для Docker - проверить network
docker network inspect your-network-name504 Gateway Timeout
CommonBackend слишком долго обрабатывает запрос
504timeoutperformance
🔴 Проблема:
Причины: 1. Backend обрабатывает запрос > 60 секунд 2. Слишком маленькие таймауты в Nginx 3. Долгие SQL запросы или внешние API 4. Backend "завис"
✅ Решение:
# Увеличить таймауты в Nginx
server {
location /api {
proxy_pass http://backend:8000;
# Увеличенные таймауты
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
# Для очень долгих операций
proxy_buffering off;
}
}
# Проверить логи backend
# Найти медленные запросы
sudo tail -f /var/log/your-backend/app.logCORS ошибки
FAQCross-Origin Resource Sharing проблемы
corssecurityapi
🔴 Проблема:
Ошибка в браузере: "Access to fetch at 'https://api.example.com' from origin 'https://example.com' has been blocked by CORS policy" Причины: 1. Нет CORS headers 2. Неправильный origin 3. Preflight requests не обрабатываются
✅ Решение:
# Решение в Nginx
server {
location /api {
# CORS headers
add_header 'Access-Control-Allow-Origin' '$http_origin' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Max-Age' '86400' always;
# OPTIONS (preflight) requests
if ($request_method = OPTIONS) {
return 204;
}
proxy_pass http://backend:8000;
}
}
# Для конкретного домена:
add_header 'Access-Control-Allow-Origin' 'https://example.com' always;
# Для всех доменов (небезопасно в production):
add_header 'Access-Control-Allow-Origin' '*' always;SSL Certificate ошибки
Проблемы с SSL сертификатами
sslcertificatesecurity
🔴 Проблема:
Ошибки: 1. "certificate verify failed" 2. "SSL: certificate not found" 3. "mixed content" warnings
✅ Решение:
# 1. Проверить сертификат
sudo nginx -t
# 2. Проверить expiry date
openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem -noout -dates
# 3. Обновить сертификат
sudo certbot renew
# 4. Проверить цепочку сертификатов
openssl s_client -connect example.com:443 -servername example.com
# 5. Для mixed content warnings:
server {
# Форсировать HTTPS для всех ресурсов
add_header Content-Security-Policy "upgrade-insecure-requests" always;
}Nginx не запускается
CriticalСервис падает при старте
startupconfigurationdebugging
🔴 Проблема:
Причины: 1. Синтаксическая ошибка в конфиге 2. Порт уже занят 3. Нет прав на файлы 4. Отсутствует SSL сертификат
✅ Решение:
# 1. Проверить конфигурацию
sudo nginx -t
# 2. Проверить, что порт свободен
sudo netstat -tulpn | grep :80
sudo netstat -tulpn | grep :443
# Если порт занят - убить процесс:
sudo fuser -k 80/tcp
sudo fuser -k 443/tcp
# 3. Проверить логи
sudo tail -f /var/log/nginx/error.log
sudo journalctl -u nginx -n 50
# 4. Проверить права на файлы
ls -la /etc/nginx/nginx.conf
ls -la /var/log/nginx/
# 5. Проверить SELinux (если есть)
sudo setenforce 0
sudo systemctl start nginx413 Request Entity Too Large
Файл или запрос слишком большой
413uploadfile-size
🔴 Проблема:
Ошибка при загрузке файлов: "413 Request Entity Too Large" По умолчанию Nginx ограничивает размер до 1MB
✅ Решение:
# Увеличить лимит в конфиге
http {
# Глобально
client_max_body_size 100M;
}
# Или для конкретного location
server {
location /upload {
client_max_body_size 500M;
proxy_pass http://backend:8000;
}
}
# Перезагрузить конфигурацию
sudo nginx -t
sudo systemctl reload nginxConnection Refused
Не удается подключиться к Nginx
connectionfirewallnetwork
🔴 Проблема:
Ошибки: - "Connection refused" - "Unable to connect" - "ERR_CONNECTION_REFUSED"
✅ Решение:
# 1. Проверить, что Nginx запущен
sudo systemctl status nginx
# 2. Проверить, что слушает правильный порт
sudo netstat -tulpn | grep nginx
# 3. Проверить файрволл
sudo ufw status
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# Для firewalld:
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
# 4. Для облачных серверов - проверить Security Groups
# AWS, GCP, Azure и т.д. должны разрешать входящие 80/443
# 5. Проверить, что слушает 0.0.0.0 а не 127.0.0.1
# В конфиге должно быть:
listen 80;
# А не:
# listen 127.0.0.1:80;Медленная работа
Nginx работает медленно
performanceoptimizationmonitoring
🔴 Проблема:
Признаки: 1. Долгое время ответа 2. Высокая нагрузка на CPU 3. Много соединений в логах
✅ Решение:
# 1. Включить логирование времени ответа
http {
log_format timing '$remote_addr - $request_time - $request';
access_log /var/log/nginx/timing.log timing;
}
# 2. Оптимизировать worker процессы
worker_processes auto;
worker_connections 4096;
# 3. Включить кеширование
gzip on;
gzip_comp_level 6;
# Кеширование статики
location ~* \.(jpg|jpeg|png|css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# 4. Мониторинг
# Включить stub_status
location /nginx_status {
stub_status on;
allow 127.0.0.1;
deny all;
}
# 5. Проверить систему
top
htop
iotopDocker Networking проблемы
DockerNginx в Docker не видит другие контейнеры
dockernetworkingdns
🔴 Проблема:
Ошибки: - "host not found in upstream" - "no resolver defined to resolve" - Контейнеры не видят друг друга
✅ Решение:
# 1. Проверить, что контейнеры в одной сети
docker network ls
docker network inspect your-network-name
# 2. В docker-compose.yml явно указать сеть
version: '3.8'
services:
nginx:
networks:
- app-network
backend:
networks:
- app-network
networks:
app-network:
driver: bridge
# 3. Использовать имя сервиса в proxy_pass
location / {
# Не localhost:8000, а имя сервиса:
proxy_pass http://backend:8000;
}
# 4. Добавить resolver для динамического DNS
server {
resolver 127.0.0.11 valid=30s; # Docker DNS
location / {
set $backend http://backend:8000;
proxy_pass $backend;
}
}
# 5. Проверить expose в docker-compose
backend:
expose:
- "8000" # Не нужно ports, только expose503 Service Temporarily Unavailable
Rate limiting срабатывает слишком часто
rate-limiting503security
🔴 Проблема:
Ошибка: "503 Service Temporarily Unavailable" Причина: Превышен rate limit
✅ Решение:
# Проверить текущие настройки
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
limit_req zone=api_limit burst=20 nodelay;
# Решения:
# 1. Увеличить rate
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=100r/s;
# 2. Увеличить burst
limit_req zone=api_limit burst=50 nodelay;
# 3. Использовать delay вместо nodelay
limit_req zone=api_limit burst=20 delay=10;
# 4. Исключить определенные IP
geo $limit {
default 1;
10.0.0.0/8 0; # Внутренняя сеть
192.168.0.0/16 0;
}
map $limit $limit_key {
0 "";
1 $binary_remote_addr;
}
limit_req_zone $limit_key zone=api_limit:10m rate=10r/s;Отладка через логи
EssentialКак правильно читать и использовать логи
loggingdebuggingmonitoring
🔴 Проблема:
Нужно найти причину проблемы в логах
✅ Решение:
# 1. Access log (успешные запросы)
sudo tail -f /var/log/nginx/access.log
# 2. Error log (ошибки)
sudo tail -f /var/log/nginx/error.log
# 3. Включить детальное логирование
error_log /var/log/nginx/error.log debug;
# 4. Кастомный формат с timing
log_format detailed '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'rt=$request_time uct="$upstream_connect_time" '
'uht="$upstream_header_time" urt="$upstream_response_time"';
access_log /var/log/nginx/detailed.log detailed;
# 5. Фильтрация логов
# Найти все 502 ошибки
grep "502" /var/log/nginx/error.log
# Найти медленные запросы (>1 секунда)
awk '$NF > 1.0' /var/log/nginx/access.log
# Топ IP по количеству запросов
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
# 6. Ротация логов
sudo logrotate -f /etc/logrotate.d/nginx