1. Блог
  2. Мануали

Налаштування Nginx Virtual Host: приклади конфігурації

Налаштування Nginx Virtual Host: приклади конфігурації

Віртуальний хост у Nginx — це блок server, який описує, як обробляти запити до конкретного домену. На одному VPS може працювати скільки завгодно сайтів, кожен зі своїм блоком. Нижче — три готові шаблони та порядок їх підключення в Ubuntu й Debian.

Де лежать конфігурації

  • /etc/nginx/sites-available/ — файли всіх сайтів;
  • /etc/nginx/sites-enabled/ — символічні посилання на ввімкнені сайти;
  • /etc/nginx/nginx.conf — загальні налаштування сервера.

У прикладах замініть example.com на свій домен. Його A-запис має вказувати на IP-адресу сервера.

Статичний сайт

Створіть каталог сайту та файл конфігурації:

sudo mkdir -p /var/www/example.com
sudo nano /etc/nginx/sites-available/example.com
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

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

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

    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;
}

Сайт на PHP

Для WordPress та інших PHP-застосунків запити до .php передаються в PHP-FPM:

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

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

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

Ім’я сокета залежить від версії PHP: в Ubuntu 24.04 це php8.3-fpm.sock, у Debian 12 — php8.2-fpm.sock. Точне ім’я покаже команда ls /run/php/. Повне розгортання стека описано в статті про встановлення LEMP.

Зворотний проксі

Так публікують застосунки, які слухають локальний порт: Node.js, Python, контейнери Docker.

server {
    listen 80;
    listen [::]:80;
    server_name app.example.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Останні два рядки потрібні застосункам, що використовують WebSocket.

Увімкнення сайту

Створіть посилання, перевірте синтаксис і перечитайте конфігурацію:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Команда nginx -t обов’язкова: у разі помилки в конфігурації reload не застосує зміни, а restart зупинить усі сайти на сервері.

Безкоштовний SSL-сертифікат

Certbot отримає сертифікат Let’s Encrypt і сам допише в конфігурацію блок для HTTPS і перенаправлення з HTTP:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com

Сертифікат продовжується автоматично. Перевірити продовження можна командою sudo certbot renew --dry-run.

Перенаправлення з www

Щоб сайт відкривався за однією адресою, додайте окремий блок:

server {
    listen 80;
    listen [::]:80;
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

і приберіть www.example.com із server_name основного блоку.

Часті помилки

  • Відкривається сторінка «Welcome to nginx». Запит потрапив у типовий сайт: перевірте server_name і наявність посилання в sites-enabled.
  • 502 Bad Gateway. Застосунок або PHP-FPM не запущено, або вказано неправильний порт чи сокет.
  • 403 Forbidden. Користувач www-data не має прав на каталог сайту або відсутній індексний файл.
  • Зміни не застосовуються. Виконайте sudo nginx -t — найімовірніше, у конфігурації помилка.

Якщо не хочеться редагувати файли вручну, Nginx Proxy Manager робить те саме через вебінтерфейс.

Ця стаття іншими мовами:EnglishРусский