Код-ревью Senior Балансировка и nginx обновлено

Код-ревью: конфиг nginx перед API

Вопрос

Конфиг стоит перед API, через который загружают файлы до 50 МБ. Найдите проблемы.

upstream api {
    server 10.0.1.10:8080;
    server 10.0.1.11:8080;
}
server {
    listen 80;
    server_name api.example.ru;
    location /api {
        proxy_pass http://api;
        proxy_set_header X-Forwarded-For $http_x_forwarded_for;
        proxy_read_timeout 600s;
        proxy_next_upstream error timeout non_idempotent;
    }
    location /admin {
        proxy_pass http://api;
    }
    location /internal/metrics {
        proxy_pass http://api;
    }
}

Коротко

Конфиг рабочий, но в нём есть все классические проблемы: нет TLS и keepalive, неправильные заголовки, опасные повторы и открытые служебные пути. Хорошая привычка при ревью nginx: пройти по чек-листу TLS, заголовки, таймауты, лимиты тела и частоты, повторы, доступ к служебным location.

Что должен найти ревьюер

  1. Безопасностьстрока 6
    Только HTTP на 80: нет TLS, пароли и токены идут открытым текстом. Нужен 443 с сертификатом и редирект с 80.
  2. Производительностьстрока 1
    Нет keepalive в upstream (и proxy_http_version 1.1): на каждый запрос новое соединение к бэкенду.
  3. Ошибкастрока 8
    Нет client_max_body_size: по умолчанию 1 МБ, загрузка файлов до 50 МБ получит 413.
  4. Ошибкастрока 9
    Не передаётся Host: бэкенд получит имя upstream api вместо домена.
  5. Безопасностьстрока 10
    X-Forwarded-For копируется от клиента как есть: адрес подделывается. Нужен $proxy_add_x_forwarded_for и доверие только своим прокси.
  6. Производительностьстрока 11
    proxy_read_timeout 600s для API: зависшие запросы держат соединения 10 минут, а клиент давно ушёл. Таймаут по реальному SLO.
  7. Ошибкастрока 12
    non_idempotent разрешает повтор POST на другой сервер: возможны двойные операции.
  8. Безопасностьстрока 14
    /admin открыт всему интернету без ограничения по IP или аутентификации на уровне прокси.
  9. Безопасностьстрока 17
    Внутренние метрики доступны снаружи. Закрыть allow/deny или отдавать на отдельном внутреннем порту.

Разбор

Конфиг рабочий, но в нём есть все классические проблемы: нет TLS и keepalive, неправильные заголовки, опасные повторы и открытые служебные пути. Хорошая привычка при ревью nginx: пройти по чек-листу TLS, заголовки, таймауты, лимиты тела и частоты, повторы, доступ к служебным location.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.