MHOSTMHOST

Nginx: установка и первый сайт

В этой статье вы поставите Nginx на VPS mHost, включите его автозапуск через systemd, разместите простой статический сайт со своим server block (vhost) и откроете нужные порты в файрволе.

Диаграмма: браузер обращается к Nginx, который передаёт запрос приложению — оба работают на одном VPS

Что понадобится

  • VPS mHost на Ubuntu 22.04/24.04, Debian 11/12 или AlmaLinux/Rocky Linux 8/9.
  • Доступ по SSH под root или пользователем с sudo.
  • Домен, направленный на IP-адрес сервера. Для проверки подойдёт и просто IP — server_name можно будет поменять позже.
Совет: все команды ниже даны от имени root. Если вы работаете под обычным пользователем, добавляйте sudo перед каждой командой.
Совет: если помимо Nginx вам сразу нужны MySQL и PHP, проще взять готовый рецепт LEMP в VMmanager 6 (см. статью «Готовые рецепты VMmanager 6») — он разворачивает весь стек одним запуском. Ниже — установка и настройка именно Nginx вручную.

Шаг 1. Установите Nginx

Ubuntu / Debian

bash
apt update
apt install nginx

AlmaLinux / Rocky Linux

bash
dnf install nginx

Пакет nginx уже есть в стандартном репозитории (AppStream) — подключать сторонние репозитории не требуется.

Проверьте, что пакет установился:

bash
nginx -v
Совет: apt/dnf ставят версию Nginx из репозитория вашего дистрибутива — для обычного сайта её достаточно. Если нужна самая свежая mainline- или stable-версия от разработчиков Nginx, у них есть собственный apt/yum-репозиторий, см. nginx.org/en/linux_packages.html.

Шаг 2. Включите автозапуск и запустите Nginx через systemd

bash
systemctl enable --now nginx
systemctl status nginx

Флаг enable --now одновременно добавляет Nginx в автозагрузку и запускает его сразу. В статусе должно быть active (running).

Проверьте, что сервер отвечает — прямо на VPS, ещё до открытия портов в файрволе:

bash
curl -I http://127.0.0.1/

Ответ HTTP/1.1 200 OK и заголовок Server: nginx означают, что Nginx работает и отдаёт страницу по умолчанию.

Шаг 3. Разместите статический сайт

Создайте отдельную папку под сайт и положите в неё index.html:

bash
mkdir -p /var/www/example.com/html
bash
cat > /var/www/example.com/html/index.html <<'EOF'
<!DOCTYPE html>
<html lang="ru">
<head>
  <meta charset="UTF-8">
  <title>example.com</title>
</head>
<body>
  <h1>Nginx работает!</h1>
  <p>Это статический сайт, размещённый на VPS mHost.</p>
</body>
</html>
EOF
Совет: воркеры Nginx работают не от root, а от отдельного пользователя — www-data на Ubuntu/Debian, nginx на AlmaLinux/Rocky. Файлы, созданные обычным способом (mkdir, cat, редактор), по умолчанию доступны на чтение всем, так что для /var/www дополнительный chown/chmod не нужен.

Шаг 4. Настройте server block (vhost)

Конфигурация одинаковая для обоих семейств дистрибутивов — отличается только путь до файла.

Ubuntu / Debian: sites-available и sites-enabled

bash
cat > /etc/nginx/sites-available/example.com <<'EOF'
server {
    listen 80;
    listen [::]:80;

    server_name example.com www.example.com;

    root /var/www/example.com/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}
EOF

Включите сайт символической ссылкой в sites-enabled:

bash
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
Совет: по умолчанию там же включён сайт-заглушка default (/etc/nginx/sites-enabled/default). Он не мешает работе вашего сайта — Nginx выбирает блок по server_name, — но если хотите отключить заглушку совсем, удалите символическую ссылку: rm /etc/nginx/sites-enabled/default.

AlmaLinux / Rocky: conf.d

bash
cat > /etc/nginx/conf.d/example.com.conf <<'EOF'
server {
    listen 80;
    listen [::]:80;

    server_name example.com www.example.com;

    root /var/www/example.com/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}
EOF

Расширение .conf обязательно — только такие файлы подключаются директивой include /etc/nginx/conf.d/*.conf; из /etc/nginx/nginx.conf. Отдельно включать сайт не нужно: всё, что лежит в conf.d, уже активно.

Совет: не указывайте у своего сайта default_server — этот флаг уже занят блоком по умолчанию из /etc/nginx/nginx.conf (там же root /usr/share/nginx/html), и Nginx откажется запускаться с ошибкой о дублирующемся default server. Ваш блок и так будет работать — Nginx выберет его по server_name.
Совет: если разместите файлы сайта не в /var/www и не в /usr/share/nginx/html, а в произвольном каталоге, из-за SELinux Nginx может вернуть 403 Forbidden. Пометьте каталог правильным контекстом (пакет policycoreutils-python-utils даёт команду semanage):
bash
dnf install policycoreutils-python-utils
semanage fcontext -a -t httpd_sys_content_t "/srv/example.com(/.*)?"
restorecon -Rv /srv/example.com

Шаг 5. Проверьте конфигурацию и перезапустите Nginx

bash
nginx -t

Ожидаемый вывод — syntax is ok и test is successful. Только после этого перечитайте конфигурацию:

bash
systemctl reload nginx

reload подхватывает изменения без разрыва уже установленных соединений — в отличие от restart, который перезапускает Nginx целиком.

Важно: если nginx -t сообщил об ошибке — не выполняйте reload/restart, пока не исправите её. Nginx укажет конкретный файл и номер строки с проблемой.

Проверьте, что именно ваш сайт теперь отвечает по имени:

bash
curl -I -H "Host: example.com" http://127.0.0.1/

Шаг 6. Откройте порты 80 и 443 в файрволе

Важно: порты 80 и 443 нужно открыть в файрволе, иначе сайт не будет доступен снаружи. Если ufw на сервере ещё не настроен, сначала пройдите статью «Настройка файрвола UFW» — она ставит ufw, разрешает SSH (это обязательно сделать первым, иначе потеряете доступ к серверу) и включает файрвол. Если ufw уже работает, просто добавьте правила для веб-сервера:

Ubuntu / Debian (ufw)

bash
apt install ufw
ufw allow 80/tcp
ufw allow 443/tcp

AlmaLinux / Rocky (firewalld)

На этих дистрибутивах по умолчанию используется не ufw, а firewalld — обычно он уже установлен и запущен (проверить: systemctl status firewalld):

bash
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
Готово: откройте в браузере http://example.com (или IP-адрес сервера) — должна открыться страница «Nginx работает!» из шага 3.

Что дальше

Сайт пока доступен только по HTTP. Чтобы включить HTTPS, настройте сертификат Let's Encrypt через Certbot — это отдельная тема. Если вместо статического сайта нужен PHP-бэкенд с базой данных, посмотрите рецепт LEMP в статье «Готовые рецепты VMmanager 6» — он поднимает Nginx, MySQL и PHP одним запуском.