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

206 lines
9.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Причина сейчас не в нагрузке, а в битой и дублирующейся конфигурации 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 ... руками),
• второй не может забиндиться и падает.
Но это полбеды. Сейчас у тебя ещё серьёзнее: конфиг.
2. Главная проблема: конфиг 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 подключены в неправильном месте. Отсюда и “то работает, то нет”.
3. Почему “иногда работает, иногда нет”
Скорее всего:
• Есть один “старый” рабочий 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, а снаружи ты видишь “иногда сайты отваливаются”.
4. Что сейчас является непосредственной причиной “опять не работает”
Прямо из хвоста лога:
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).
5. Что делать, чтобы это прекратилось
Шаг 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).