# Свой веб-сервер с нуля

Пошаговая инструкция для новичка. Поднимаем сайт на чистом сервере: устанавливаем
**nginx** и **PHP**, включаем **curl** и проверяем, что по IP-адресу открывается
страница. Никаких сложных терминов — просто повторяйте команды по порядку.

- 🕒 Времени: **≈ 15 минут**
- 🐧 Подходит для **Ubuntu 22.04 и 24.04**
- 🌱 Опыт не нужен

---

## Что получится в итоге

- Рабочий сайт: набираете `http://IP-адрес` в браузере — открывается ваша страница.
- PHP-файлы **выполняются** (а не скачиваются).
- **curl** работает — сервер может ходить на другие сайты и API.
- Всё **само запускается** после перезагрузки сервера.

## Что понадобится заранее

- **Сервер** с установленной Ubuntu (у хостинга это «VPS» или «облачный сервер»).
- **IP-адрес** сервера — например `157.22.189.6`.
- **Пароль** пользователя `root` (главный администратор).
- **Терминал** на вашем компьютере (есть в любой системе — см. шаг 1).

---

## 💡 Как читать команды

Блоки кода ниже — это команды. Перед каждым указано, **где** его выполнять:
*на вашем компьютере* или *на сервере*. Скопируйте, вставьте в терминал и нажмите **Enter**.

Знак `#` в начале строки писать **не нужно** — это просто приглашение сервера.

---

## Шаг 1. Подключиться к серверу

Заходим на сервер по SSH — это «удалённый терминал».

Откройте программу-терминал на своём компьютере:

- **Windows** — нажмите «Пуск», наберите `PowerShell`, откройте его.
- **macOS** — откройте программу `Терминал` (Terminal).
- **Linux** — откройте `Терминал`.

Введите команду, заменив `IP-АДРЕС` на адрес вашего сервера:

```bash
# на вашем компьютере
ssh root@IP-АДРЕС
```

При первом подключении спросят, доверяете ли вы серверу — напечатайте `yes` и нажмите
Enter. Потом попросят пароль.

> ⚠️ **Пароль не виден при вводе.** Когда печатаете пароль, на экране **ничего не
> появляется** — ни точек, ни звёздочек. Это нормально и сделано для безопасности.
> Просто наберите пароль вслепую (или вставьте) и нажмите Enter.

✅ Получилось, если строка в терминале стала выглядеть примерно так:
`root@ваш-сервер:~#`

---

## Шаг 2. Обновить систему

Дальше **все команды выполняются на сервере** — в том же окне, где вы только что
подключились. Эта команда обновляет список доступных программ и сами программы:

```bash
# на сервере
apt update && apt upgrade -y
```

Может занять минуту-две. Если появится синее окно с вопросом — просто нажмите Enter,
оставив вариант по умолчанию.

---

## Шаг 3. Установить nginx, PHP и curl

Ставим сам веб-сервер (**nginx**), язык **PHP** и нужные к нему дополнения,
включая **curl** — одной командой:

```bash
# на сервере
apt install -y nginx php-fpm php-cli php-curl php-mbstring \
  php-xml php-zip php-gd php-mysql php-intl php-bcmath curl
```

Простыми словами, что мы поставили:

- **nginx** — программа, которая показывает сайты посетителям.
- **php-fpm** — «мотор», который выполняет PHP-код страниц.
- **php-curl** — даёт PHP возможность ходить на другие сайты и API.
- остальные **php-…** — частые дополнения (текст, картинки, база данных),
  пригодятся почти любому сайту.

> 💡 **Про версию PHP.** На Ubuntu 24.04 команда сама поставит **PHP 8.3**, на
> 22.04 — 8.1. Мы нигде не пишем номер версии вручную, поэтому команда подходит
> обеим. Номер понадобится только один раз — в шаге 4, и там показано, как его узнать.

✅ Проверить версию PHP: `php -v` — должна показаться строка вида «PHP 8.3.x».

---

## Шаг 4. Настроить nginx под PHP

Сначала узнаем **точное имя «мотора» PHP** — оно зависит от версии:

```bash
# на сервере
ls /run/php/
```

Вы увидите файл вроде `php8.3-fpm.sock`. **Запомните это имя** — если у вас другая
версия (например `php8.1-fpm.sock`), подставьте своё имя в настройку ниже.

Теперь открываем файл настроек nginx редактором **nano**:

```bash
# на сервере
nano /etc/nginx/sites-available/default
```

> ⚠️ **Замените всё содержимое файла.** Чтобы быстро очистить файл, зажмите
> `Ctrl+K` — каждая строка будет удаляться. Удалите все строки, затем вставьте
> текст ниже (правой кнопкой мыши или `Ctrl+Shift+V`).

Вставьте это (файл `/etc/nginx/sites-available/default`):

```nginx
server {
    listen 80 default_server;
    listen [::]:80 default_server;

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

    server_name _;

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

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

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

Две строки, которые важно понять:

- `index index.php index.html;` — говорит nginx: если в папке есть **index.php**,
  показывать **его** в первую очередь. Именно из-за неправильного порядка тут часто
  «открывается не та страница».
- `fastcgi_pass unix:/run/php/php8.3-fpm.sock;` — это тот самый «мотор» из начала
  шага. **Если ваше имя отличается — впишите его здесь.**

Сохраняем и выходим из nano: `Ctrl+O`, затем `Enter` (сохранить), потом `Ctrl+X` (выйти).

---

## Шаг 5. Сделать тестовую страницу

Уберём стандартную заглушку nginx, чтобы она не мешала:

```bash
# на сервере
rm -f /var/www/html/index.nginx-debian.html
```

Создаём свою страницу:

```bash
# на сервере
nano /var/www/html/index.php
```

Вставьте этот код и сохраните так же (`Ctrl+O`, `Enter`, `Ctrl+X`):

```php
<?php
echo "<h1>Сервер работает! 🎉</h1>";
echo "<p>Версия PHP: " . PHP_VERSION . "</p>";

if (function_exists("curl_init")) {
    echo "<p>curl: включён ✅</p>";
} else {
    echo "<p>curl: НЕ работает ❌</p>";
}
```

---

## Шаг 6. Применить настройки

Сначала попросим nginx **проверить**, нет ли ошибок в настройках:

```bash
# на сервере
nginx -t
```

> 💡 Должны увидеть слова **«syntax is ok»** и **«test is successful»**. Если вместо
> этого ошибка — скорее всего опечатка в файле из шага 4 или неверное имя `.sock`.
> Откройте файл снова тем же `nano` и сверьтесь.

Теперь перезапускаем оба компонента, чтобы настройки вступили в силу:

```bash
# на сервере
systemctl restart php*-fpm
systemctl reload nginx
```

И включим **автозапуск** — чтобы сайт сам поднимался после перезагрузки сервера:

```bash
# на сервере
systemctl enable nginx php*-fpm
```

---

## Шаг 7. Открыть фаервол

Фаервол — это «охранник», который пропускает или блокирует подключения. Часто он
выключен, и тогда шаг можно пропустить. Проверить:

```bash
# на сервере
ufw status
```

Если написано `Status: inactive` — фаервол выключен, **переходите к шагу 8**.
Если `active` — выполните команды ниже.

> 🚫 **Сначала разрешите вход по SSH — иначе потеряете доступ к серверу!**
> Порт `22` — это ваше подключение из шага 1. Всегда открывайте его **первым**.

```bash
# на сервере
ufw allow 22/tcp     # доступ по SSH — обязательно первым
ufw allow 80/tcp     # сайты по http
ufw allow 443/tcp    # сайты по https (на будущее)
```

---

## Шаг 8. Проверить в браузере

Откройте любой браузер и наберите в адресной строке ваш IP с `http://` впереди:

```
http://IP-АДРЕС
```

🎉 Должна открыться страница «Сервер работает!» с версией PHP и строкой
«curl: включён ✅». Готово — веб-сервер настроен!

Хотите убедиться, что **curl реально ходит в интернет** с сервера?

```bash
# на сервере
curl -I https://example.com
```

Если в ответ пришло несколько строк, начинающихся с `HTTP/…` — интернет с сервера работает.

---

# Бонус: бесплатный HTTPS — замочек 🔒

Включаем шифрование, чтобы сайт открывался по `https://` и в браузере горел замочек.
Полностью бесплатно, через Let's Encrypt.

> ⚠️ **Нужен домен.** Сертификат выдают только на доменное имя (например `site.ru`),
> а не на голый IP-адрес. Если домена пока нет — раздел можно пропустить и вернуться позже.

### А. Направьте домен на сервер

В панели, где вы покупали домен, создайте **A-запись** и укажите в ней IP-адрес сервера.
Изменения расходятся от пары минут до нескольких часов.

