Nginx с PHP-FPM и HTTPS на Ubuntu и Debian

Ставим Nginx, заводим сайт, подключаем PHP-FPM и Let's Encrypt, разбираем ошибки 502, 403 и 413. Проверено на Debian 12.

3 ноября 2026 г.·2 мин чтения·nginx, php, certbot

Nginx отдаёт статику, передаёт PHP на выполнение в PHP-FPM и терминирует HTTPS. Это стандартная связка для WordPress, Laravel и почти любого PHP-сайта. Все команды ниже выполняются под root (или с sudo).

Если сервера ещё нет, VPS на tanaka.host создаётся за минуту с Ubuntu или Debian, а списание идёт по дням — удобно, чтобы просто попробовать.

Что нужно: VPS с Ubuntu или Debian, SSH, а для HTTPS — домен, у которого A-запись указывает на IP сервера.

1. Установка Nginx

apt update && apt install -y nginx
systemctl status nginx

Строка Active: active (running) означает, что сервер работает и включён в автозапуск. Откройте http://IP_СЕРВЕРА в браузере — должна появиться стартовая страница. Если не открывается, откройте 80 и 443 в брандмауэре.

2. Папка сайта

Везде ниже замените example.com на свой домен.

mkdir -p /var/www/example.com
echo '<h1>Сайт работает</h1>' > /var/www/example.com/index.html
chown -R www-data:www-data /var/www/example.com

3. Конфиг сайта

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 index.php;

    access_log /var/log/nginx/example.com-access.log;
    error_log  /var/log/nginx/example.com-error.log;
    client_max_body_size 100M;

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

Nginx читает только sites-enabled, поэтому включаем сайт ссылкой и убираем дефолтный:

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

nginx -t: syntax is ok, test is successful

nginx -t обязательно после каждой правки: при ошибке в конфиге reload ничего не сделает, а restart положит сайт.

4. PHP-FPM

apt install -y php-fpm
php -v
ls /run/php/

Запомните имя сокета из /run/php/ — например, php8.2-fpm.sock на Debian 12 или php8.3-fpm.sock на Ubuntu 24.04. Добавьте в конфиг сайта перед закрывающей }:

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

    location ~ /\.ht {
        deny all;
    }
nginx -t && systemctl reload nginx
echo '<?php phpinfo();' > /var/www/example.com/info.php

Откройте http://example.com/info.php: в строке Server API должно быть FPM/FastCGI. После проверки удалите файл — он раскрывает конфигурацию сервера:

rm /var/www/example.com/info.php

Модули, которые просит WordPress и большинство CMS:

apt install -y php-mysql php-curl php-gd php-mbstring php-xml php-zip php-intl
systemctl restart php8.2-fpm

5. HTTPS через Let’s Encrypt

Перед этим A-запись домена должна указывать на сервер и сайт должен открываться по http://.

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

Certbot спросит почту и согласие с условиями, сам выпустит сертификат, допишет блок listen 443 ssl в конфиг и включит редирект с HTTP. Автопродление уже настроено, проверка:

certbot renew --dry-run

Подробно про Certbot, несколько доменов и ошибки проверки — в отдельной статье.

Если на сервере есть Apache

Два веб-сервера не могут слушать 80 одновременно. Проверьте, кто занял порт, и уберите лишний:

ss -tlnp | grep ':80 '
systemctl disable --now apache2
apt purge -y apache2
systemctl start nginx

Частые ошибки

nginx -t пишет test failed. В сообщении указан файл и строка, например invalid number of arguments in "root" directive in .../example.com:7. Почти всегда забытая точка с запятой или лишняя скобка.

Открывается стартовая страница Nginx вместо сайта. Не удалён default из sites-enabled, или server_name не совпадает с доменом. Поправьте и nginx -t && systemctl reload nginx.

502 Bad Gateway. Nginx не достучался до PHP-FPM. Проверьте systemctl status php8.2-fpm и что имя сокета в fastcgi_pass совпадает с ls /run/php/. Подробности в /var/log/nginx/example.com-error.log.

403 Forbidden. В папке нет index.html или index.php, либо права не дают Nginx их прочитать: chown -R www-data:www-data /var/www/example.com.

413 Request Entity Too Large. Поднимите client_max_body_size в конфиге сайта. Для PHP ещё upload_max_filesize и post_max_size в /etc/php/8.2/fpm/php.ini (по умолчанию 2 и 8 МБ), затем перезапустите PHP-FPM.

Браузер скачивает PHP-файл вместо выполнения. Нет блока location ~ \.php$ или он не применён. Добавьте, перезагрузите Nginx и очистите кеш браузера.

Удаление Nginx

systemctl stop nginx
apt purge -y nginx nginx-common
apt autoremove -y

Файлы сайтов в /var/www остаются.