Настройка Nginx Server Blocks (виртуальных хостов) на FEMP в FreeBSD 12.0
В этой статье показано, как создать и подключить Server Blocks (виртуальные хосты) Nginx в окружении FEMP на FreeBSD 12.0: инициализация каталога vhost, создание простого сайта, добавление SSL с использованием локальных сертификатов. Приведены команды, пример конфигураций, советы по отладке и рекомендации по безопасности.
Важно: Server Blocks — это термин Nginx, эквивалентный «Virtual Host» в Apache. На FreeBSD команды управления сервисом выполняются через service.
Что такое Server Block и когда он нужен
Server Block — это отдельная секция конфигурации Nginx, которая связывает набор доменных имён и портов с корневой папкой сайта и правилами обработки запросов. Используйте Server Blocks, когда нужно:
- Хостить несколько сайтов на одном сервере (виртуальные хосты).
- Разделить логи и правила кэширования по доменам.
- Включить SSL/TLS для отдельных доменов.
Краткое определение: Server Block — файл конфигурации Nginx, который содержит server { … } секцию для конкретного домена.
Предварительные требования
- FreeBSD 12.0 с установленным FEMP Stack (FreeBSD + Nginx + MariaDB/MySQL + PHP-FPM). Если стек не установлен, установите его перед выполнением инструкций.
- Доступ root или sudo для выполнения команд и перезапуска сервисов.
- Для HTTPS — SSL-сертификаты (локальные или от центра сертификации).
Ссылки для справки:
План работ
- Инициализировать каталог конфигураций виртуальных хостов
- Создать базовый Server Block (HTTP)
- Создать Server Block с SSL (HTTPS)
- Проверить конфигурацию, перезапустить Nginx
- Советы по отладке и безопасности
Шаг 1 — Инициализация каталога виртуальных хостов
Создаём каталог для отдельных файлов конфигурации виртуальных хостов. Это облегчает управление и позволяет хранить каждую конфигурацию в отдельном файле.
Перейдите в каталог Nginx и создайте папку vhost:
cd /usr/local/etc/nginx
mkdir -p vhost/Откройте основной конфиг nginx.conf (например, через vim) и добавьте включение каталога vhost внутри блока http:
vim nginx.confВнутри блока http { … } добавьте строку:
http {
...
include vhost/*.conf;
...
}Сохраните, затем проверьте конфигурацию:
nginx -tЕсли ошибок нет, можно переходить к созданию отдельных Server Blocks.

Шаг 2 — Создание базового Server Block (HTTP)
В этом разделе создаём простую конфигурацию для домена site1.hakase-labs.io с корневой папкой /usr/local/www/site1.
Перейдите в каталог виртуальных хостов и создайте файл конфигурации:
cd /usr/local/etc/nginx/vhost/
vim site1.hakase-labs.confВставьте следующую конфигурацию (замените домен и пути на свои при необходимости):
server {
listen 80;
server_name site1.hakase-labs.io;
error_log /var/log/nginx/site1-error.log;
access_log /var/log/nginx/site1-access.log;
root /usr/local/www/site1;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/local/www/site1;
}
location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ {
access_log off;
expires max;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
include fastcgi_params;
}
}Создайте корневую папку и простые тестовые файлы:
cd /usr/local/www/
mkdir -p site1
vim site1/index.htmlСодержимое index.html:
site1.hakase-labs.io
Создайте тестовый PHP-файл:
vim site1/info.phpСодержимое info.php:
site1.hakase-labs.io
Проверьте конфигурацию и перезапустите службу Nginx:
nginx -t
service nginx restartОткройте в браузере http://site1.hakase-labs.io/ и http://site1.hakase-labs.io/info.php для проверки работы статических страниц и PHP-FPM.



Шаг 3 — Создание Server Block с SSL включённым
Для HTTPS вам понадобятся SSL-сертификаты (файлы .pem или .crt/.key). В примере мы копируем готовые .pem в каталог /usr/local/etc/ssl.
Скопируйте файлы сертификатов на сервер и разместите их:
cp *.pem /usr/local/etc/ssl/
Создайте новый файл конфигурации для site2:
cd /usr/local/etc/nginx/vhost/
vim site2.hakase-labs.confПример конфигурации с принудительным редиректом на HTTPS и настройками TLS (замените пути и домен):
server {
listen 80;
server_name site2.hakase-labs.io;
rewrite ^(.*) https://$server_name$1 permanent;
}
server {
listen 443;
server_name site2.hakase-labs.io;
root /usr/local/www/site2;
index index.html index.htm index.php;
error_log /var/log/nginx/site2-error.log;
access_log /var/log/nginx/site2-access.log;
ssl on;
ssl_certificate /usr/local/etc/ssl/fullchain.pem;
ssl_certificate_key /usr/local/etc/ssl/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_prefer_server_ciphers on;
location / {
try_files $uri $uri/ =404;
}
location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ {
access_log off;
expires max;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
include fastcgi_params;
}
}Создайте корневой каталог и тестовые файлы для site2:
mkdir -p /usr/local/www/site2/
cd /usr/local/www/site2/
vim index.htmlindex.html:
site2.hakase-labs.io
info.php:
site2.hakase-labs.io
Проверьте и перезапустите Nginx:
nginx -t
service nginx restartТеперь при обращении по http://site2.hakase-labs.io вы будете перенаправлены на HTTPS и увидите страницу index.html. Также доступен /info.php для теста PHP-FPM.



Советы по отладке
- Всегда сначала проверяйте конфигурацию: nginx -t
- Просматривайте логи ошибок: tail -f /var/log/nginx/site1-error.log
- Если PHP не обрабатывается, проверьте socket php-fpm: ls -l /var/run/php-fpm.sock и проверьте, что php-fpm запущен
- Убедитесь, что права доступа к папкам и файлам корректны (nginx должен иметь доступ к document root)
- Если редирект на HTTPS не работает, убедитесь, что первая секция server с listen 80 присутствует и не перекрывается другим server_name
Безопасность и рекомендации по TLS
- Отключите старые протоколы (SSLv3, TLSv1.0, TLSv1.1). Оставьте TLSv1.2 и TLSv1.3.
- Используйте сильные шифры и включите HSTS при поднятом HTTPS (включайте HSTS только после тестирования):
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;- Храните приватные ключи в защищённом каталоге с правами 600 и владельцем root.
- Регулярно обновляйте сертификаты и автоматизируйте их обновление (например, с помощью ACME-клиентов для Let’s Encrypt).
Разрешения и безопасность файлов
- Document root: обычно владелец root, группа www (или аналогичная), права 755 на каталоги и 644 на файлы.
- Сокет php-fpm: убедитесь, что nginx может читать/писать в сокет (или используйте unix socket с корректными правами или TCP-адрес).
Частые ошибки и решения
- nginx -t выдаёт “duplicate bind” — проверьте, не используются ли одинаковые listen/директивы в разных файлах с одинаковым server_name.
- 502 Bad Gateway при обращении к PHP — проверьте, запущен ли php-fpm и совпадает ли путь unix сокета в fastcgi_pass.
- Сертификат не применяется — проверьте правильность путей ssl_certificate и ssl_certificate_key; nginx должен иметь доступ к файлам.
Критерии приёмки
- Nginx конфигурация проходит проверку: nginx -t без ошибок.
- При обращении к http://site1.example/ — возвращается index.html сайта.
- При обращении к http://site2.example/ — происходит редирект на https и успешно открыт index.html.
- /info.php возвращает корректную страницу phpinfo() (если тестируете PHP).
Контрольный чек-лист для разных ролей
Администратор системы:
- Создал каталог /usr/local/etc/nginx/vhost
- Добавил include vhost/*.conf в nginx.conf
- Проверил nginx -t и перезапустил сервис
Разработчик сайта:
- Проверил доступность document root
- Загрузил index.html и info.php
- Тестировал PHP через phpinfo()
DevOps/Безопасность:
- Настроил SSL и подтвердил корректность цепочки сертификатов
- Включил современные TLS-протоколы и шифры
- Настроил ротацию логов и мониторинг
Альтернативные подходы
- Вместо unix-сокета можно использовать fastcgi_pass 127.0.0.1:9000 при необходимости сетевого подключения к PHP-FPM.
- Для автоматической выдачи сертификатов используйте Certbot или acme.sh и настраивайте автоматическое обновление и перезагрузку Nginx.
- Для больших проектов используйте отдельный балансировщик или обратный прокси с разделением нагрузки.
Модель принятия решений (коротко)
- Нужен ли отдельный файл конфигурации? Да, если проект отдельный сайт или домен.
- Нужен ли SSL? Всегда для публичных сайтов. Для локальной разработки можно временно без SSL.
- Socket или TCP для PHP-FPM? Socket проще и быстрее на одном хосте; TCP удобнее при разделении на контейнеры/серверы.
Короткая методология внедрения
- Создать каталог vhost и подключить его.
- Создать базовый конфиг server { listen 80 … }.
- Создать document root и тестовые файлы.
- Проверить nginx -t, перезапустить сервис.
- Для HTTPS: подготовить сертификаты, добавить секцию listen 443 и параметры ssl, проверить и перезапустить.
- Мониторинг логов и тестирование.
Совместимость и заметки по миграции
- Команды service используются в FreeBSD; на системах systemd (Linux) применяются systemctl.
- Пути к конфигам и документам в FreeBSD стандартно расположены в /usr/local/etc/nginx и /usr/local/www.
- Если переносите конфиг с Apache — обратите внимание на синтаксис (VirtualHost -> server block, директивы отличаются).
Резюме
- Server Blocks позволяют хостить несколько сайтов на одном экземпляре Nginx.
- На FreeBSD с FEMP создайте каталог vhost, храните конфиги отдельно и проверяйте nginx -t перед перезапуском.
- Для HTTPS подготовьте сертификаты, включите современные протоколы TLS и настройте HSTS только после тестирования.
Дополнительные ссылки
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента