← Назад к справочнику Nginx
🔧

Решение проблем

Типичные ошибки Nginx и их решения

Found: 11 problems

502 Bad Gateway

Common

Nginx не может подключиться к бэкенду

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-name

504 Gateway Timeout

Common

Backend слишком долго обрабатывает запрос

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.log

CORS ошибки

FAQ

Cross-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 nginx

413 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 nginx

Connection 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
iotop

Docker Networking проблемы

Docker

Nginx в 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, только expose

503 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