This commit is contained in:
@@ -0,0 +1,143 @@
|
||||
# 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; для конкретного проекта это отдельный сценарий.
|
||||
Reference in New Issue
Block a user