🚀 Полный Практикум: Веб-сервер в VM

От Ubuntu Server до Nginx + PHP в VirtualBox.

🖥️ Наша Цель

Создать с нуля полностью рабочий, но локальный и безопасный веб-сервер. Мы установим Ubuntu Server 24.04 LTS в виртуальную машину (VirtualBox), настроим его, установим Nginx, PHP-FPM, создадим несколько сайтов и даже добавим "фейковый" SSL-сертификат для тестирования HTTPS.

1. Подготовка (VM + ISO)

Нам нужно два компонента. Вам не нужна флешка, так как мы работаем в VM.

  • Программа Виртуализации (Гипервизор):
    Если у вас ее нет, скачайте и установите. **VirtualBox** — бесплатный и идеальный для старта.

    # Скачать VirtualBox:
    https://www.virtualbox.org/wiki/Downloads
  • Образ (ISO) Ubuntu Server:
    Это "установочный диск" в виде файла. Скачаем версию с Долгосрочной Поддержкой (LTS).

    # Скачать Ubuntu Server 24.04 LTS:
    https://ubuntu.com/download/server

2. Создание Виртуальной Машины

Откройте VirtualBox и нажмите "Создать" (New). Настройки — это 90% успеха.

  • Имя: `Ubuntu Web Server` (VirtualBox сам подставит тип).
  • Образ ISO: Укажите скачанный `.iso` файл Ubuntu Server.
  • Hardware (Оборудование):
    • RAM: Минимум `2048 MB` (2 GB).
    • Процессоры: `2` CPU.
  • Hard Disk (Жесткий диск):
    • `25 GB` (или больше).
    • Не выбирайте `Pre-allocate Full Size`.

⚠️ КРИТИЧЕСКАЯ НАСТРОЙКА: СЕТЬ ⚠️

Прежде чем запустить VM, зайдите в ее "Настройки" (Settings) -> "Сеть" (Network).

По умолчанию стоит `NAT`. Это неудобно. Смените `Тип подключения` (Attached to) на `Сетевой мост` (Bridged Adapter).

Зачем? Это даст вашей VM "настоящий" IP-адрес в вашей домашней сети (например, `192.168.1.50`), и вы сможете легко к ней подключиться с вашего основного компьютера.

🚀 ЧЕЛЛЕНДЖ:

1. Создайте VM.
2. Зайдите в ее Настройки -> Сеть -> Адаптер 1.
3. Убедитесь, что Тип подключения: `Сетевой мост` (Bridged Adapter).
4. Нажмите "Старт".

3. Установка Ubuntu Server

После старта VM вы увидите установщик. Это текстовый интерфейс, управляемый клавиатурой (Enter и стрелки).

  • Network (Сеть): На этом экране (благодаря "Сетевому мосту") вы должны сразу увидеть IP-адрес, который получил сервер. Запомните его.
  • Storage (Диск): Самый простой вариант для VM — "Use an entire disk" (Использовать весь диск). Нажмите "Done".
  • Profile Setup (Профиль): Ваш самый главный шаг.
    • `Your server's name`: Имя сервера (напр. `web-server`)
    • `Pick a username`: Ваш логин (напр. `admin`).
    • `Choose a password`: Ваш пароль.

❗️ ОБЯЗАТЕЛЬНЫЙ ШАГ: SSH ❗️

На экране "SSH Setup" вас спросят "Install OpenSSH Server?". ОБЯЗАТЕЛЬНО поставьте галочку (нажав "Пробел") на [X] Install OpenSSH Server.

Без этого мы не сможем удаленно управлять сервером.

  • Featured Server Snaps: Нас спросят, хотим ли мы установить Docker, Nginx и т.д. Ничего не выбирайте. Мы все установим вручную.
  • Завершение: Установщик скопирует файлы. В конце он попросит "Reboot Now". Нажмите. VM перезагрузится.

