Гид по технологиям

Настройка Nginx Server Blocks (виртуальных хостов) на FEMP в FreeBSD 12.0

• 6 min read • Системное администрирование • Обновлено 23 Nov 2025
Nginx Server Blocks на FEMP в FreeBSD 12.0
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.

Структура каталогов конфигурации Nginx с включением vhost

Шаг 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.

Пример базового виртуального хоста в браузере

Тестовая страница site1

PHP info для site1

Шаг 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.html

index.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.

SSL виртуальный хост успешно создан

HTTPS страница site2

PHP info для site2

Советы по отладке

  • Всегда сначала проверяйте конфигурацию: 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 удобнее при разделении на контейнеры/серверы.

Короткая методология внедрения

  1. Создать каталог vhost и подключить его.
  2. Создать базовый конфиг server { listen 80 … }.
  3. Создать document root и тестовые файлы.
  4. Проверить nginx -t, перезапустить сервис.
  5. Для HTTPS: подготовить сертификаты, добавить секцию listen 443 и параметры ssl, проверить и перезапустить.
  6. Мониторинг логов и тестирование.

Совместимость и заметки по миграции

  • Команды 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 только после тестирования.

Дополнительные ссылки

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро