# конспект · шаг 1 из 1
Конспект раздела: обратный прокси
Раздел про решение №4 во второй его ветке: содержимое отдаёт не диск, а другое приложение.
Что настраивают у любого прокси
1. КУДА идёт запрос proxy_pass (слеш решает, какой URI увидит бэкенд)
2. ЧТО бэкенд знает proxy_set_header: Host, X-Real-IP, X-Forwarded-*
3. СКОЛЬКО ждать proxy_connect/send/read_timeout
4. КАК отдавать клиенту proxy_buffering, proxy_buffer_size
Слеш в proxy_pass
location /api/ + http://app:8000; → /api/cart (URI как есть)
location /api/ + http://app:8000/; → /cart (префикс заменён)
location /api + http://app:8000/; → //cart (location без слеша → двойной слеш)
location /api + http://app:8000/v2/; → /v2//cart ← тоже двойной слеш
location /api/ + http://$backend/; → / ← переменная выбрасывает путь
Четыре строки заголовков
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
Настоящий адрес клиента даёт realip, а не доверие к X-Forwarded-For.
Список set_real_ip_from пишут узким, а real_ip_recursive оставляют
выключенным, пока доверенное звено одно: с широким списком on позволяет
клиенту назначить себе любой адрес.
Другие обработчики
| Протокол | Директива | Особенность |
|---|---|---|
| HTTP-бэкенд | proxy_pass |
слеш решает подстановку URI |
| PHP-FPM | fastcgi_pass |
SCRIPT_FILENAME + обязательный try_files $uri =404 |
| WebSocket | proxy_pass + Upgrade/Connection через map |
длинные таймауты |
Ловушки раздела списком
- путь в
proxy_passдлиннее слеша при непарных концах → двойной слеш и 404; - переменная в
proxy_pass→ путь запроса выброшен, бэкенд отвечает корнем; - своё правило
proxy_redirect→ умолчание отменено, работавшие редиректы сломаны; proxy_set_header/fastcgi_paramв location → унаследованные исчезли целиком;X-Forwarded-Forбезrealip→ подделывается тривиально;- нет
X-Forwarded-Proto→ бесконечный редирект за TLS-терминатором; proxy_read_timeout- пауза между чтениями, а не общее время;- 502
too big header- раздутые cookie не влезли вproxy_buffer_size; - php-локация без
try_files $uri =404- исполнение чужого файла черезPATH_INFO; - каталог загрузок без своего блока - исполнение загруженного
shell.php; proxy_buffering offглобально - воркер бэкенда занят на всех маршрутах;- поток «пачками» - это ответ с
Content-Lengthили сжатие, чанкованный идёт сразу и при включённой буферизации; - бэкенд литеральным адресом, а не группой
upstream- соединение на каждый запрос.
Свежее (проверено по CHANGES)
С 1.29.7 proxy_http_version по умолчанию 1.1, keepalive в upstream
включён сам, Connection: close бэкенду не шлётся - строка из старых
руководств больше не нужна. Значение 2 (HTTP/2 к бэкенду) есть с 1.29.4.
Проверено на стенде: keepalive работает в группе, а литеральный адрес в
proxy_pass группой не является и открывает соединение на каждый запрос.
Чек-лист: что ты должен уметь объяснить
- Как слеш в
proxy_passменяет URI на бэкенде и когда правда появляется//. - Что делает с путём переменная в
proxy_pass. - Что бэкенд видит без
proxy_set_headerи почему это ломает ссылки. - Чем
realipлучше логированияX-Forwarded-For. - Что именно ограничивает
proxy_read_timeout. - Зачем в WebSocket-конфиге нужен
mapвместо жёсткогоConnection: upgrade. - Чем на самом деле помогает буферизация и что задерживает поток.
- Почему рубежей у php-локации два и какой из них что закрывает.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий