Настройка профессиональной локальной среды разработки: Nginx, виртуальные хосты и HTTPS | AdminWiki
Timeweb Cloud — сервера, Kubernetes, S3, Terraform. Лучшие цены IaaS.
Попробовать

Настройка профессиональной локальной среды разработки: Nginx, виртуальные хосты и HTTPS

04 мая 2026 11 мин. чтения
Содержание статьи

Работа с простым localhost:8080 ограничивает возможности тестирования современных веб-приложений. Отсутствие HTTPS блокирует работу Service Workers, Geolocation API и корректное тестирование PWA. Отладка кода превращается в поиск по логам. Эта статья предоставляет законченное решение: вы создадите локальную среду, где каждый проект существует на собственном домене вида project.local, обслуживается по безопасному протоколу HTTPS и готов к отладке через Xdebug. После прохождения гайда вы получите: 1) Изолированные проекты на своих доменах; 2) Работающий HTTPS для тестирования PWA и API; 3) Готовую отладку PHP в IDE; 4) Скрипт для автоматического создания новых проектов.

Мы разберем архитектуру на компонентах: Nginx как веб-сервер с виртуальными хостами, механизм резолвинга доменов (на выбор Dnsmasq или файл /etc/hosts), инфраструктура самоподписанных SSL-сертификатов и настройка PHP-FPM с Xdebug. Каждый шаг сопровождается конкретными командами и готовыми конфигурационными файлами, проверенными на Ubuntu/Debian-системах. Результат - профессиональная среда, эмулирующая продакшен-окружение и экономящая часы на отладке и подготовке.

Зачем нужна профессиональная локальная среда и что мы построим

Работа с localhost имеет три критических ограничения. Во-первых, отсутствие изоляции проектов: все приложения используют один корневой контекст, что ведет к конфликтам зависимостей и настроек. Во-вторых, современные браузерные API, такие как Service Workers, Geolocation или работа с камерой, требуют безопасного контекста, который обеспечивает только HTTPS. В-третьих, отладка без интеграции с IDE замедляет разработку.

Цель этого руководства - создать среду, где:

  • Каждый проект доступен по уникальному домену, например, myapp.local или client-project.local.
  • Все соединения используют HTTPS с доверенными (для вашей системы) сертификатами.
  • PHP-код можно отлаживать, устанавливая точки останова непосредственно в PhpStorm или VS Code.
  • Архитектура понятна и контролируема, что позволяет адаптировать ее под специфические задачи.

В основе лежит стек: Nginx в роли веб-сервера с конфигурацией виртуальных хостов, PHP-FPM для обработки скриптов, OpenSSL для генерации сертификатов и Dnsmasq для автоматического разрешения доменных имен в локальной сети.

Подготовка системы и установка Nginx

Инструкции проверены на Ubuntu 22.04 LTS и Debian 12. Убедитесь, что система обновлена: sudo apt update && sudo apt upgrade -y.

Установка Nginx и проверка базовой конфигурации

Установите Nginx из официальных репозиториев:

sudo apt install nginx -y

После установки проверьте статус службы:

sudo systemctl status nginx

Ожидаемый вывод - active (running). Откройте в браузере http://localhost или выполните curl localhost. Вы должны увидеть стандартную страницу приветствия Nginx.

Ключевые каталоги конфигурации:

  • /etc/nginx/nginx.conf - главный конфигурационный файл.
  • /etc/nginx/sites-available/ - хранилище конфигов виртуальных хостов.
  • /etc/nginx/sites-enabled/ - симлинки на активные конфиги из sites-available.

Настройте права для вашего пользователя на директорию веб-документов, чтобы избежать ошибок 403:

sudo chown -R $USER:$USER /var/www
sudo chmod -R 755 /var/www

Организация изоляции проектов: виртуальные хосты в Nginx

Виртуальные хосты позволяют Nginx обслуживать несколько независимых сайтов на одном IP-адресе, определяя целевой проект по доменному имени в заголовке запроса Host.

Создание структуры директорий и файла конфигурации vhost

Создайте структуру для первого проекта, например, myproject:

mkdir -p /var/www/myproject/public

Создайте в каталоге public простой файл index.php для проверки:

echo "<?php phpinfo(); ?>" > /var/www/myproject/public/index.php

Теперь создайте конфигурационный файл виртуального хоста в /etc/nginx/sites-available/myproject.local:

