mnemo_cards/nginx_issues.md
Dmitry a92cade04f
Some checks failed
Backend CI / test (push) Waiting to run
Backend CI / build (push) Blocked by required conditions
Deploy Mnemo Cards / Deploy Backend (push) Waiting to run
Deploy Mnemo Cards / Deploy Web App (push) Blocked by required conditions
Deploy Mnemo Cards / Final Verification (push) Blocked by required conditions
Deploy Telegram Bot / Deploy Telegram Bot (push) Has been cancelled
Return debug info in API response for admin auth errors
This will show the exact reason for token verification failure
2025-12-12 01:05:05 +03:00

9.8 KiB
Raw Permalink Blame History

Причина сейчас не в нагрузке, а в битой и дублирующейся конфигурации nginx. Лог прямым текстом говорит, почему он периодически падает / не стартует.

Разберём по кускам.

  1. Старые ошибки с портами

Вот это:

bind() to 0.0.0.0:80 failed (98: Unknown error) bind() to 0.0.0.0:443 failed (98: Unknown error) still could not bind()

Это означает: кто-то уже слушает 80/443, а новый процесс nginx пытается занять те же порты и падает с EADDRINUSE.

Типичный сценарий: • уже запущен nginx (через systemd), • ты запускаешь ещё один (например nginx -c ... руками), • второй не может забиндиться и падает.

Но это полбеды. Сейчас у тебя ещё серьёзнее: конфиг.

  1. Главная проблема: конфиг nginx сломан/подключён неправильно

Вот основное:

"server" directive is not allowed here in /root/mnemo_cards/tools/deploy/generated_configs/code.mnemo-cards.online.conf:5 ... "location" directive is not allowed here in /etc/nginx/sites-enabled/code.mnemo-cards.online.conf:55 "gzip" directive is duplicate in /etc/nginx/sites-enabled/code.mnemo-cards.online.conf:53 "limit_req_zone" directive is not allowed here in /etc/nginx/sites-enabled/vscode.mnemo-cards.online.conf:24

Эти сообщения означают: 1. server в “не том месте” Файлы из /root/mnemo_cards/tools/deploy/generated_configs/.conf подключены так, будто это не server-блоки, а часть верхнего уровня. • Директива server { ... } допустима только внутри блока http { ... }. • Если ты где-то делаешь include /root/.../generated_configs/.conf; ВНЕ http {}, nginx и ругается: "server" directive is not allowed here 2. location в “не том месте” Сообщения:

"location" directive is not allowed here in /etc/nginx/sites-enabled/code.mnemo-cards.online.conf:55 "location" directive is not allowed here in /etc/nginx/sites-enabled/mnemo-cards.online.conf:53

Значит в этих файлах: • либо location стоит вне server {}, • либо у тебя “поехали” скобки } (какой-то server блок раньше закрылся слишком рано).

3.	дублирующийся gzip и limit_req_zone не там

"gzip" directive is duplicate in /etc/nginx/sites-enabled/code.mnemo-cards.online.conf:53 "limit_req_zone" directive is not allowed here in /etc/nginx/sites-enabled/vscode.mnemo-cards.online.conf:24

•	gzip обычно задаётся один раз на уровне http {}.

Ты, скорее всего, прописал его и в nginx.conf, и ещё раз внутри vhost. • limit_req_zone нельзя писать внутри server или location, только на уровне http.

4.	конфликты доменов

conflicting server name "vscode.mnemo-cards.online" on 0.0.0.0:80, ignored ... ignored

Это “мягкая” проблема: у тебя несколько server-блоков с одинаковым server_name и listen 80/443. nginx один использует, остальные игнорирует. Не фатально, но говорит, что конфиг дублируется (скорее всего: и в /etc/nginx/sites-enabled, и в /root/.../generated_configs).

Итог: nginx периодически не может прочитать конфиг и/или ты пытаешься стартовать его с альтернативным конфигом, где все эти server и location подключены в неправильном месте. Отсюда и “то работает, то нет”.

  1. Почему “иногда работает, иногда нет”