4. Настройка (SSH, UFW)

Сервер загрузился. В окне VM вы увидите черный экран с приглашением `web-server login:`.

Мы больше не будем работать в этом окне. Мы подключимся к VM с нашего **основного компьютера** (клиента) по SSH.

  • (НА КЛИЕНТЕ) Подключаемся по SSH:
    Откройте ваш терминал (PowerShell, CMD, Terminal) и введите:

    # ssh [ваш_логин]@[IP_сервера_VM]
    ssh admin@192.168.1.50

    Введите `yes` и свой пароль. Вы должны увидеть `admin@web-server:~$`. Поздравляем, вы внутри!

  • (В SSH-СЕССИИ) Обновляем систему:
    Первым делом обновим все пакеты.

    sudo apt update
    sudo apt upgrade -y

⚠️ НАСТРОЙКА FIREWALL (UFW) ⚠️

Мы должны включить файрвол, но если сделать это неправильно, мы заблокируем себе SSH-доступ.

ПРАВИЛЬНЫЙ ПОРЯДОК:

# 1. СНАЧАЛА разрешаем SSH
sudo ufw allow ssh

# 2. Разрешаем HTTP и HTTPS (они нам понадобятся)
sudo ufw allow http
sudo ufw allow https

# 3. ТЕПЕРЬ включаем файрвол
sudo ufw enable

# 4. Проверяем статус
sudo ufw status

Вы должны увидеть `Status: active` и `ssh`, `http`, `https` в списке `ALLOW`.

🚀 ЧЕЛЛЕНДЖ:

Вы вошли по SSH и настроили UFW. Окно VirtualBox можно свернуть — вся остальная работа будет идти в вашем терминале.

5. Установка Nginx + PHP

Теперь, когда "фундамент" (ОС) готов, ставим "стены" (веб-сервер).

  • (В SSH-СЕССИИ) Установка Nginx:

    sudo apt install nginx

    Проверьте: откройте `http://[IP_ВАШЕЙ_VM]` в браузере. Вы должны увидеть "Welcome to nginx!".

  • (В SSH-СЕССИИ) Установка PHP-FPM:
    Это "движок", который будет выполнять PHP-код. Nginx передаст ему запросы.

    sudo apt install php8.2-fpm

    Nginx и PHP-FPM установлены. Теперь их надо "познакомить".

6. Настройка Nginx + PHP

Мы изменим конфиг Nginx, чтобы он "понял", что `.php` файлы нужно отправлять в PHP-FPM.

  • (В SSH-СЕССИИ) Редактируем конфиг `default`:

    sudo nano /etc/nginx/sites-available/default
  • (В SSH-СЕССИИ) Находим и меняем строки:

    # 1. Добавляем index.php к этой строке:
    index index.html index.htm index.php;
    
    # 2. Находим эту секцию, раскомментируем ее и меняем 1 строку:
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
    
        # Убедитесь, что эта строка указывает на ВАШУ версию PHP
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
    }
    
  • (В SSH-СЕССИИ) Проверяем синтаксис и перезагружаем:

    sudo nginx -t
    # ... вы должны увидеть "syntax is ok"
    sudo systemctl reload nginx
  • (В SSH-СЕССИИ) Создаем тестовый PHP-файл:

    echo "" | sudo tee /var/www/html/info.php

🚀 ЧЕЛЛЕНДЖ:

1. Откройте в браузере `http://[IP_ВАШЕЙ_VM]/info.php`.
2. Вы должны увидеть большую таблицу с логотипом PHP.
3. **(ВАЖНО!)** Удалите файл: sudo rm /var/www/html/info.php

7. Виртуальные Хосты