server {
    listen 80;
    listen [::]:80;

    server_name myproject.local www.myproject.local;

    root /var/www/myproject/public;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

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

В директиве fastcgi_pass укажите корректный сокет или адрес вашего PHP-FPM. Для версии PHP 8.1 это будет /run/php/php8.1-fpm.sock.

Активация хоста и обработка PHP-запросов

Активируйте конфиг, создав симлинк в каталог sites-enabled:

sudo ln -s /etc/nginx/sites-available/myproject.local /etc/nginx/sites-enabled/

Проверьте синтаксис конфигурации Nginx перед перезагрузкой:

sudo nginx -t

При успешной проверке вы увидите сообщение nginx: configuration file /etc/nginx/nginx.conf test is successful. Перезагрузите Nginx:

sudo systemctl reload nginx

Теперь Nginx готов обслуживать проект по адресу myproject.local, но ваш компьютер еще не знает, куда ведет этот домен.

Настройка Dnsmasq для локальных доменов

Чтобы браузер понял, что myproject.local указывает на ваш локальный компьютер (127.0.0.1), нужен механизм разрешения имен.

Быстрый старт: редактирование файла /etc/hosts

Самый простой способ - добавить запись в системный файл /etc/hosts:

sudo nano /etc/hosts

Добавьте строку:

127.0.0.1 myproject.local www.myproject.local

Сохраните файл. Проверьте резолвинг командой ping myproject.local. В ответе должен быть IP-адрес 127.0.0.1. Метод работает, но требует ручного редактирования для каждого нового домена и не поддерживает wildcard-записи (например, *.local).

Если вы столкнулись с ошибками доступа после настройки виртуальных хостов, вам поможет практическая шпаргалка по диагностике и устранению ошибок веб-сервера, где подробно разбираются решения для 403, 502 и других статусов.

Масштабируемое решение: настройка локального DNS через Dnsmasq

Dnsmasq - легковесный DNS-сервер, который можно настроить на резолвинг всех доменов в зоне .local на localhost.

Установите Dnsmasq:

sudo apt install dnsmasq -y

Отредактируйте основной конфигурационный файл:

sudo nano /etc/dnsmasq.conf

Добавьте в конец файла строку:

address=/local/127.0.0.1

Эта директива означает: «все запросы к доменам, заканчивающимся на .local, направляй на адрес 127.0.0.1».

Далее нужно настроить систему на использование локального Dnsmasq в качестве DNS-резолвера. В системах с systemd-resolved создайте файл конфигурации:

sudo nano /etc/systemd/resolved.conf.d/dnsmasq.conf

Добавьте в него:

[Resolve]
DNS=127.0.0.1
Domains=~local

Перезапустите службы:

sudo systemctl restart systemd-resolved dnsmasq

Проверьте работу:

dig myproject.local @127.0.0.1

В секции «ANSWER» вы должны увидеть запись типа A с адресом 127.0.0.1. Теперь любой домен *.local будет автоматически разрешаться на ваш локальный сервер.

Безопасное соединение: генерация и установка самоподписанных SSL-сертификатов

HTTPS необходим для тестирования PWA, Service Workers, API геолокации и работы с cookies с флагом Secure. Мы создадим собственный корневой центр сертификации (CA) и будем подписывать им сертификаты для каждого домена.

Генерация корневого CA и сертификата для домена

Создайте каталог для хранения ключей и сертификатов:

mkdir -p ~/.ssl/local-ca
cd ~/.ssl/local-ca

Сгенерируйте приватный ключ корневого CA:

openssl genrsa -out rootCA.key 4096

Создайте самоподписанный корневой сертификат на основе этого ключа:

openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.crt -subj "/C=RU/ST=Local/L=Development/O=Local CA/CN=Local Development Root CA"

Теперь создадим сертификат для конкретного домена. Сначала сгенерируем приватный ключ и запрос на подпись сертификата (CSR). Для поддержки нескольких доменов (SAN) создадим конфигурационный файл myproject.local.cnf:

[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[dn]
C = RU
ST = Local
O = Local Development
CN = myproject.local

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = myproject.local
DNS.2 = www.myproject.local

Генерация ключа и CSR:

openssl req -new -newkey rsa:2048 -nodes -keyout myproject.local.key -out myproject.local.csr -config myproject.local.cnf

Подпишите CSR корневым CA, создав действительный сертификат:

openssl x509 -req -in myproject.local.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out myproject.local.crt -days 365 -sha256 -extfile myproject.local.cnf -extensions v3_req

В результате вы получите три файла: приватный ключ (.key), сертификат (.crt) и корневой сертификат CA (rootCA.crt).

Настройка SSL в Nginx и добавление сертификата в доверенные

Обновите конфигурацию виртуального хоста в /etc/nginx/sites-available/myproject.local, добавив блок для порта 443:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name myproject.local www.myproject.local;

    ssl_certificate /home/$USER/.ssl/local-ca/myproject.local.crt;
    ssl_certificate_key /home/$USER/.ssl/local-ca/myproject.local.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;

    # ... остальная конфигурация (root, location) остается без изменений
}

server {
    listen 80;
    listen [::]:80;
    server_name myproject.local www.myproject.local;
    return 301 https://$server_name$request_uri;
}

Проверьте конфигурацию и перезагрузите Nginx: sudo nginx -t && sudo systemctl reload nginx.

Теперь нужно добавить корневой сертификат rootCA.crt в хранилище доверенных центров вашей ОС.

Для Linux (Debian/Ubuntu):

sudo cp rootCA.crt /usr/local/share/ca-certificates/local-root-ca.crt
sudo update-ca-certificates

Для Windows: импортируйте файл rootCA.crt в хранилище «Доверенные корневые центры сертификации» текущего пользователя или локального компьютера через оснастку certmgr.msc.

Для macOS: дважды кликните на файл rootCA.crt, откроется «Связка ключей». Добавьте сертификат в системную связку «System» и установите доверие «Always Trust» для SSL.

После этого браузер будет считать соединение с https://myproject.local безопасным. Для детальной настройки SSL/TLS в продакшен-среде с использованием Let's Encrypt обратитесь к полному руководству по защите веб-серверов, где разбираются современные протоколы, шифры и настройка HSTS.

Интеграция Xdebug для отладки PHP-кода

Xdebug позволяет выполнять пошаговую отладку PHP-скриптов, инспектировать переменные и профилировать производительность. Настройка состоит из двух частей: конфигурация PHP и настройка IDE.

Настройка Xdebug в php.ini и PHP-FPM

Установите расширение Xdebug. Для PHP 8.2:

sudo apt install php8.2-xdebug -y

Создайте файл конфигурации Xdebug:

sudo nano /etc/php/8.2/fpm/conf.d/20-xdebug.ini

Добавьте следующие параметры (для режима отладки):

zend_extension=xdebug.so
xdebug.mode=debug
xdebug.client_host=127.0.0.1
xdebug.client_port=9003
xdebug.start_with_request=yes
xdebug.log=/var/log/xdebug.log
xdebug.log_level=0

Параметр xdebug.client_host указывает адрес, где слушает ваша IDE. При использовании Docker или виртуальных машин это может быть IP-адрес хоста (например, 172.17.0.1 для Docker bridge).

Перезапустите PHP-FPM для применения настроек:

sudo systemctl restart php8.2-fpm

Убедитесь, что Xdebug активен, создав в корне проекта файл info.php с вызовом phpinfo() и найдя в выводе секцию Xdebug.

Конфигурация IDE и практическая отладка

В PhpStorm откройте Settings > PHP > Servers и добавьте новый сервер:

  • Name: myproject.local
  • Host: myproject.local
  • Port: 443
  • Debugger: Xdebug
  • Use path mappings: отметьте и сопоставьте путь на сервере (/var/www/myproject/public) с локальной папкой вашего проекта.

Затем в меню Run > Start Listening for PHP Debug Connections. Установите точку останова в коде, откройте в браузере https://myproject.local с параметром XDEBUG_SESSION_START=PHPSTORM (для этого удобно использовать расширение браузера, например, «Xdebug Helper»). Выполнение скрипта остановится на точке останова.

Для VS Code установите расширение «PHP Debug». В файле launch.json добавьте конфигурацию:

{
    "name": "Listen for Xdebug",
    "type": "php",
    "request": "launch",
    "port": 9003,
    "pathMappings": {
        "/var/www/myproject/public": "${workspaceFolder}/public"
    }
}

Запустите отладку (F5) и откройте проект в браузере с активной сессией Xdebug.

Автоматизация: обзор инструментов (Laravel Valet, Docker) и создание своих скриптов

После понимания основ можно автоматизировать процесс настройки нового проекта.

Готовые решения: Valet и Docker Compose

Laravel Valet (для macOS/Linux) автоматизирует настройку Nginx, Dnsmasq и SSL. После установки (composer global require laravel/valet && valet install) он создает папку ~/.config/valet/Sites. Любой проект, помещенный туда или симлинкнутый, становится доступен по project-name.test с автоматическим HTTPS. Valet использует Caddy или Nginx под капотом, что удобно для быстрого старта, но дает меньше контроля над конфигурацией.

Docker-подход обеспечивает полную изоляцию. Пример docker-compose.yml для проекта с Nginx, PHP-FPM и генерацией сертификатов через mkcert:

version: '3.8'
services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./:/var/www/html
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./docker/certs:/etc/nginx/certs
    networks:
      - app-network

  php:
    build: ./docker/php
    volumes:
      - ./:/var/www/html
    networks:
      - app-network

  mkcert:
    image: goharbor/mkcert:latest
    command: sh -c "mkcert -install && mkcert -cert-file /certs/local.crt -key-file /certs/local.key myproject.local"
    volumes:
      - ./docker/certs:/certs
      - ${HOME}/.local/share/mkcert:/root/.local/share/mkcert
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

Этот подход сложнее, но обеспечивает воспроизводимость и чистоту основной системы. Для сравнения подходов с виртуальными хостами изучите практическое руководство по переходу на Docker.

Свой скрипт для автоматической настройки проекта

На основе пройденных шагов можно создать bash-скрипт create-local-project.sh:

#!/bin/bash
PROJECT_NAME=$1
if [ -z "$PROJECT_NAME" ]; then
    echo "Usage: $0 <project-name>"
    exit 1
fi

# 1. Создание директорий
mkdir -p /var/www/$PROJECT_NAME/public
echo "<?php echo 'Hello from $PROJECT_NAME'; ?>" > /var/www/$PROJECT_NAME/public/index.php

# 2. Создание конфига Nginx из шаблона
cat << EOF | sudo tee /etc/nginx/sites-available/$PROJECT_NAME.local > /dev/null
server {
    listen 80;
    server_name $PROJECT_NAME.local;
    return 301 https://\$server_name\$request_uri;
}
server {
    listen 443 ssl http2;
    server_name $PROJECT_NAME.local;
    root /var/www/$PROJECT_NAME/public;
    index index.php;
    ssl_certificate /home/$USER/.ssl/local-ca/$PROJECT_NAME.local.crt;
    ssl_certificate_key /home/$USER/.ssl/local-ca/$PROJECT_NAME.local.key;
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    }
}
EOF

