> Полный список статей есть в [llms.txt](https://docs.f3cloud.com/llms.txt). Markdown-версия есть у каждой страницы, достаточно добавить .md к её адресу. Эта страница в Markdown: [https://docs.f3cloud.com/ru/web/nginx-installation.md](https://docs.f3cloud.com/ru/web/nginx-installation.md).

# Установка Nginx с PHP-FPM и SSL на Ubuntu и Debian

Как установить Nginx на VPS с Ubuntu или Debian, создать сайт, подключить PHP-FPM и бесплатный SSL-сертификат Let's Encrypt. Проверка конфигурации, решение ошибок 502, 403 и 413 и удаление Nginx.

**Nginx** – это быстрый веб-сервер, на котором работает огромная часть сайтов в интернете. Он отдаёт страницы и файлы посетителям, передаёт PHP-скрипты на выполнение и шифрует соединение по HTTPS.

В этой инструкции мы установим Nginx, создадим сайт, подключим к нему PHP и выпустим бесплатный SSL-сертификат. Все команды проверены на Debian 12, на Ubuntu они работают так же.

> **Что понадобится.**
>
> Для начала нужен VPS с Ubuntu или Debian и доступ к нему по SSH, например через [Termius](https://docs.f3cloud.com/ru/vps/termius-connection.md). Для HTTPS понадобится ещё домен, у которого A-запись указывает на IP-адрес сервера.

***

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

```bash
# Обновляем список пакетов и устанавливаем Nginx
apt update && apt install -y nginx

# Проверяем, что Nginx запустился
systemctl status nginx
```

Если в строке **Active** написано зелёное `active (running)`, Nginx работает и уже будет сам запускаться после перезагрузки сервера.

<figure><img src="https://docs.f3cloud.com/img/nginx-status.png" alt="Вывод systemctl status nginx со статусом active (running)"><figcaption><p>Nginx установлен и запущен</p></figcaption></figure>

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

<figure><img src="https://docs.f3cloud.com/img/nginx-welcome.png" alt="Стартовая страница Welcome to nginx" width="460"><figcaption><p>Стартовая страница Nginx</p></figcaption></figure>

> **Страница не открывается?.**
>
> Если на сервере включён брандмауэр, откройте в нём порты **80** и **443**. Как это сделать, мы показали в статье [о брандмауэре](https://docs.f3cloud.com/ru/vps/security/firewall.md).

***

## 2. Создайте папку сайта

Файлы каждого сайта удобно хранить в отдельной папке внутри `/var/www`. Создадим папку и простую страницу для проверки. Вместо `example.com` здесь и дальше подставьте свой домен.

```bash
# Создаём папку для файлов сайта
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.com
```

***

## 3. Настройте сайт в Nginx

Настройки сайтов хранятся в папке `/etc/nginx/sites-available`. Создайте в ней файл для своего сайта.

```bash
nano /etc/nginx/sites-available/example.com
```

Вставьте в него настройки ниже и замените домен на свой. Сохранить файл в nano можно сочетанием <kbd>Ctrl</kbd> + <kbd>O</kbd> и <kbd>Enter</kbd>.\
Выйти из редактора можно сочетанием <kbd>Ctrl</kbd> + <kbd>X</kbd>.

```nginx
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-адресу открывался ваш.

```bash
# Включаем наш сайт
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`, ошибок нет.

<figure><img src="https://docs.f3cloud.com/img/nginx-test.png" alt="Успешная проверка конфигурации командой nginx -t"><figcaption><p>Проверка настроек прошла успешно</p></figcaption></figure>

Примените настройки. Команда `reload` перечитывает конфигурацию без остановки сайта.

```bash
systemctl reload nginx
```

Теперь по адресу сервера откроется ваша страница «Сайт работает!».

> **Всегда проверяйте настройки перед перезагрузкой.**
>
> Привыкайте запускать `nginx -t` после каждого изменения конфигурации. Если в файле ошибка, Nginx не сможет перезапуститься, и сайт перестанет открываться.

***

## 4. Подключите PHP

Для сайтов на PHP, например WordPress, установите **PHP-FPM**. Это служба, которая выполняет PHP-скрипты по запросу Nginx.

```bash
# Устанавливаем PHP-FPM
apt install -y php-fpm

# Смотрим версию PHP
php -v

# Смотрим, как называется файл для связи с PHP
ls /run/php/
```

<figure><img src="https://docs.f3cloud.com/img/nginx-php-fpm.png" alt="Версия PHP и файлы в папке /run/php"><figcaption><p>PHP 8.2 установлен, связь идёт через php8.2-fpm.sock</p></figcaption></figure>

На Debian 12 ставится PHP 8.2, а на свежих Ubuntu версия будет новее. Запомните имя файла с окончанием `.sock`, например `php8.2-fpm.sock`.

Откройте настройки сайта командой `nano /etc/nginx/sites-available/example.com` и добавьте перед последней закрывающей скобкой `}` два блока.

```nginx
    # Передаём 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;
    }
```

Проверьте настройки и примените их.

```bash
nginx -t && systemctl reload nginx
```

Чтобы убедиться, что PHP работает, создайте проверочный файл.

```bash
# Создаём страницу с информацией о PHP
echo '<?php phpinfo();' > /var/www/example.com/info.php
```

Откройте `http://IP-адрес-сервера/info.php`. Должна появиться страница с версией PHP, а в строке **Server API** будет написано `FPM/FastCGI`.

<figure><img src="https://docs.f3cloud.com/img/nginx-phpinfo.png" alt="Страница phpinfo с версией PHP 8.2"><figcaption><p>PHP работает через PHP-FPM</p></figcaption></figure>

> **Удалите проверочный файл.**
>
> Страница `info.php` показывает подробности о сервере, которые не стоит оставлять в открытом доступе. После проверки удалите её командой `rm /var/www/example.com/info.php`.

Большинству сайтов нужны дополнительные модули PHP. Например, для WordPress установите такие.

```bash
# Модули для баз данных MySQL, работы с картинками, архивами и запросами
apt install -y php-mysql php-curl php-gd php-mbstring php-xml php-zip

# Перезапускаем PHP-FPM, чтобы модули подключились
systemctl restart php8.2-fpm
```

***

## 5. Подключите SSL-сертификат

Бесплатный сертификат Let's Encrypt выпускается программой **Certbot**. Перед этим убедитесь, что A-запись домена уже указывает на IP-адрес сервера, а сайт открывается по домену через `http://`.

```bash
# Устанавливаем Certbot и его модуль для Nginx
apt install -y certbot python3-certbot-nginx

# Выпускаем сертификат для домена с www и без
certbot --nginx -d example.com -d www.example.com
```

Certbot попросит указать почту для уведомлений и принять условия Let's Encrypt. Затем он сам выпустит сертификат, добавит в настройки сайта HTTPS и включит переадресацию с `http://` на `https://`.

<figure><img src="https://docs.f3cloud.com/img/ssl-nginx-issue.png" alt="Успешный выпуск сертификата через certbot --nginx"><figcaption><p>Сертификат выпущен и подключён к Nginx</p></figcaption></figure>

Сертификаты Let's Encrypt действуют недолго, но продлевать их вручную не нужно. Certbot уже настроил автоматическое продление, проверить его можно командой ниже.

```bash
# Пробное продление, сертификат при этом не меняется
certbot renew --dry-run
```

Подробнее о выпуске сертификатов, в том числе для Apache, мы рассказали в [отдельной статье](https://docs.f3cloud.com/ru/web/ustanovka-besplatnogo-ssl-sertifikata-lets-encrypt-na-server-s-nginx-ili-apache.md).

***

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

Nginx и Apache не могут одновременно работать на порту 80. Проверьте, какая программа его занимает.

```bash
# Показываем, кто слушает порт 80
ss -tlnp | grep ':80 '
```

Если в ответе есть `apache2`, а Apache вам не нужен, остановите и удалите его, затем запустите Nginx.

```bash
# Останавливаем и удаляем Apache вместе с настройками
systemctl stop apache2
apt purge -y apache2

# Запускаем Nginx
systemctl start nginx
```

***

## Как удалить Nginx

```bash
# Останавливаем Nginx
systemctl stop nginx

# Удаляем Nginx вместе с его настройками
apt purge -y nginx nginx-common

# Удаляем пакеты, которые больше не нужны
apt autoremove -y
```

Файлы сайтов в папке `/var/www` при этом останутся на месте.

***

## Частые вопросы

<details>

<summary>nginx -t пишет test failed</summary>

В настройках ошибка, и Nginx подскажет, где именно. Например, сообщение `invalid number of arguments in "root" directive in /etc/nginx/sites-enabled/example.com:7` значит, что в 7-й строке файла что-то не так с директивой `root`. Чаще всего это забытая точка с запятой в конце строки или лишняя фигурная скобка.

</details>

<details>

<summary>Вместо сайта открывается стартовая страница Nginx</summary>

Скорее всего, стандартный сайт не отключён или домен в `server_name` написан не так, как вы открываете его в браузере. Проверьте, что в папке `/etc/nginx/sites-enabled` нет файла `default`, и выполните `nginx -t && systemctl reload nginx`.

</details>

<details>

<summary>Ошибка 502 Bad Gateway</summary>

Nginx не может передать запрос в PHP-FPM. Проверьте, что служба работает, командой `systemctl status php8.2-fpm`, и сравните имя файла в `fastcgi_pass` с тем, что показывает `ls /run/php/`. Подробности ошибки есть в логе сайта, например `/var/log/nginx/example.com-error.log`.

</details>

<details>

<summary>Ошибка 403 Forbidden</summary>

Nginx не нашёл главную страницу или не может прочитать файлы. Убедитесь, что в папке сайта есть `index.html` или `index.php`, и верните права командой `chown -R www-data:www-data /var/www/example.com`.

</details>

<details>

<summary>Ошибка 413 Request Entity Too Large при загрузке файла</summary>

Файл больше разрешённого размера.\
Увеличьте `client_max_body_size` в настройках сайта.\
Для PHP-сайтов также поднимите `upload_max_filesize` и `post_max_size` в файле `/etc/php/8.2/fpm/php.ini`, по умолчанию там всего 2 и 8 МБ. После этого перезапустите PHP-FPM и Nginx.

</details>

<details>

<summary>Браузер скачивает PHP-файл вместо того, чтобы открыть страницу</summary>

В настройках сайта нет блока `location ~ \.php$` или вы забыли применить изменения. Добавьте блок из шага 4 и выполните `nginx -t && systemctl reload nginx`. После этого очистите кэш браузера.

</details>

***

## Наши ресурсы

**Telegram-канал:** [https://t.me/f3cloud_news](https://t.me/f3cloud_news)\
**Сайт хостинга:** [https://f3cloud.com](https://f3cloud.com/ru)