Мы хотим, чтобы на одном сервере жило несколько сайтов (напр. `site1.com` и `site2.com`). В Nginx это называется "Server Blocks".

  • (В SSH-СЕССИИ) Создаем папку для `site1.com`:

    sudo mkdir -p /var/www/site1.com/html
    echo "Hello from site1.com!" | sudo tee /var/www/site1.com/html/index.html
  • (В SSH-СЕССИИ) Создаем конфиг Nginx для `site1.com`:

    sudo nano /etc/nginx/sites-available/site1.com
  • (В SSH-СЕССИИ) Вставляем этот конфиг:

    server {
        listen 80;
        server_name site1.com www.site1.com;
        root /var/www/site1.com/html;
        index index.html index.php;
    
        location / {
            try_files $uri $uri/ =404;
        }
    
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        }
    }
  • (В SSH-СЕССИИ) "Включаем" сайт и отключаем `default`:

    sudo ln -s /etc/nginx/sites-available/site1.com /etc/nginx/sites-enabled/
    sudo rm /etc/nginx/sites-enabled/default
    sudo nginx -t && sudo systemctl reload nginx
💡 Как "обмануть" свой компьютер?

Ваш браузер не знает, где `site1.com`. Мы "обманем" его, отредактировав файл hosts на **вашем основном компьютере** (не в VM!).

Windows: `C:\Windows\System32\drivers\etc\hosts`
Mac/Linux: `/etc/hosts`

Добавьте в конец файла эту строку (и сохраните):

[IP_ВАШЕЙ_VM]   site1.com

Теперь, когда вы введете `http://site1.com` в браузере, он пойдет на вашу VM. Вы должны увидеть "Hello from site1.com!".

8. SSL (Самоподписанный)

Мы не можем использовать Let's Encrypt, так как наш сервер локальный. Но мы можем создать самоподписанный (self-signed) сертификат, чтобы включить `https://`.

Ваш браузер будет ругаться ("Небезопасно"), но **соединение все равно будет зашифровано**.

  • (В SSH-СЕССИИ) Создаем сертификат:
    Эта команда создаст сертификат и ключ на 1 год.

    sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/ssl/private/nginx-selfsigned.key \
    -out /etc/ssl/certs/nginx-selfsigned.crt

    Вас попросят ввести данные (Страна, Город...). Можете нажимать Enter, это неважно для самоподписанного сертификата.

  • (В SSH-СЕССИИ) Редактируем конфиг `site1.com`:

    sudo nano /etc/nginx/sites-available/site1.com
  • (В SSH-СЕССИИ) Добавляем SSL-блок:
    Добавьте этот блок **над** существующим `server { ... }` блоком. Он будет перенаправлять HTTP на HTTPS.

    server {
        listen 80;
        server_name site1.com www.site1.com;
        return 301 https://$server_name$request_uri;
    }
    
    # ... а в старый блок server { ... } добавляем вот это:
    
    server {
        # listen 80;  <-- УДАЛИТЬ ЭТУ СТРОКУ
        listen 443 ssl; # <-- ДОБАВИТЬ ЭТУ СТРОКУ
    
        server_name site1.com www.site1.com;
        root /var/www/site1.com/html;
        index index.html index.php;
    
        # ДОБАВИТЬ ЭТИ ДВЕ СТРОКИ
        ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
        ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
    
        location / {
            try_files $uri $uri/ =404;
        }
        # ... (секция php остается без изменений)
    }
  • (В SSH-СЕССИИ) Перезагружаем Nginx:

    sudo nginx -t && sudo systemctl reload nginx

🚀 ФИНАЛЬНЫЙ ЧЕЛЛЕНДЖ:

1. Очистите кэш браузера или откройте приватное окно.
2. Зайдите на `http://site1.com`. Вас должно автоматически перекинуть на `https://site1.com`.
3. Браузер покажет ошибку "Ваше подключение не защищено".
4. Нажмите "Дополнительно" -> "Перейти на сайт site1.com (небезопасно)".
5. Вы должны увидеть "Hello from site1.com!", а в адресной строке — `https://` и 🔒 (перечеркнутый).