# 3. Активация сайта
sudo ln -sf /etc/nginx/sites-available/$PROJECT_NAME.local /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

echo "Проект $PROJECT_NAME создан. Добавьте '127.0.0.1 $PROJECT_NAME.local' в /etc/hosts или используйте Dnsmasq."

Скрипт требует предварительной настройки корневого CA и генерации SSL-сертификатов, но демонстрирует принцип автоматизации.

Итоги и решение частых проблем

Вы создали профессиональную локальную среду разработки. Каждый проект теперь изолирован, доступен по собственному домену с HTTPS и готов к отладке. Что это даёт на практике: значительное ускорение разработки за счет мгновенной отладки, отсутствие ошибок при переносе на продакшен из-за различий в окружении, возможность тестирования современных браузерных API, требующих HTTPS.

Для быстрой проверки работоспособности используйте чек-лист:

  1. Домен резолвится? ping myproject.local должен вернуть 127.0.0.1.
  2. Nginx слушает порты? sudo ss -tulpn | grep :443 покажет процесс nginx.
  3. Правильные ли права у корневой директории? Веб-сервер (www-data) должен иметь доступ на чтение: sudo chown -R $USER:www-data /var/www/myproject и sudo chmod -R 750 /var/www/myproject.
  4. Работает ли PHP-FPM? sudo systemctl status php8.2-fpm.
  5. Сертификат доверенный? В браузере при открытии https://myproject.local в адресной строке должен быть замок.

