Nginx – это быстрый веб-сервер, на котором работает огромная часть сайтов в интернете. Он отдаёт страницы и файлы посетителям, передаёт PHP-скрипты на выполнение и шифрует соединение по HTTPS.
В этой инструкции мы установим Nginx, создадим сайт, подключим к нему PHP и выпустим бесплатный SSL-сертификат. Все команды проверены на Debian 12, на Ubuntu они работают так же.
Что понадобится
Для начала нужен VPS с Ubuntu или Debian и доступ к нему по SSH, например через Termius. Для HTTPS понадобится ещё домен, у которого A-запись указывает на IP-адрес сервера.
1. Установите Nginx
# Обновляем список пакетов и устанавливаем Nginx
apt update && apt install -y nginx
# Проверяем, что Nginx запустился
systemctl status nginxЕсли в строке Active написано зелёное active (running), Nginx работает и уже будет сам запускаться после перезагрузки сервера.

Nginx установлен и запущен
Откройте в браузере http://IP-адрес-сервера. Должна появиться стартовая страница Nginx.

Стартовая страница Nginx
Страница не открывается?
Если на сервере включён брандмауэр, откройте в нём порты 80 и 443. Как это сделать, мы показали в статье о брандмауэре.
2. Создайте папку сайта
Файлы каждого сайта удобно хранить в отдельной папке внутри /var/www. Создадим папку и простую страницу для проверки. Вместо example.com здесь и дальше подставьте свой домен.
# Создаём папку для файлов сайта
mkdir -p /var/www/example.com
# Кладём в неё тестовую страницу
echo '<h1>Сайт работает!</h1>' > /var/www/example.com/index.html
# Отдаём папку пользователю www-data, от его имени работает Nginx
chown -R www-data:www-data /var/www/example.com3. Настройте сайт в Nginx
Настройки сайтов хранятся в папке /etc/nginx/sites-available. Создайте в ней файл для своего сайта.
nano /etc/nginx/sites-available/example.comВставьте в него настройки ниже и замените домен на свой. Сохранить файл в nano можно сочетанием Ctrl + O и Enter.
Выйти из редактора можно сочетанием Ctrl + X.
server {
# Принимаем обычные HTTP-запросы по IPv4 и IPv6
listen 80;
listen [::]:80;
# Домен сайта, с www и без
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 / {
# Отдаём файл или папку, а если их нет, ошибку 404
try_files $uri $uri/ =404;
}
}Файл в sites-available сам по себе не работает. Nginx читает только папку sites-enabled, поэтому включите сайт ссылкой на файл. Заодно отключите стандартный сайт Nginx, чтобы по IP-адресу открывался ваш.
# Включаем наш сайт
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
# Отключаем стандартный сайт со стартовой страницей
rm /etc/nginx/sites-enabled/default
# Проверяем настройки на ошибки
nginx -tЕсли nginx -t написал syntax is ok и test is successful, ошибок нет.

Проверка настроек прошла успешно
Примените настройки. Команда reload перечитывает конфигурацию без остановки сайта.
systemctl reload nginxТеперь по адресу сервера откроется ваша страница «Сайт работает!».
Всегда проверяйте настройки перед перезагрузкой
Привыкайте запускать nginx -t после каждого изменения конфигурации. Если в файле ошибка, Nginx не сможет перезапуститься, и сайт перестанет открываться.
4. Подключите PHP
Для сайтов на PHP, например WordPress, установите PHP-FPM. Это служба, которая выполняет PHP-скрипты по запросу Nginx.
# Устанавливаем PHP-FPM
apt install -y php-fpm
# Смотрим версию PHP
php -v
# Смотрим, как называется файл для связи с PHP
ls /run/php/
PHP 8.2 установлен, связь идёт через php8.2-fpm.sock
На Debian 12 ставится PHP 8.2, а на свежих Ubuntu версия будет новее. Запомните имя файла с окончанием .sock, например php8.2-fpm.sock.
Откройте настройки сайта командой nano /etc/nginx/sites-available/example.com и добавьте перед последней закрывающей скобкой } два блока.
# Передаём PHP-файлы на выполнение в PHP-FPM.
# Укажите имя .sock-файла, которое показала команда ls /run/php/
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
# Закрываем доступ к служебным файлам .htaccess
location ~ /\.ht {
deny all;
}Проверьте настройки и примените их.
nginx -t && systemctl reload nginxЧтобы убедиться, что PHP работает, создайте проверочный файл.
# Создаём страницу с информацией о PHP
echo '<?php phpinfo();' > /var/www/example.com/info.phpОткройте http://IP-адрес-сервера/info.php. Должна появиться страница с версией PHP, а в строке Server API будет написано FPM/FastCGI.

