Перейти к содержанию

Nginx proxy для n8n: runbook 502, HTTPS и webhooks

Обновлено: 2026-05-29

Открыть мой план

Intent: runbook Nginx proxy: 502, 504, неправильные webhook URL, headers, TLS termination для n8n behind reverse proxy
H1: Nginx proxy для n8n: как чинить 502, HTTPS и production webhooks
Schema: TechArticle, HowTo, FAQPage, BreadcrumbList
Old word count: 668
New word count: 680

Короткий ответ

Если n8n стоит за Nginx и ломаются webhooks, OAuth callbacks или UI, проверьте три вещи: upstream до контейнера n8n:5678, корректные X-Forwarded-* headers и переменную WEBHOOK_URL с публичным HTTPS-доменом. Ошибка 502 чаще говорит, что Nginx не достучался до n8n, 504 — что upstream не ответил вовремя, а неправильные webhook URL обычно связаны с тем, что n8n видит внутренний порт вместо внешнего домена.

Когда нужен этот runbook

Страница помогает, если n8n открывается через Nginx reverse proxy: Docker Compose, VPS, self-hosted сервер, отдельный TLS termination, домен вида automation.example.com. Особенно важно проверить proxy после миграции домена, перехода с HTTP на HTTPS, переноса контейнера в другую network или подключения Telegram/OAuth/payment webhooks.

Типичные симптомы:

  • браузер показывает 502 Bad Gateway;
  • UI открывается, но webhooks недоступны снаружи;
  • n8n показывает production URL с localhost, http или портом 5678;
  • OAuth provider ругается на redirect URI;
  • Telegram Trigger не регистрирует webhook;
  • большие payload или файлы обрываются;
  • long-running webhook получает 504.

1. Проверить upstream

Сначала убедитесь, что Nginx вообще видит n8n.

docker compose ps
docker compose logs --tail=100 nginx
docker compose logs --tail=100 n8n

Если Nginx в том же Docker Compose, upstream обычно должен ссылаться на имя сервиса:

upstream n8n_upstream {
    server n8n:5678;
}

Если Nginx установлен на хосте, а n8n в Docker, проверьте опубликованный порт и firewall. Не используйте localhost в конфиге Nginx внутри отдельного контейнера, если n8n живёт в другом контейнере: localhost будет указывать на сам контейнер Nginx.

2. Проверить headers и внешний URL

n8n должен понимать, какой публичный домен видят внешние сервисы. Для reverse proxy критичны публичный HTTPS URL и forwarded headers.

Пример базового location:

location / {
    proxy_pass http://n8n_upstream;
    proxy_http_version 1.1;
    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-Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
}

В .env для n8n за proxy проверьте:

N8N_HOST=automation.example.com
N8N_PROTOCOL=https
WEBHOOK_URL=https://automation.example.com/
N8N_PROXY_HOPS=1

Если перед Nginx есть ещё Cloudflare, load balancer или другой proxy, количество proxy hops и реальные headers нужно проверять отдельно.

3. Разделить ошибки 502, 504 и неправильный URL

Симптом Вероятная причина Проверка
502 Bad Gateway n8n не слушает upstream, сеть, порт curl до upstream из Nginx
504 Gateway Timeout workflow отвечает слишком долго response mode, timeout, async обработка
Production URL неправильный нет WEBHOOK_URL или headers UI Webhook node, env
OAuth callback mismatch публичный URL не совпадает redirect URL в provider
Telegram webhook не ставится HTTPS/сертификат/URL cert, WEBHOOK_URL, logs

Для webhook, который делает тяжёлую работу, лучше быстро вернуть 200/202, а обработку продолжить асинхронно. Тогда proxy и внешний провайдер не будут ждать минутами.

4. Проверить TLS и редиректы

Публичные webhooks почти всегда должны жить на HTTPS. Проверьте:

  • сертификат валиден;
  • HTTP редиректит на HTTPS;
  • нет бесконечного redirect loop;
  • Nginx передаёт X-Forwarded-Proto https;
  • n8n не генерирует ссылки с http://;
  • staging и production имеют разные домены или чёткое разделение.

Команды:

curl -I http://automation.example.com
curl -I https://automation.example.com
curl -I https://automation.example.com/webhook/test-path

5. Размер body и long-running requests

Если workflow принимает файлы, CSV, изображения, PDF или большие JSON, Nginx может резать запрос до n8n.

Проверьте:

client_max_body_size 25m;
proxy_read_timeout 300s;
proxy_send_timeout 300s;

Не ставьте огромные timeout как постоянное решение. Если webhook должен отвечать внешнему провайдеру, долгий request часто хуже фоновой обработки: провайдер может повторить событие, а workflow создаст дубли.

6. Smoke test после правки

После изменения Nginx и .env сделайте короткий тест:

  1. Перезапустите n8n, чтобы env применились.
  2. Откройте Webhook node и проверьте production URL.
  3. Отправьте внешний curl на тестовый endpoint.
  4. Проверьте logs Nginx и n8n.
  5. Проверьте OAuth callback или Telegram Trigger, если они были затронуты.
  6. Убедитесь, что старые URL не остались у внешнего провайдера.

FAQ

Почему n8n показывает URL с портом 5678?
Обычно n8n формирует URL из внутренних настроек. За reverse proxy нужно явно задать публичный WEBHOOK_URL.

Что означает 502 от Nginx?
Nginx не получил нормальный ответ от upstream: n8n не запущен, не тот порт, другая Docker network, firewall или неправильный upstream host.

Можно ли держать UI и webhooks на разных доменах?
Можно, но конфигурация должна быть осознанной. Для большинства небольших инсталляций проще один публичный HTTPS-домен.

Нужно ли менять настройки у провайдеров после смены домена?
Да. OAuth redirect URI, payment webhooks, Telegram webhooks и CRM callbacks часто хранят конкретный URL.

Как применять playbook в команде

Playbook «Nginx proxy для n8n» должен быть понятен человеку, который не писал workflow. Поэтому в нём нужны входной сигнал, частота запуска, критерий тревоги, ответственный и ожидаемое действие после срабатывания.

Используйте этот материал как операционную инструкцию: что проверить, где посмотреть логи, как понять масштаб проблемы и когда эскалировать.

СлойЧто зафиксироватьЗачем
Входpayload webhook/API с подписью, timestamp, event_id и исходным HTTP-статусомпозволяет повторить проблему без доступа к production-секретам
Контрольsuccessful_executions, skipped_items, retry_count, error_branch_usage, manual_override_countпоказывает деградацию раньше, чем пользователи начинают писать в поддержку
Безопасностьпринять happy path за production-готовность и не проверить повторы, пустые входы, откат и наблюдаемостьснижает риск скрытых дублей, утечки данных и неконтролируемых write-действий
Готовностьесть тест на happy path, пустой вход, повтор и сбой внешнего сервиса для «Nginx proxy для n8n»делает статью пригодной для runbook, а не только для чтения

Пример безопасного входного контракта

{
  "event_id": "evt_...",
  "event_type": "object.updated",
  "received_at": "2026-05-29T10:00:00Z",
  "signature_valid": true,
  "dedupe_key": "provider:event_id",
  "payload_version": "v1"
}

Критерий готовности

  • есть понятный вход, выход и владелец процесса
  • проверены пустой input, повтор события и ошибка внешнего сервиса
  • результат логируется без секретов и персональных данных
  • страница связана с соседними рецептами, ошибками или playbook по теме