06-nginx — Nginx + защищённый дефолтный сайт

☐ Опциональный. Ставит веб-сервер nginx и разворачивает усиленный дефолтный сайт (скрытая версия, security-заголовки, health-endpoint, запрет скрытых файлов) с фирменной заглушкой.

Зачем нужен

nginx — веб-сервер и reverse proxy (обратный прокси: принимает запросы из интернета и переадресует их вашему приложению, работающему на локальном порту). Это «входная дверь» сервера для HTTP/HTTPS-трафика. Модуль:

Дальше поверх nginx работают 08-certbot (HTTPS) и mitdev app (виртуальные хосты приложений).

Когда включать и когда не нужен

Включайте почти всегда, если сервер отдаёт что-либо по HTTP: сайты, API, статику, проксирование к приложениям.

Не нужен, если весь входящий трафик обрабатывает другой контроллер (например, traefik внутри Kubernetes) — в этом случае см. раздел про конфликт портов ниже.

Зависимости и требования

Что именно делает (по шагам module_install)

  1. Ставит пакет nginx.
  2. Создаёт раскладку сайтов. На не-Debian семействах, где нет sites-available/sites-enabled, создаёт эти каталоги и добавляет их include в nginx.conf (nginx_ensure_sites_layout), чтобы mitdev работал одинаково везде.
  3. Ставит дефолтный сайт: делает бэкап существующего /etc/nginx/sites-available/default, копирует туда templates/nginx/default.conf, включает его симлинком в sites-enabled/default.
  4. Ставит заглушку /var/www/html/index.html (0755 на каталог) — но только если файла нет или там стандартная «Welcome to nginx». Реальный index.html приложения не перезатирается.
  5. Проверяет конфигурацию: nginx -t — всегда перед запуском/перезагрузкой, чтобы синтаксическая ошибка не уронила службу.
  6. Включает и запускает nginx.
  7. Выполняет 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 слушает нестандартные порты

Как переопределить настройки

Проверка, что всё работает

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.

Безопасность и продакшен

Откат и удаление

Автоматический откат (module_rollback): останавливает и отключает nginx, удаляет пакет (бэкап дистрибутивного конфига остаётся на месте).

Ручное удаление:

# Удалить nginx, СОХРАНИВ /etc/nginx (виртуальные хосты приложений)
mitdev remove nginx

# Полное удаление ВМЕСТЕ со всей конфигурацией (/etc/nginx удаляется)
mitdev remove nginx --purge

При удалении снимаются дефолтный сайт mitdev и фирменная заглушка (реальный index.html приложения не трогается). Без --purge каталог /etc/nginx с вашими vhost'ами сохраняется; с --purge он удаляется целиком.

См. также