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

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 обязательно после каждой правки: при ошибке в конфиге 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 остаются.