Скорее всего: • Есть один “старый” рабочий nginx, запущенный с нормальным /etc/nginx/nginx.conf. • Ты запускаешь свою тулзу /root/mnemo_cards/tools/deploy/..., которая: • генерирует конфиги в /root/mnemo_cards/tools/deploy/generated_configs/*.conf, • пробует сделать nginx -s reload с другим config-path или включает эти файлы как главные. • nginx читает новый конфиг → натыкается на server/ location not allowed here → reload не удаётся, в лучшем случае остаётся старый воркер, в худшем — nginx падает и systemd его мучительно перезапускает. • В логе при этом сыпятся emerg и bind() failed, а снаружи ты видишь “иногда сайты отваливаются”.

  1. Что сейчас является непосредственной причиной “опять не работает”

Прямо из хвоста лога:

2025/11/23 03:24:43 [emerg] ... "server" directive is not allowed here in /root/mnemo_cards/tools/deploy/generated_configs/... 2025/11/23 03:24:43 [warn] ... conflicting server name "vscode.mnemo-cards.online" ...

Т.е. на текущий момент nginx не может нормально перечитать конфиг из-за: • включения /root/mnemo_cards/tools/deploy/generated_configs/.conf не в том месте; • раздвоения конфигов (одни в /etc/nginx/sites-enabled/.conf, другие в /root/.../generated_configs).

  1. Что делать, чтобы это прекратилось

Шаг 1. Перестать запускать nginx “как попало” 1. Остановить nginx:

systemctl stop nginx ps aux | grep nginx

убедиться, что живых процессов nginx не осталось

2.	Дальше всегда управлять только так:

nginx -t # проверить конфиг systemctl start nginx systemctl reload nginx

Никаких nginx -c /root/... и прочего.

Шаг 2. Навести порядок в структуре конфига

Базовый скелет /etc/nginx/nginx.conf должен быть примерно таким:

user www-data; worker_processes auto; pid /run/nginx.pid;

events { worker_connections 4096; }

http { include /etc/nginx/mime.types; default_type application/octet-stream;

sendfile on;

# глобальные gzip / limit_req_zone / и т.д.
# gzip on;
# limit_req_zone ...;

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*.conf;

}

Критично: • server {} — только внутри блока http {}; • location — только внутри server {}; • limit_req_zone и подобные — только на уровне http {}, не внутри server.

Шаг 3. Разобраться с generated_configs

Сейчас файлы вида: • /root/mnemo_cards/tools/deploy/generated_configs/code.mnemo-cards.online.conf • /root/mnemo_cards/tools/deploy/generated_configs/mnemo-cards.online.conf • /root/mnemo_cards/tools/deploy/generated_configs/vscode.mnemo-cards.online.conf

подключаются так, что nginx видит там server не в http контексте.

Тебе нужно одно из: • либо перестать включать эти файлы напрямую (пусть тулза генерирует сразу в /etc/nginx/sites-available/sites-enabled), • либо включать их изнутри http {}:

http { ... include /root/mnemo_cards/tools/deploy/generated_configs/*.conf; }

Но не одновременно с их копиями в /etc/nginx/sites-enabled/, иначе будешь получать конфликтующие server_name vscode.mnemo-cards.online.

Сделай так: 1. Реши, где “истина” для vhostов: • либо /etc/nginx/sites-enabled/.conf, • либо /root/.../generated_configs/.conf. 2. Второй вариант выключи: • удаляешь/комментируешь include на ненужный путь; • или временно переименовываешь файлы (например, .conf.disabled).

Шаг 4. Починить структуру самих vhost-файлов

Внутри каждого *.conf из sites-enabled должно быть:

server { listen 80; server_name vscode.mnemo-cards.online;

# тут уже location'ы
location / {
    ...
}

}

Никаких location вне server, никаких limit_req_zone/gzip внутри отдельных vhostов (если они уже есть глобально).

TL;DR

Причина, почему “опять не работает”, по логу такая:

nginx сейчас либо не может корректно перезапуститься, либо работает с битой конфигурацией, потому что ты одновременно используешь автогенерённые конфиги из /root/mnemo_cards/tools/deploy/generated_configs/.conf и ручные в /etc/nginx/sites-enabled/.conf, причём часть из них подключена в неправильный контекст (server и location “не там”). Плюс периодически пытаешься поднять второй nginx поверх первого, откуда bind() failed (98).