PHP работает через PHP-FPM
Удалите проверочный файл
Страница info.php показывает подробности о сервере, которые не стоит оставлять в открытом доступе. После проверки удалите её командой rm /var/www/example.com/info.php.
Большинству сайтов нужны дополнительные модули PHP. Например, для WordPress установите такие.
# Модули для баз данных MySQL, работы с картинками, архивами и запросами
apt install -y php-mysql php-curl php-gd php-mbstring php-xml php-zip
# Перезапускаем PHP-FPM, чтобы модули подключились
systemctl restart php8.2-fpm5. Подключите SSL-сертификат
Бесплатный сертификат Let's Encrypt выпускается программой Certbot. Перед этим убедитесь, что A-запись домена уже указывает на IP-адрес сервера, а сайт открывается по домену через http://.
# Устанавливаем Certbot и его модуль для Nginx
apt install -y certbot python3-certbot-nginx
# Выпускаем сертификат для домена с www и без
certbot --nginx -d example.com -d www.example.comCertbot попросит указать почту для уведомлений и принять условия Let's Encrypt. Затем он сам выпустит сертификат, добавит в настройки сайта HTTPS и включит переадресацию с http:// на https://.

Сертификат выпущен и подключён к Nginx
Сертификаты Let's Encrypt действуют недолго, но продлевать их вручную не нужно. Certbot уже настроил автоматическое продление, проверить его можно командой ниже.
# Пробное продление, сертификат при этом не меняется
certbot renew --dry-runПодробнее о выпуске сертификатов, в том числе для Apache, мы рассказали в отдельной статье.
Если на сервере есть Apache
Nginx и Apache не могут одновременно работать на порту 80. Проверьте, какая программа его занимает.
# Показываем, кто слушает порт 80
ss -tlnp | grep ':80 'Если в ответе есть apache2, а Apache вам не нужен, остановите и удалите его, затем запустите Nginx.
# Останавливаем и удаляем Apache вместе с настройками
systemctl stop apache2
apt purge -y apache2
# Запускаем Nginx
systemctl start nginxКак удалить Nginx
# Останавливаем Nginx
systemctl stop nginx
# Удаляем Nginx вместе с его настройками
apt purge -y nginx nginx-common
# Удаляем пакеты, которые больше не нужны
apt autoremove -yФайлы сайтов в папке /var/www при этом останутся на месте.
Частые вопросы
nginx -t пишет test failed
В настройках ошибка, и Nginx подскажет, где именно. Например, сообщение invalid number of arguments in "root" directive in /etc/nginx/sites-enabled/example.com:7 значит, что в 7-й строке файла что-то не так с директивой root. Чаще всего это забытая точка с запятой в конце строки или лишняя фигурная скобка.
Вместо сайта открывается стартовая страница Nginx
Скорее всего, стандартный сайт не отключён или домен в server_name написан не так, как вы открываете его в браузере. Проверьте, что в папке /etc/nginx/sites-enabled нет файла default, и выполните 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
Nginx не нашёл главную страницу или не может прочитать файлы. Убедитесь, что в папке сайта есть index.html или index.php, и верните права командой 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 и Nginx.
Браузер скачивает PHP-файл вместо того, чтобы открыть страницу
В настройках сайта нет блока location ~ \.php$ или вы забыли применить изменения. Добавьте блок из шага 4 и выполните nginx -t && systemctl reload nginx. После этого очистите кэш браузера.
Наши ресурсы
Telegram-канал: https://t.me/f3cloud_news
Сайт хостинга: https://f3cloud.com