revise April 2020 proxy articles
Build and deploy / deploy (push) Successful in 13s

This commit is contained in:
2026-07-31 11:22:40 +03:00
parent cf5472d22f
commit b1e9aae0c2
7 changed files with 678 additions and 1 deletions
@@ -0,0 +1,58 @@
<svg xmlns="http://www.w3.org/2000/svg" width="720" height="1300" viewBox="0 0 720 1300" role="img" aria-labelledby="title desc">
<title id="title">Маршрут диагностики reverse proxy</title>
<desc id="desc">Вертикальная схема показывает порядок расследования: сначала зафиксировать симптом и цену, затем выбрать безопасный маршрут, проверить конфигурацию и заголовки, сопоставить access-log с логом приложения, изменить одну подтверждённую границу и повторить запрос.</desc>
<defs>
<linearGradient id="bg" x1="0" x2="0" y1="0" y2="1">
<stop offset="0" stop-color="#fff5f4"/>
<stop offset="1" stop-color="#f3fbf8"/>
</linearGradient>
<marker id="arrow" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto">
<path d="M0,0 L12,6 L0,12 Z" fill="#a4473d"/>
</marker>
</defs>
<rect width="720" height="1300" rx="32" fill="url(#bg)"/>
<text x="48" y="66" fill="#5b2420" font-family="Arial, sans-serif" font-size="34" font-weight="700">Диагностика: одна ветка за раз</text>
<text x="48" y="104" fill="#7d5b58" font-family="Arial, sans-serif" font-size="22">502/504 — начало проверки, не причина</text>
<rect x="48" y="146" width="624" height="154" rx="22" fill="#ffffff" stroke="#d4867d" stroke-width="3"/>
<circle cx="94" cy="198" r="23" fill="#b34d43"/>
<text x="86" y="206" fill="#ffffff" font-family="Arial, sans-serif" font-size="21" font-weight="700">1</text>
<text x="136" y="196" fill="#5b2420" font-family="Arial, sans-serif" font-size="28" font-weight="700">Симптом и цена</text>
<text x="136" y="234" fill="#704e4a" font-family="Arial, sans-serif" font-size="22">Неверная схема, адрес, 502 или 504</text>
<text x="136" y="268" fill="#704e4a" font-family="Arial, sans-serif" font-size="22">Что сломается при повторе?</text>
<line x1="360" y1="316" x2="360" y2="360" stroke="#a4473d" stroke-width="5" marker-end="url(#arrow)"/>
<rect x="48" y="380" width="624" height="154" rx="22" fill="#ffffff" stroke="#d4867d" stroke-width="3"/>
<circle cx="94" cy="432" r="23" fill="#b34d43"/>
<text x="86" y="440" fill="#ffffff" font-family="Arial, sans-serif" font-size="21" font-weight="700">2</text>
<text x="136" y="430" fill="#5b2420" font-family="Arial, sans-serif" font-size="28" font-weight="700">Один безопасный маршрут</text>
<text x="136" y="468" fill="#704e4a" font-family="Arial, sans-serif" font-size="22">Без персональных данных и секретов</text>
<text x="136" y="502" fill="#704e4a" font-family="Arial, sans-serif" font-size="22">Один диагностический токен</text>
<line x1="360" y1="550" x2="360" y2="594" stroke="#a4473d" stroke-width="5" marker-end="url(#arrow)"/>
<rect x="48" y="614" width="624" height="184" rx="22" fill="#fff0ed" stroke="#d1675d" stroke-width="3"/>
<circle cx="94" cy="666" r="23" fill="#b34d43"/>
<text x="86" y="674" fill="#ffffff" font-family="Arial, sans-serif" font-size="21" font-weight="700">3</text>
<text x="136" y="664" fill="#5b2420" font-family="Arial, sans-serif" font-size="28" font-weight="700">Конфигурация и contract</text>
<text x="136" y="702" fill="#704e4a" font-family="Arial, sans-serif" font-size="22">proxy_pass • headers • trusted proxy</text>
<text x="136" y="738" fill="#704e4a" font-family="Arial, sans-serif" font-size="22">connect • send • read timeout</text>
<text x="136" y="774" fill="#704e4a" font-family="Arial, sans-serif" font-size="22">Не менять всё одновременно</text>
<line x1="360" y1="814" x2="360" y2="858" stroke="#a4473d" stroke-width="5" marker-end="url(#arrow)"/>
<rect x="48" y="878" width="624" height="184" rx="22" fill="#e8f5ef" stroke="#5a9a78" stroke-width="3"/>
<circle cx="94" cy="930" r="23" fill="#3d8560"/>
<text x="86" y="938" fill="#ffffff" font-family="Arial, sans-serif" font-size="21" font-weight="700">4</text>
<text x="136" y="928" fill="#1d4d36" font-family="Arial, sans-serif" font-size="28" font-weight="700">Сопоставить наблюдения</text>
<text x="136" y="966" fill="#416451" font-family="Arial, sans-serif" font-size="22">proxy: status • time • upstream</text>
<text x="136" y="1002" fill="#416451" font-family="Arial, sans-serif" font-size="22">приложение: запись того же токена</text>
<text x="136" y="1038" fill="#416451" font-family="Arial, sans-serif" font-size="22">Нет записи — честно фиксируем unknown</text>
<line x1="360" y1="1078" x2="360" y2="1122" stroke="#3d8560" stroke-width="5" marker-end="url(#arrow)"/>
<rect x="48" y="1142" width="624" height="112" rx="22" fill="#1d4d36"/>
<text x="82" y="1190" fill="#ffffff" font-family="Arial, sans-serif" font-size="27" font-weight="700">5. Одна правка → повтор</text>
<text x="82" y="1226" fill="#c9ead7" font-family="Arial, sans-serif" font-size="22">Сохранить критерий отката и следующий шаг</text>
</svg>