Таблица частых ошибок и решений:

Ошибка Причина Решение
403 Forbidden Нет прав на чтение папки или файла index. Проверить права (ls -la), убедиться, что файл index.php/index.html существует.
502 Bad Gateway Nginx не может подключиться к PHP-FPM. Проверить fastcgi_pass (корректный сокет/порт), перезапустить PHP-FPM.
Домен не открывается Проблема с резолвингом DNS. Проверить /etc/hosts или конфиг Dnsmasq, перезапустить systemd-resolved.
SSL-предупреждение в браузере Сертификат не добавлен в доверенные или неверный SAN. Импортировать rootCA.crt в хранилище ОС, перегенерировать сертификат с правильными доменами в SAN.

Для поддержки среды в актуальном состоянии периодически обновляйте пакеты (sudo apt update && sudo apt upgrade) и проверяйте актуальность конфигураций SSL. Если вы планируете развернуть аналогичный стек на продакшен-сервере, начните с базового руководства по развертыванию веб-серверов на Linux, где описана установка полного стека LEMP с оптимизацией.

Эта среда станет надежным фундаментом для разработки и тестирования веб-приложений, максимально приближенным к условиям реального хостинга, что сократит количество ошибок при переносе кода на боевые серверы.

Поделиться:
Сохранить гайд? В закладки браузера