06-nginx — Nginx + защищённый дефолтный сайт
☐ Опциональный. Ставит веб-сервер nginx и разворачивает усиленный дефолтный сайт (скрытая версия, security-заголовки, health-endpoint, запрет скрытых файлов) с фирменной заглушкой.
Зачем нужен
nginx — веб-сервер и reverse proxy (обратный прокси: принимает запросы из интернета и переадресует их вашему приложению, работающему на локальном порту). Это «входная дверь» сервера для HTTP/HTTPS-трафика. Модуль:
- ставит пакет
nginx; - заменяет дистрибутивный конфиг на защищённый дефолтный сайт из шаблона
templates/nginx/default.conf; - ставит фирменную заглушку вместо стандартной страницы «Welcome to nginx»;
- создаёт единую раскладку
sites-available/sites-enabledна всех семействах ОС.
Дальше поверх nginx работают 08-certbot (HTTPS) и mitdev app (виртуальные хосты приложений).
Когда включать и когда не нужен
Включайте почти всегда, если сервер отдаёт что-либо по HTTP: сайты, API, статику, проксирование к приложениям.
Не нужен, если весь входящий трафик обрабатывает другой контроллер (например, traefik внутри Kubernetes) — в этом случае см. раздел про конфликт портов ниже.
Зависимости и требования
- Отдельных модулей-зависимостей нет.
08-certbotтребует06-nginx— сертификаты Let's Encrypt выпускаются через nginx-плагин.- Конфликт за порты 80/443 с Kubernetes. Модуль
17-kubernetes(k3s) по умолчанию поднимает свой ingress-контроллер traefik, который тоже слушает 80/443. Поэтому при установке k3s на хост, где уже есть nginx, mitdev ставит k3s с флагом--disable traefik— иначе обе службы конфликтуют за порты. То же касается ручной установки traefik. Порт может занять только одна служба. - Ожидает переменную окружения
MITDEV_DIR(путь установки mitdev — подставляется автоматически).
Что именно делает (по шагам module_install)
- Ставит пакет
nginx. - Создаёт раскладку сайтов. На не-Debian семействах, где нет
sites-available/sites-enabled, создаёт эти каталоги и добавляет ихincludeвnginx.conf(nginx_ensure_sites_layout), чтобы mitdev работал одинаково везде. - Ставит дефолтный сайт: делает бэкап существующего
/etc/nginx/sites-available/default, копирует тудаtemplates/nginx/default.conf, включает его симлинком вsites-enabled/default. - Ставит заглушку
/var/www/html/index.html(0755 на каталог) — но только если файла нет или там стандартная «Welcome to nginx». Реальныйindex.htmlприложения не перезатирается. - Проверяет конфигурацию:
nginx -t— всегда перед запуском/перезагрузкой, чтобы синтаксическая ошибка не уронила службу. - Включает и запускает nginx.
- Выполняет
module_verify.
Разбор дефолтного сайта (templates/nginx/default.conf)
server {
listen 80 default_server; # ловит любой HTTP-запрос на порт 80…
listen [::]:80 default_server; # …в том числе по IPv6
server_name _; # «_» — catch-all: любой домен/без домена
root /var/www/html; # откуда отдаются файлы
index index.html index.htm;
server_tokens off; # скрыть версию nginx в заголовках и на страницах ошибок
# (server_tokens off = меньше подсказок атакующему)
# Базовые security-заголовки (защита браузера пользователя):
add_header X-Content-Type-Options "nosniff" always; # запрет «угадывания» типа файла
add_header X-Frame-Options "SAMEORIGIN" always; # защита от кликджекинга (встраивания в чужой iframe)
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
location / {
try_files $uri $uri/ =404; # отдать файл, каталог или вернуть 404
}
location = /mitdev-health { # локальный health-endpoint,
access_log off; # который опрашивает `mitdev doctor`
default_type text/plain;
return 200 "ok\n"; # всегда отвечает «ok» кодом 200
}
location ~ /\.(?!well-known) { # запрет доступа к скрытым файлам (начинающимся с точки),
deny all; # кроме /.well-known (нужен для ACME/Let's Encrypt)
}
}
Смысл: сервер безопасен «из коробки» — не выдаёт версию, ставит защитные заголовки, прячет .git, .env и прочие скрытые файлы, и отдаёт /mitdev-health для самодиагностики.
Файлы, службы и порты
| Путь / юнит / порт | Назначение | Права |
|---|---|---|
служба nginx |
веб-сервер | root |
порт 80/tcp |
HTTP (открывается модулем 09-firewall) |
— |
порт 443/tcp |
HTTPS (появляется после mitdev ssl) |
— |
/etc/nginx/sites-available/default |
дефолтный сайт из шаблона mitdev | 0644 |
/etc/nginx/sites-enabled/default |
симлинк, включающий дефолтный сайт | symlink |
/etc/nginx/sites-available/, sites-enabled/ |
раскладка виртуальных хостов | root |
/var/www/html/index.html |
фирменная заглушка «Server ready» | 0644 |
/var/log/nginx/access.log |
лог обращений | root:adm |
/var/log/nginx/error.log |
лог ошибок | root:adm |
/mitdev-health (URL) |
health-endpoint для mitdev doctor |
— |
Настройка
Модуль 06 не имеет собственных переменных в config/defaults.conf — поведение задаётся шаблоном templates/nginx/default.conf. Смежные значения:
| Переменная | Значения | По умолчанию | Влияние | Когда менять |
|---|---|---|---|---|
UFW_EXTRA_PORTS |
список порт/proto |
80/tcp 443/tcp |
какие веб-порты откроет файрвол | если nginx слушает нестандартные порты |
Как переопределить настройки
- Изменить дефолтный сайт до установки: отредактируйте
templates/nginx/default.conf, затем запустите установку. - Изменить после установки: правьте
/etc/nginx/sites-available/default, затемmitdev nginx test && mitdev nginx reload. - Свои сайты добавляйте не в default, а отдельными виртуальными хостами (см. «Типовые задачи»).
Проверка, что всё работает
module_verify: команда nginx есть, служба активна, nginx -t без ошибок.
Вручную:
nginx -v # nginx version: nginx/1.x.x
mitdev nginx status # версия, статус, валидность конфига, список сайтов
mitdev nginx test # = nginx -t: syntax is ok / test is successful
curl -I http://127.0.0.1/ # HTTP/1.1 200 OK, без заголовка Server: версии
curl http://127.0.0.1/mitdev-health # ok
mitdev doctor --deep # строка «nginx HTTP … отвечает (код 200)»
Типовые задачи
# Статус: версия, служба, валидность конфига, включённые сайты
mitdev nginx status
# Проверить конфигурацию перед изменениями
mitdev nginx test
# Применить изменения без обрыва соединений (мягкая перезагрузка)
mitdev nginx reload
# Полный перезапуск службы
mitdev nginx restart
# Живой просмотр логов доступа и ошибок
mitdev logs nginx # tail -f access.log + error.log
# Добавить свой сайт с доменом и проксированием к приложению
mitdev app # мастер спросит домен и порт, создаст vhost
# Выпустить HTTPS-сертификат для домена (нужен модуль certbot)
mitdev ssl example.com [email protected]
Правило: любое изменение конфигурации применяйте через nginx -t (или mitdev nginx reload, который сам делает nginx -t) — так синтаксическая ошибка не остановит работающий сервер.
Частые ошибки
Симптом: mitdev nginx reload пишет «перезагрузка не удалась».
Причина: ошибка в конфиге.
Решение: sudo nginx -t — покажет файл и строку с ошибкой; исправьте и повторите.
Симптом: nginx не запускается, mitdev doctor сообщает «порт 80/443 занят «traefik»».
Причина: порты 80/443 уже слушает другой сервис (обычно traefik из k3s).
Решение:
sudo ss -tlnp | grep -E ':80 |:443 ' # кто держит порт
journalctl -u nginx -n 30 # детали
# при k3s — переустановить его с --disable traefik (mitdev делает это автоматически,
# если nginx уже стоял)
Симптом: сайт отдаёт «Welcome to nginx», а не заглушку mitdev.
Причина: дефолтный сайт mitdev не включён или перекрыт другим vhost.
Решение: проверьте ls /etc/nginx/sites-enabled/ и содержимое default.
Симптом: после правки конфига страница не изменилась.
Причина: забыли перезагрузить nginx.
Решение: mitdev nginx reload.
Безопасность и продакшен
- Дефолтный сайт уже усилен:
server_tokens off, security-заголовки, запрет скрытых файлов. Не ослабляйте эти настройки без причины. - Для реальных доменов всегда включайте HTTPS через
mitdev ssl <домен>(модуль08-certbot) —cmd_sslзаодно настраивает редирект HTTP→HTTPS. - Открывайте наружу только 80/443 (
09-firewall), приложения держите на локальных портах и проксируйте через nginx. - Каталог
/.well-knownнамеренно оставлен доступным — он нужен для проверки домена Let's Encrypt (ACME/HTTP-01 challenge).
Откат и удаление
Автоматический откат (module_rollback): останавливает и отключает nginx, удаляет пакет (бэкап дистрибутивного конфига остаётся на месте).
Ручное удаление:
# Удалить nginx, СОХРАНИВ /etc/nginx (виртуальные хосты приложений)
mitdev remove nginx
# Полное удаление ВМЕСТЕ со всей конфигурацией (/etc/nginx удаляется)
mitdev remove nginx --purge
При удалении снимаются дефолтный сайт mitdev и фирменная заглушка (реальный index.html приложения не трогается). Без --purge каталог /etc/nginx с вашими vhost'ами сохраняется; с --purge он удаляется целиком.
См. также
- ../COMMANDS.md — команды
mitdev nginx,mitdev app,mitdev logs nginx - ../SITE.md — публикация сайтов и доменов
- 08-certbot.md — HTTPS-сертификаты поверх nginx
- 09-firewall.md — открытие портов 80/443
- ../SECURITY.md — заголовки безопасности и общая модель