Проверить, что домен уже «смотрит» на сервер, можно с любого компьютера:

```bash
# на вашем компьютере
ping ваш-домен.ru
```

В ответе должен показаться **IP-адрес вашего сервера**. Если да — идём дальше.
(Остановить ping: `Ctrl+C`.)

### Б. Впишите домен в настройки nginx

Откройте конфиг `nano /etc/nginx/sites-available/default` и замените строку
`server_name _;` на свой домен (можно с `www` и без):

```nginx
server_name ваш-домен.ru www.ваш-домен.ru;
```

Сохраните (`Ctrl+O`, `Enter`, `Ctrl+X`) и примените:

```bash
# на сервере
nginx -t && systemctl reload nginx
```

### В. Установите certbot

Это программа, которая сама получит сертификат и пропишет его в nginx:

```bash
# на сервере
apt install -y certbot python3-certbot-nginx
```

### Г. Получите сертификат

Одна команда — она всё настроит автоматически. Подставьте свой домен:

```bash
# на сервере
certbot --nginx -d ваш-домен.ru -d www.ваш-домен.ru
```

Программа задаст несколько вопросов:

- **e-mail** — для важных писем о сертификате;
- **согласие с условиями** — напечатайте `Y` и Enter;
- **переадресация на https** — выберите вариант `2` (Redirect), чтобы сайт всегда
  открывался по защищённому адресу.

🔒 Готово! Откройте `https://ваш-домен.ru` — в браузере появится замочек.

### Д. Автопродление — уже работает

Сертификат действует 90 дней, но certbot **продлевает его сам**, ничего делать не нужно.
Убедиться, что автопродление настроено, можно «репетицией»:

```bash
# на сервере
certbot renew --dry-run
```

Если ошибок нет — всё в порядке, сервер обновит сертификат заранее сам.

> 💡 **Про порт 443.** Для https нужен открытый порт `443`. Если вы делали шаг 7 —
> он уже открыт. Если фаервол был выключен — тоже всё в порядке.

---

# Если что-то пошло не так

**Открывается заглушка, а не мой index.php.**
Значит, рядом лежит `index.html`, и он показывается раньше. Либо убедитесь, что в
конфиге (шаг 4) `index.php` стоит первым: `index index.php index.html;`, либо просто
удалите лишнюю заглушку: `rm /var/www/html/index.html`. После изменений всегда:
`systemctl reload nginx`.

**Ошибка «502 Bad Gateway».**
nginx не может достучаться до «мотора» PHP. Почти всегда — неверное имя `.sock` в
конфиге. Проверьте: `ls /run/php/`, впишите точное имя в строку `fastcgi_pass` (шаг 4),
затем `systemctl restart php*-fpm && systemctl reload nginx`.

**PHP-файл скачивается вместо того, чтобы открыться.**
Значит, блок `location ~ \.php$ { … }` из шага 4 отсутствует или с ошибкой. Сверьте
конфиг со шагом 4, проверьте `nginx -t` и перезагрузите nginx.

**На странице «curl: НЕ работает ❌».**
Не установлено дополнение: `apt install -y php-curl`, затем `systemctl restart php*-fpm`.

**Сайт вообще не открывается по IP.**
Проверьте по порядку: 1) запущен ли nginx — `systemctl status nginx`; 2) открыт ли
порт 80 в фаерволе (шаг 7); 3) нет ли отдельного «сетевого экрана» в панели у
хостинг-провайдера — иногда порт 80 нужно открыть ещё и там.

**Потерял доступ к серверу после включения фаервола.**
Значит, порт 22 не был открыт до включения ufw. Зайдите через веб-консоль в панели
хостинга (VNC / «аварийный доступ») и выполните `ufw allow 22/tcp`. На будущее —
всегда открывайте порт 22 первым.

---

# Что дальше

**Безопасность**

- Смените пароль root: команда `passwd` на сервере.
- Настройте вход по ключу вместо пароля — надёжнее и удобнее.
- Не пересылайте пароли от сервера в мессенджерах.

**Развитие сайта**

- Привяжите домен вместо голого IP-адреса.
- Включите https (замочек) — см. раздел «Бесплатный HTTPS» выше.
- Положите файлы своего сайта в папку `/var/www/html`.

---

*Проверено на Ubuntu 24.04 с nginx 1.24 и PHP 8.3. Команды одинаково работают и на
Ubuntu 22.04 (там установится PHP 8.1). Все команды выполняются от имени root.*