After

Width:  |  Height:  |  Size: 5.3 KiB

@@ -0,0 +1,47 @@
<svg xmlns="http://www.w3.org/2000/svg" width="720" height="1280" viewBox="0 0 720 1280" role="img" aria-labelledby="title desc">
<title id="title">Граница заголовков между клиентом, Nginx и приложением</title>
<desc id="desc">Вертикальная схема показывает, что входные клиентские заголовки не считаются достоверными сами по себе, Nginx формирует согласованный набор полей, а приложение читает только те поля, источник которых определён.</desc>
<defs>
<linearGradient id="bg" x1="0" x2="0" y1="0" y2="1">
<stop offset="0" stop-color="#fff8ee"/>
<stop offset="1" stop-color="#f2f5ff"/>
</linearGradient>
<marker id="arrow" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto">
<path d="M0,0 L12,6 L0,12 Z" fill="#835121"/>
</marker>
</defs>
<rect width="720" height="1280" rx="32" fill="url(#bg)"/>
<text x="48" y="66" fill="#3d2b19" font-family="Arial, sans-serif" font-size="34" font-weight="700">Header без источника — не факт</text>
<text x="48" y="104" fill="#725d49" font-family="Arial, sans-serif" font-size="22">Сначала договор, затем чтение в приложении</text>
<rect x="48" y="146" width="624" height="210" rx="22" fill="#ffffff" stroke="#d6a96d" stroke-width="3"/>
<text x="82" y="198" fill="#3d2b19" font-family="Arial, sans-serif" font-size="29" font-weight="700">Внешний запрос</text>
<text x="82" y="236" fill="#624e3c" font-family="Arial, sans-serif" font-size="22">Host • Cookie • X-Forwarded-* • тело</text>
<text x="82" y="274" fill="#624e3c" font-family="Arial, sans-serif" font-size="22">Клиент может прислать любой header</text>
<rect x="82" y="296" width="402" height="38" rx="12" fill="#fff0dc"/>
<text x="102" y="322" fill="#8a4c15" font-family="Arial, sans-serif" font-size="20" font-weight="700">Не назначаем доверие здесь</text>
<line x1="360" y1="372" x2="360" y2="436" stroke="#835121" stroke-width="5" marker-end="url(#arrow)"/>
<rect x="48" y="456" width="624" height="298" rx="22" fill="#fff0dc" stroke="#c77c28" stroke-width="3"/>
<text x="82" y="508" fill="#3d2b19" font-family="Arial, sans-serif" font-size="29" font-weight="700">Nginx: формирует договор</text>
<text x="82" y="548" fill="#624e3c" font-family="Arial, sans-serif" font-size="22">Host ← $host</text>
<text x="82" y="584" fill="#624e3c" font-family="Arial, sans-serif" font-size="22">X-Forwarded-For ← proxy policy</text>
<text x="82" y="620" fill="#624e3c" font-family="Arial, sans-serif" font-size="22">X-Forwarded-Proto ← известный hop</text>
<text x="82" y="656" fill="#624e3c" font-family="Arial, sans-serif" font-size="22">realip только с set_real_ip_from</text>
<rect x="82" y="682" width="488" height="44" rx="12" fill="#ffffff"/>
<text x="104" y="712" fill="#8a4c15" font-family="Arial, sans-serif" font-size="21" font-weight="700">Источник и формат названы явно</text>
<line x1="360" y1="770" x2="360" y2="834" stroke="#835121" stroke-width="5" marker-end="url(#arrow)"/>
<rect x="48" y="854" width="624" height="208" rx="22" fill="#ffffff" stroke="#7d8ecb" stroke-width="3"/>
<text x="82" y="906" fill="#263666" font-family="Arial, sans-serif" font-size="29" font-weight="700">Приложение</text>
<text x="82" y="946" fill="#48577f" font-family="Arial, sans-serif" font-size="22">Читает только согласованные поля</text>
<text x="82" y="982" fill="#48577f" font-family="Arial, sans-serif" font-size="22">Не угадывает схему по peer socket</text>
<text x="82" y="1018" fill="#48577f" font-family="Arial, sans-serif" font-size="22">Не доверяет прямому X-Forwarded-For</text>
<line x1="360" y1="1078" x2="360" y2="1132" stroke="#466bb1" stroke-width="5" marker-end="url(#arrow)"/>
<rect x="48" y="1152" width="624" height="80" rx="20" fill="#263666"/>
<text x="82" y="1203" fill="#ffffff" font-family="Arial, sans-serif" font-size="24" font-weight="700">Проверка: один маршрут + proxy/app log</text>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

