# P26 · апрель 2020 · Reverse proxy перед приложением — тройное ревью Статус: **принят в publication registry 31 июля 2026 года**. Registry накладывает ревизии по стабильным slug и сохраняет дату и автора базового архива. `articles.json`, стандарт, очередь и package-конфигурация не перезаписывались. ## Состав пакета | Материал | Stable slug | Визуал | Основной текст по draft gate | | --- | --- | --- | ---: | | Практика | `editorial-2020-04-practice-reverse-proxy` | `reverse-proxy-request-hops-2020.svg` | 9 620 знаков | | Механизм | `editorial-2020-04-mechanism-reverse-proxy` | `reverse-proxy-header-boundary-2020.svg` | 10 533 знака | | Разбор | `editorial-2020-04-field-reverse-proxy` | `reverse-proxy-diagnosis-2020.svg` | 10 504 знака | Ревизии не содержат полей `date` и `author`: при будущей интеграции сохраняются дата, автор и slug базового архива. ## Проход 1 — факты и техника ### Проверенные опоры - [Nginx `ngx_http_proxy_module`](https://nginx.org/en/docs/http/ngx_http_proxy_module.html): `proxy_pass`, явная подстановка `Host`, `proxy_set_header`, а также различие `proxy_connect_timeout`, `proxy_send_timeout` и `proxy_read_timeout`. - [Nginx `ngx_http_realip_module`](https://nginx.org/en/docs/http/ngx_http_realip_module.html): адрес по header меняется только для источника, который явно назван через `set_real_ip_from`. - [Nginx `ngx_http_log_module`](https://nginx.org/en/docs/http/ngx_http_log_module.html): `log_format`, `access_log`, `request_time` и роль формата журнала как наблюдаемого артефакта. - [RFC 7239](https://www.rfc-editor.org/rfc/rfc7239): `Forwarded`, связь со старым семейством `X-Forwarded-*` и ограничение целостности forwarded-данных без доверенной цепочки proxy. - [RFC 7230](https://www.rfc-editor.org/rfc/rfc7230): исторический HTTP/1.1-контекст апреля 2020 года для маршрутизации и `Host`. ### Что проверено в тексте 1. Reverse proxy описан как граница двух HTTP-hop-ов, а не как «прозрачный провод». 2. `proxy_read_timeout` назван интервалом между последовательными чтениями ответа, а не полной длительностью ответа. 3. `Host`, `X-Forwarded-*` и real IP не объявлены достоверными без источника и договора доверия. 4. 502/504 названы входом в диагностическую ветку, а не самостоятельным диагнозом. 5. Учебная конфигурация не подменяет реальную: `127.0.0.1`, пути, timeout-значения, URL и токены явно помечены заполнителями. ### Границы и запреты В текст не добавлены service mesh, OpenTelemetry, Kubernetes Ingress или современные облачные практики как опыт автора 2020 года. Не опубликованы реальные hostnames, IP-адреса, cookie, токены, secrets или пользовательские данные. `curl`, access-log и значения времени даны как учебные либо синтетические примеры; они не выдаются за запуск на стенде. **Вердикт прохода 1: пройден.** Технические утверждения привязаны к первичным источникам, а недоказанные эксплуатационные выводы явно ограничены. ## Проход 2 — редактура, голос и структура ### Проверка голоса M3 / апрель 2020 Автор развивает ширину от HTTP и локальной доставки к backend boundary: `клиент → Nginx → приложение`, конфигурация, таймаут, безопасный access-log. Тон прагматичный: «симптом → причина → проверка → действие». Он не говорит от лица владельца крупной платформы и не обещает универсальные значения таймаутов. Слова `upstream`, `hop`, `TLS termination`, `Forwarded` и real IP привязаны к конфигурации, журналу или конкретному ограничению. ### Обязательные элементы в каждой статье | Критерий | Практика | Механизм | Разбор | | --- | --- | --- | --- | | Проблема и цена в первых двух абзацах | Да | Да | Да | | 5–15 тыс. знаков основного текста | Да | Да | Да | | `table` с `caption` и `thead` | Да | Да | Да | | `figure` с содержательными `alt` и подписью | Да | Да | Да | | Конфигурация, curl или log-пример | Nginx + curl | Nginx + log format | log format + синтетический log + curl | | Нумерованный маршрут | Да | Да | Да | | Не менее двух первичных/официальных ссылок | 5 | 5 | 5 | Проверены повторы, канцелярские обобщения и анахронизмы. Заголовки отвечают именно на вопрос соответствующей статьи: практический контракт, механизм двух соединений и безопасное расследование. В финалах зафиксированы следующий шаг и границы применимости, а не обещание «решить все proxy-проблемы». **Вердикт прохода 2: пройден.** Плотность достаточна, тон соответствует переходу автора к delivery и backend boundary в 2020 году. ## Проход 3 — визуал и выпускной preflight ### Реально выполненные проверки ```text node --check scripts/upgrade-2020-04.mjs → code 0 npm run audit:draft -- scripts/upgrade-2020-04.mjs → code 0 → PASS practice: 9 620 body chars → PASS mechanism: 10 533 body chars → PASS field: 10 504 body chars xmllint --noout public/assets/editorial/2020/reverse-proxy-request-hops-2020.svg \ public/assets/editorial/2020/reverse-proxy-header-boundary-2020.svg \ public/assets/editorial/2020/reverse-proxy-diagnosis-2020.svg → code 0 ``` `npm` напечатал известные предупреждения пользовательской конфигурации `store-dir`, `cache-dir`, `public-hoist-pattern`; команда завершилась кодом 0, они не относятся к P26. ### Визуальный preflight Все три SVG отрендерены Sharp при ширине 375 px и просмотрены вручную: - `reverse-proxy-request-hops-2020.svg` — вертикальная последовательность клиента, Nginx, приложения и совместной диагностики; переполнения и обрезания не обнаружены. - `reverse-proxy-header-boundary-2020.svg` — крупные карточки источника, договора и чтения приложением; вторичный текст остаётся различимым. - `reverse-proxy-diagnosis-2020.svg` — пять вертикальных шагов расследования; стрелки не перекрывают подписи, финальная карточка читается на 375 px. SVG не содержат внешних ресурсов. В HTML каждой статьи есть отдельные содержательные `alt` и `figcaption`; таблицы завёрнуты в `table-scroll`, как требует существующий шаблон. Основной редактор независимо просмотрел финальные raster-версии трёх схем на 375 px и подтвердил этот результат. После подключения registry strict audit и production build также пройдены. Они не подменяют запуск Nginx, `curl` или browser на конкретном стенде. ### Невыполненные проверки, которые не выдаются за факты - Nginx не запускался и конфигурация не загружалась в daemon. - Учебный `curl` не выполнялся. - Browser, CI, staging и production-прогон не выполнялись. - Не было доступа к реальному access-log или логу приложения; строка в статье явно названа синтетической. ### Интеграционная проверка | Проверка | Результат | | --- | --- | | Strict audit после подключения registry | PASS: 9 620 / 10 533 / 10 504 знака; 1 / 2 / 1 table и 2 / 2 / 3 code example | | `npm run build` | PASS, code 0, 374 статические страницы | | Scope/self-review | PASS: в revision нет `date`/`author`, `articles.json` не перезаписан | **Выпусковой вердикт: тройное ревью пройдено, пакет принят к публикации.** Статические проверки подтверждают качество редакционного слоя, но не утверждают фактическое поведение Nginx, доступность стенда или реальный access-log; для конкретного проекта это отдельный сценарий.