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