@@ -0,0 +1,54 @@
<svg xmlns="http://www.w3.org/2000/svg" width="720" height="1260" viewBox="0 0 720 1260" role="img" aria-labelledby="title desc">
<title id="title">Один пользовательский запрос проходит через два HTTP-hop-а</title>
<desc id="desc">Вертикальная схема: клиент отправляет внешний запрос Nginx, proxy формирует заголовки и лимиты, затем создаёт отдельный запрос к приложению. Внизу access-log и лог приложения связывают диагностику.</desc>
<defs>
<linearGradient id="bg" x1="0" x2="0" y1="0" y2="1">
<stop offset="0" stop-color="#f5f8ff"/>
<stop offset="1" stop-color="#eef7f4"/>
</linearGradient>
<marker id="arrow" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto">
<path d="M0,0 L12,6 L0,12 Z" fill="#1f4f86"/>
</marker>
</defs>
<rect width="720" height="1260" rx="32" fill="url(#bg)"/>
<text x="48" y="66" fill="#15314f" font-family="Arial, sans-serif" font-size="34" font-weight="700">Один запрос — два HTTP-hop-а</text>
<text x="48" y="104" fill="#496178" font-family="Arial, sans-serif" font-size="22">Ищем сигнал там, где он меняется</text>
<rect x="48" y="146" width="624" height="156" rx="22" fill="#ffffff" stroke="#8aa9c8" stroke-width="3"/>
<circle cx="92" cy="198" r="22" fill="#2f77b6"/>
<text x="84" y="206" fill="#ffffff" font-family="Arial, sans-serif" font-size="21" font-weight="700">1</text>
<text x="132" y="196" fill="#15314f" font-family="Arial, sans-serif" font-size="29" font-weight="700">Клиент</text>
<text x="132" y="232" fill="#40566b" font-family="Arial, sans-serif" font-size="22">Метод • путь • Host • внешний статус</text>
<text x="132" y="266" fill="#40566b" font-family="Arial, sans-serif" font-size="22">Это входной HTTP-hop</text>
<line x1="360" y1="318" x2="360" y2="382" stroke="#1f4f86" stroke-width="5" marker-end="url(#arrow)"/>
<text x="394" y="358" fill="#1f4f86" font-family="Arial, sans-serif" font-size="22" font-weight="700">внешнее соединение</text>
<rect x="48" y="402" width="624" height="248" rx="22" fill="#e5f0fb" stroke="#2f77b6" stroke-width="3"/>
<circle cx="92" cy="454" r="22" fill="#2f77b6"/>
<text x="84" y="462" fill="#ffffff" font-family="Arial, sans-serif" font-size="21" font-weight="700">2</text>
<text x="132" y="452" fill="#15314f" font-family="Arial, sans-serif" font-size="29" font-weight="700">Nginx reverse proxy</text>
<text x="132" y="490" fill="#40566b" font-family="Arial, sans-serif" font-size="22">Выбирает location и upstream</text>
<text x="132" y="526" fill="#40566b" font-family="Arial, sans-serif" font-size="22">Явно формирует Host и X-Forwarded-*</text>
<text x="132" y="562" fill="#40566b" font-family="Arial, sans-serif" font-size="22">Отдельно ждёт connect, send и read</text>
<rect x="132" y="586" width="418" height="42" rx="12" fill="#ffffff"/>
<text x="153" y="615" fill="#1f4f86" font-family="Arial, sans-serif" font-size="21" font-weight="700">Граница: контракт + журнал</text>
<line x1="360" y1="668" x2="360" y2="732" stroke="#1f4f86" stroke-width="5" marker-end="url(#arrow)"/>
<text x="394" y="708" fill="#1f4f86" font-family="Arial, sans-serif" font-size="22" font-weight="700">новый upstream-hop</text>
<rect x="48" y="752" width="624" height="156" rx="22" fill="#ffffff" stroke="#6ba98a" stroke-width="3"/>
<circle cx="92" cy="804" r="22" fill="#3a8b60"/>
<text x="84" y="812" fill="#ffffff" font-family="Arial, sans-serif" font-size="21" font-weight="700">3</text>
<text x="132" y="802" fill="#15314f" font-family="Arial, sans-serif" font-size="29" font-weight="700">Приложение</text>
<text x="132" y="838" fill="#40566b" font-family="Arial, sans-serif" font-size="22">Видит peer proxy и согласованные headers</text>
<text x="132" y="872" fill="#40566b" font-family="Arial, sans-serif" font-size="22">Отвечает на отдельное соединение</text>
<line x1="360" y1="924" x2="360" y2="978" stroke="#3a8b60" stroke-width="5" marker-end="url(#arrow)"/>
<rect x="48" y="998" width="624" height="202" rx="22" fill="#183c5f"/>
<text x="82" y="1048" fill="#ffffff" font-family="Arial, sans-serif" font-size="29" font-weight="700">Совместная диагностика</text>
<text x="82" y="1088" fill="#dcecff" font-family="Arial, sans-serif" font-size="22">proxy: status • request_time • upstream</text>
<text x="82" y="1124" fill="#dcecff" font-family="Arial, sans-serif" font-size="22">приложение: тот же безопасный токен</text>
<text x="82" y="1164" fill="#9fd8bd" font-family="Arial, sans-serif" font-size="22" font-weight="700">Вывод: меняем подтверждённый hop</text>
</svg>

After

Width:  |  Height:  |  Size: 5.0 KiB