Установка и настройка nginx + PHP в FreeBSD 14.1
Nginx это отличный веб-сервер по производительности и безопасности. Для совместной работы nginx с PHP используется интерфейс PHP-FPM (FastCGI Process Manager). В статье будет показана варианты установки nginx и PHP в операционную систему FreeBSD 14, разобраны основные параметры конфигурационных файлов nginx.conf, php-fpm.conf и создание пула PHP-FPM.
1. Установить nginx в FreeBSD
1.1. Версии и сборки nginx в FreeBSD
Порты и пакеты FreeBSD содержит несколько версий и сборок веб-сервера nginx
Имя пакета | Каталог порта | Описание пакета | Параметры сборки nginx |
---|---|---|---|
nginx | /usr/ports/www/nginx/ | Стабильная версия | Сборка по умолчанию как у порта nginx |
nginx-full | /usr/ports/www/nginx-full/ | Полная стабильная версия | Включено все, кроме поддержки HTTP/3, GSSAPI и нескольких модулей |
nginx-lite | /usr/ports/www/nginx-lite/ | Минимальная стабильная версия | Включено только: FILE_AIO, IPV6, THREADS, HTTP, HTTP_CACHE, HTTP_REALIP, HTTP_SSL. |
nginx-naxsi | /usr/ports/www/nginx-naxsi/ | Стабильной версии + NAXSI | Такая же, как пакет nginx плюс включенный модуль NAXSI |
nginx-devel | /usr/ports/www/nginx-devel/ | Версия разработчика (тестовая) | Сборка по умолчанию как у порта nginx-devel |
Все актуальные параметры сборки пакетов можно посмотреть в конфигурации портов этих пакетов, для это используем команду
cd /usr/ports/www/nginx/ && make showconfig
1.2. Установка nginx через пакеты
Для обычного веб-сервера будет достаточно пакета nginx-lite, если не нужна поддержка HTTP/2. Если нужна поддержка HTTP/2 и других модулей выбираем пакет nginx
Устанавливаем веб-сервер nginx
pkg install nginx
1.3. Установка nginx из портов
Устанавливаем веб-сервер nginx с нужными опциями
cd /usr/ports/www/nginx/ && make install clean
Изменяем параметры сборки веб-сервер nginx если необходимо, выключаем ненужные и включаем необходимые модули.
2. Настройка и конфигурация nginx (nginx.conf)
2.1. Минимальная конфигурация nginx для одного сайта
Открываем файл конфигурации nginx.conf в тестовом редакторе и настраиваем веб-сервер nginx
nano /usr/local/etc/nginx/nginx.conf
Настройка и конфигурации nginx будет показана с минимальными настройками и сразу под связку с PHP
# Основной файл конфигурации nginx + настройка PHP FastCGI
#user nobody;
worker_processes auto; # Количество запущенных процессов равное количеству ядер.
#error_log /var/log/nginx/error.log; # Лог ошибок.
#pid /var/run/nginx.pid; # PID файл.
events {
worker_connections 1024; # Количество подключений к одному процессу.
}
http {
include mime.types;
default_type application/octet-stream;
# Лог доступа
access_log off;
#access_log /var/log/nginx/access.log main;
gzip on; # Использовать сжатие.
sendfile on; # Использовать sendfile().
# Блоков server может быть неограниченное количество.
#
# Блок server для домена сайта localhost на 80 порту
server {
listen 80; # Порт сервера.
server_name localhost; # Домен сайта.
charset utf-8; # Кодировка сайта.
error_log /var/log/nginx/localhost.error.log; # Лог ошибок сайта.
access_log /var/log/nginx/localhost.access.log; # Лог доступа сайта.
# Путь до каталога сайта.
root /usr/local/www/;
# Обработка всех URI запросов начинающихся с /
location / {
#root /usr/local/www/; # Путь до сайта определен в блоке server выше.
index index.html index.php; # Файлы в качестве индекса.
}
# Настройка обработки php скриптов через PHP-FPM.
# Обработка всех URI запросов оканчивающихся на .php
location ~ \.php$ {
# пусть до UNIX-сокета, такое же указать в настройках пула PHP-FPM.
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
# Путь до php скриптов, $document_root - путь из параметра root (каталог сайта).
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
# Настройка блоков server для каждого сайта в отдельном файле конфигурации.
#include conf/*.conf;
}
В такой конфигурации будет возможен доступ к веб-серверу по IP адресу и домену localhost.
2.2. Конфигурация nginx для нескольких сайтов
Открываем файл конфигурации nginx.conf в тестовом редакторе и настраиваем веб-сервер nginx
nano /usr/local/etc/nginx/nginx.conf
Настройка и конфигурации nginx будет показана с настройками сервером по умолчанию, использованием отдельных файлов для конфигурации сайтов.
# Основной файл конфигурации nginx.conf
#user nobody;
worker_processes auto; # Количество запущенных процессов равное количеству ядер.
#error_log /var/log/nginx/error.log; # Лог ошибок.
#pid /var/run/nginx.pid; # PID файл.
events {
worker_connections 1024; # Количество подключений к одному процессу.
}
http {
include mime.types;
default_type application/octet-stream;
# Лог доступа
access_log off;
#access_log /var/log/nginx/access.log main;
gzip on; # Использовать сжатие.
sendfile on; # Использовать sendfile().
# Блоки server для запрета доступа по IP без адреса сайта.
# Сервер по умолчанию для HTTP
server {
listen 80 default_server; # 80 порта, cервер по умолчанию.
deny all; # Запретить доступ всем.
return 444; # Закрыть соединение без ответа.
}
# Сервер по умолчанию для HTTPS
server {
listen 443 ssl default_server; # 443 порта, cервер по умолчанию.
http2 on; # Разрешить использовать HTTP/2.
ssl_reject_handshake on; # Отклонить рукопожатие.
ssl_protocols TLSv1.3; # Использовать TLSv1.3 везде.
}
# Настройка блоков server для каждого сайта в отдельном файле конфигурации.
include conf/*.conf;
}
Подробнее о запрете доступа без адреса сайта: Запрет доступа по IP адресу к веб-серверу Nginx без указания домена сайта
Переходим в каталог конфигурационных файлов для сайтов
cd /usr/local/etc/nginx/conf/
Создаем файл конфигурации для сайта (notby.net в моем случае)
nano notby.net.conf
Конфигурационный файл для сайта будет выглядеть следующем образом
# Вместо домена notby.net указывай свой домен сайта.
# Блок server для домена notby.net через HTTP.
server {
listen 80; # Порт сервера.
server_name notby.net; # Домен сайта.
# Перенаправление всего трафика с http на https.
# Включить когда будет получен сертификат для сайта.
#location / {
# return 301 https://$host$request_uri;
#}
charset utf-8; # Кодировка сайта.
error_log /var/log/nginx/notby.net.error.log; # Лог ошибок сайта.
access_log /var/log/nginx/notby.net.access.log; # Лог доступа сайта.
# Путь до каталога сайта.
root /usr/local/www/notby.net/;
# Обработка всех URI запросов начинающихся с /
location / {
index index.php; # Файлы в качестве индекса.
}
# Настройка обработки php скриптов через PHP-FPM.
# Обработка всех URI запросов оканчивающихся на .php
location ~ \.php$ {
# пусть до UNIX-сокета, такое же указать в настройках пула PHP-FPM.
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
# Путь до php скриптов, $document_root - путь из параметра root (каталог сайта).
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
# Блок server для домена notby.net через HTTPS
# Настроить после получения сертификата для сайта.
#server {
# listen 443 ssl; # 443 порт, поддержка SSL.
# http2 on; # Использовать HTTP/2.
# server_name notby.net; # Домен сайта.
#
#}
В такой конфигурации будет возможен доступ к веб-серверу только по домену notby.net. Аналогично создаем для каждого веб-сайта свой файл конфигурации.
Как получить сертификат для сайта: Получение сертификата Let's Encrypt для HTTPS при помощи Certbot в FreeBSD 14
3. Установить PHP и его расширения
3.1. Установка PHP через пакеты
Производим поиск доступных версий пакетов для установки
pkg search ^php | grep 'PHP Scripting Language'
Выбираем поседению версию PHP (php83), если нет оснований устанавливать более старую версию.
Устанавливаем PHP 8.3 в FreeBSD
pkg install php83
Дожидаемся окончания установки.
Производим поиск расширений для установленной версии PHP (php83 – версия PHP 8.3)
pkg search ^php83 | grep 'extension'
Устанавливаем необходимые расширения PHP, например php83-ctype, php83-mbstring, php83-mysqli
pkg install php83-ctype php83-mbstring php83-mysqli
Или можно установить пакет с базовыми, популярными расширения PHP
pkg install php83-extensions
3.2. Установка PHP из портов
Производим поиск доступных версий PHP для установки из портов
ls -lh /usr/ports/lang/ | grep php
Были выведены доступные версии PHP и каталоги для установки расширений PHP.
Выбираем поседению версию PHP (php83) и переходим в каталог порта php83
cd /usr/ports/lang/php83/
Устанавливаем PHP 8.3 в FreeBSD
make install clean
Для работы в связке с nginx, параметр FPM обязателен для сборки PHP.
Дожидаемся окончания сборки и установки.
Переходим в каталог расширений для установленной версии PHP (php83-extensions – расширения для PHP 8.3)
cd /usr/ports/lang/php83-extensions/
Устанавливаем расширения PHP в FreeBSD
make install clean
Выбираем необходимые расширения которые будут собраны и установлены.
4. Настройка и конфигурация PHP
4.1. Файл конфигурации php.ini
После установки PHP, в каталоге конфигураций /usr/local/etc/ содержатся два примера конфигурации php.ini-production и php.ini-development. Версия production используется для рабочих сайтов, в ней ошибки только записываются в лог файлы веб-сервера. Версия development используется при разработке, в ней ошибки выводятся на веб-страницу и записываются в лог файлы.
Переходим в каталог где находятся конфигурационные файлы
cd /usr/local/etc/
Копируем файл php.ini-production или php.ini-development в php.ini (это основной файл конфигурации PHP)
cp php.ini-production php.ini
Открываем конфигурационный файл php.ini и вносим изменения в параметры, если это необходимо
nano /usr/local/etc/php.ini
Описание всех параметров с переводом конфигурационного файла php.ini есть на официальном сайте PHP.
4.2. Конфигурация PHP-FPM (php-fpm.conf)
Основной файл конфигурации PHP-FPM находится по адресу /usr/local/etc/php-fpm.conf
Открываем файл конфигурации php-fpm.conf
nano /usr/local/etc/php-fpm.conf
Вносить изменения в файл php-fpm.conf необязательно, все и так заработает. Разве что можно изменить путь до лог-файла и настроить уровень логирования.
Описание и перевод параметров файла конфигурации php-fpm.conf
;;;;;;;;;;;;;;;;;;;;
; FPM Конфигурация ;
;;;;;;;;;;;;;;;;;;;;
; Все относительные пути в этом файле конфигурации относятся к
; префиксу установки PHP (/usr/local). Этот префикс может быть
; динамически изменен с помощью аргумента '-p' в командной строке.
;;;;;;;;;;;;;;;;;;;;;;;;
; Глобальный параметры ;
;;;;;;;;;;;;;;;;;;;;;;;;
[global]
; Путь к PID-файлу.
; Значение по умолчанию: не установлено
pid = /var/run/php-fpm.pid
; Путь к лог-файла ошибок. По умолчанию используется префикс /var
; Значение по умолчанию: log/php-fpm.log
;error_log = log/php-fpm.log
; Тип программы который будет логировать сообщения.
; Значение по умолчанию: daemon
;syslog.facility = daemon
; Добавление syslog_ident к каждому сообщению.
; Значение по умолчанию: php-fpm
;syslog.ident = php-fpm
; Уровень журналирования ошибок.
; Доступные значения: alert, error, warning, notice, debug
; Значение по умолчанию: notice. Устанавливаем уровень warning.
log_level = warning
; Количество символов в одной строке журнала ошибок.
; Если символов больше, строга разбивается на несколько строк.
; Значение по умолчанию: 1024
;log_limit = 4096
; Буферизация строки журнала.
; Если значение no, данные записываются напрямую в дескриптор файла.
; Значение по умолчанию: yes
;log_buffering = no
; Количество необходимых процессов для перезагрузки FPM, если они были
; завершены с SIGSEGV или SIGBUS в течение интервала времени,
; заданного параметром emergency_restart_interval
; Значение по умолчанию: 0 (отключено)
;emergency_restart_threshold = 0
; Интервал времени, используемый параметром emergency_restart_interval,
; чтобы определить, когда FPM будет мягко перезагружен.
; Доступные значения: s(секунды), m(минуты), h(часы), d(дни)
; Значение по умолчанию: 0 (отключено)
;emergency_restart_interval = 0
; Время, в течение которого дочерние процессы ждут ответа на сигналы мастер-процессу.
; Доступные значения: s(секунды), m(минуты), h(часы), d(дни)
; Значение по умолчанию: 0
;process_control_timeout = 0
; Максимальное количество процессов которое может создать FPM.
; Значение по умолчанию: 0 (без ограничений)
; process.max = 128
; Приоритет nice для работающего процесса FPM.
; Работает только если главный процесс FPM запускается от root.
; Доступные значения: от -19 (максимальный приоритет) до 20 (минимальный приоритет)
; Значение по умолчанию: не установлено
; process.priority = -19
; Запускать FPM в фоновом режиме. Для отладки (debugging) установить значение 'no'.
; Значение по умолчанию: yes
;daemonize = yes
; Ограничение rlimit дескриптора открытого файла для главного процесса.
; Значение по умолчанию: определяется системой
;rlimit_files = 1024
; Максимального размера ядра rlimit для главного процесса.
; Значение по умолчанию: определяется системой
;rlimit_core = 0
; Механизм событий, который будет использовать FPM. Доступные значения:
; - select (any POSIX os)
; - poll (any POSIX os)
; - epoll (linux >= 2.5.44)
; - kqueue (FreeBSD >= 4.1, OpenBSD >= 2.9, NetBSD >= 2.0)
; - /dev/poll (Solaris >= 7)
; - port (Solaris >= 10)
; Значение по умолчанию: не установлено (автоопределение)
;events.mechanism = kqueue
; Интервал в секундах между отправкой уведомления об отчете о работоспособности
; в systemd, eсли FPM построен с интеграцией systemd.
; Доступные значения: 0(отключено), s(секунды), m(минуты), h(часы).
; Значение по умолчанию: 10
;systemd_interval = 10
;;;;;;;;;;;;;;;;;;;;;
; Определение пулов ;
;;;;;;;;;;;;;;;;;;;;;
; Пулы дочерних процессов FPM могут быть запущены с различными права доступа
; и различными настройками, для "изолирование" сайтов друг от друга.
; Настройка основного пула в следующим разделе статьи.
; Каталог конфигурационных файлов пулов для включения в файл конфигурации.
include=/usr/local/etc/php-fpm.d/*.conf
Вносим изменения и сохраняем файл.
4.3. Конфигурация пула PHP-FPM
Файлы конфигурации пулов находятся в каталоге /usr/local/etc/php-fpm.d/ и там по умолчанию находится файл конфигурации www.conf основного пула.
Для каждого сайта можно настроить отдельные пулы с разграничением прав доступа. Я покажу настройка основного пула FPM с запуском от пользователя www.
Открываем файл настройки пула PHP-FPM
nano /usr/local/etc/php-fpm.d/www.conf
Описание необходимых и обязательных параметров настройки пула для работы PHP-FPM
; Имя пула с именем 'www'. Переменная $pool может использована
; в любом месте и будет иметь значение www.
[www]
; Префикс для пула. Значение применима к параметрам:
; 'access.log','slowlog','listen' (unixsocket),'chroot',
; 'chdir','php_values','php_admin_values'.
; Если значение не установлено, вместо него применяется глобальный префикс (или /usr/local).
; Значение по умолчанию: не установлено
;prefix = /path/to/pools/$pool
; От кого запускать процесс пула.
; Если группа не указана, используется группа пользователя.
user = www
group = www
; IP-адрес:порт или UNIX-сокет который использует процесс пула.
; Возможные варианты параметра:
; 0.0.0.0:9000 - слушать все IPv4 по 9000 порту;
; 127.0.0.1:9000 - слушать 127.0.0.1 по 9000 порту;
; 9000 - слушать все адреса (IPv4 и IPv6) по 9000 порту;
; /var/run/php-fpm.sock - использовать UNIX-сокет.
listen = /var/run/php-fpm.sock
; Set listen(2) backlog.
; Значение по умолчанию: 511 (-1 on Linux, FreeBSD and OpenBSD)
;listen.backlog = 511
; Права доступа для unix-сокета, если он используется.
; Значение по умолчанию: Пользователь (root) главного процесса с правами 0660.
; Указываем пользователя и группы от которого запускается nginx.
listen.owner = www
listen.group = www
listen.mode = 0660
; Список управления доступом (ACL) POSIX
;listen.acl_users =
;listen.acl_groups =
; Список IP с которых можно подключатся используя TCP. Для UNIX-сокетов неактуально.
; Значение по умолчанию: любой
;listen.allowed_clients = 127.0.0.1
; Установите ассоциированную таблицу маршрутов (FIB). Только для FreeBSD.
; Значение по умолчанию: -1
;listen.setfib = 1
; Приоритет nice для процесса пула FPM.
; Доступные значения: от -19 (максимальный приоритет) до 20 (минимальный приоритет)
; Значение по умолчанию: не установлено
; process.priority = -19
; Создание дампа ядра процесса пула.
; Значение по умолчанию: no
; process.dumpable = yes
; Выбор, как менеджер процессов будет контролировать количество дочерних процессов.
; Возможные значения:
; static - фиксированное количество дочерних процессов указанных в параметре pm.max_children;
; dynamic - количество дочерних процессов в зависимости от нагрузки, всегда остается один процесс.
; Для настройки используются параметры: pm.max_children, pm.start_servers,
; pm.min_spare_servers, pm.max_spare_servers, pm.max_spawn_rate;
; ondemand - дочернии процессы не создаются пока не будет запроса.
; Для настройки используются параметры: pm.max_children, pm.process_idle_timeout.
pm = dynamic
; Максимальное количество дочерних процессов.
pm.max_children = 5
; Количество дочерних процессов при запуске (только для 'dynamic').
; Значение по умолчанию: (min_spare_servers + max_spare_servers) / 2
pm.start_servers = 2
; Минимальное количество простаивающих процессов. (только для 'dynamic').
; Параметр обязателен для 'dynamic'.
pm.min_spare_servers = 1
; Максимальное количество простаивающих процессов. (только для 'dynamic').
; Параметр обязателен для 'dynamic'.
pm.max_spare_servers = 3
; Количество одновременно созданных дочерних процессов. (только для 'dynamic').
; Значение по умолчанию: 32
;pm.max_spawn_rate = 32
; Количество секунд, по истечении которых простаивающий процесс будет завершен (только для 'ondemand').
; Значение по умолчанию: 10s
;pm.process_idle_timeout = 10s;
; Количество запросов, после чего дочерний процесс будет перезагружен.
; Значение по умолчанию: 0 (бесконечно)
;pm.max_requests = 500
; URL-адрес страницы статистики FPM. Если неуказанно, статистики нет.
; Значение по умолчанию: не установлено
;pm.status_path = /status
; IP-адрес:порт или UNIX-сокет который использует для статистики FPM.
; Значение по умолчанию: значение параметра 'listen'
;pm.status_listen = 127.0.0.1:9001
; URI-адрес для вызова страницы мониторинга FPM. Если неуказанно, страницы нет.
; Значение по умолчанию: не установлено
;ping.path = /ping
; Ответа на запрос ping
; Значение по умолчанию: pong
;ping.response = pong
; Путь к лог-файла доступа.
; Значение по умолчанию: не установлено
;access.log = log/$pool.access.log
; Формат лога доступа
; Значение по умолчанию: "%R - %u %t \"%m %r\" %s"
;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{milli}d %{kilo}M %C%%"
; Список значений request_uri, которые должны быть отфильтрованы из журнала доступа.
; Значение по умолчанию: не установлено
;access.suppress_path[] = /ping
;access.suppress_path[] = /health_check.php
; Файл журнала медленных запросов.
; Значение по умолчанию: не установлено
slowlog = /var/log/php-fpm.log.slow
; Если запрос выполнялся дольше указано времени, он будет записан в лог slowlog.
; Доступные значения: s(секунды), m(минуты), h(часы), d(дни)
; Значение по умолчанию: 0 (лог не ведется)
request_slowlog_timeout = 3s
; Глубина трассировки стека журнала slowlog.
; Значение по умолчанию: 20
;request_slowlog_trace_depth = 20
; Таймаут для обслуживания одного запроса, после которого рабочий процесс будет завершен.
; Доступные значения: s(секунды), m(минуты), h(часы), d(дни)
; Значение по умолчанию: 0 (выключено)
;request_terminate_timeout = 0
; Таймаут, установленный в параметре 'request_terminate_timeout', не включается после
; вызова приложением 'fastcgi_finish_request' или когда приложение завершило работу.
; Эта опция позволит запустить таймаута даже в таких случаях.
; Default Value: no
;request_terminate_timeout_track_finished = no
; Ограничение rlimit дескриптора открытого файла.
; Значение по умолчанию: определяется системой
;rlimit_files = 1024
; Максимального размера ядра rlimit.
; Значение по умолчанию: определяется системой
;rlimit_core = 0
; Chroot для каталога при запуске пула.
;chroot =
; Перейти в каталог после запускаю.
; Значение по умолчанию: текущий каталог или / при chroot
;chdir = /var/www
; Перенаправление STDOUT и STDERR рабочего процесса в главный лог ошибок.
; Значение по умолчанию: no
;catch_workers_output = yes
; Украшение вывода префиксом дочернего процесса (только если catch_workers_output = yes).
; Значение по умолчанию: yes
;decorate_workers_output = no
; Предотвращает попадание произвольных переменных окружения в рабочие процессы FPM.
; Установка значения "no" сделает все переменные окружения доступными для PHP-кода через getenv(), $_ENV и $_SERVER.
; Значение по умолчанию: yes
;clear_env = no
; Файлы с каким расширениями разбирает и выполняет PHP-FPM.
; Значение по умолчанию: .php
;security.limit_extensions = .php .php3 .php4 .php5 .php7
; Передача переменных окружения.
; Значение по умолчанию: clean env
;env[HOSTNAME] = $HOSTNAME
;env[PATH] = /usr/local/bin:/usr/bin:/bin
;env[TMP] = /tmp
;env[TMPDIR] = /tmp
;env[TEMP] = /tmp
; Дополнительные параметры php.ini, специфичные для данного пула FPM.
; Значение по умолчанию: ничего не определено, кроме значений в php.ini
;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
;php_flag[display_errors] = off
;php_admin_value[error_log] = /var/log/fpm-php.www.log
;php_admin_flag[log_errors] = on
;php_admin_value[memory_limit] = 32M
Вносим необходимые изменения и сохраняем файл.
5. Автозагрузка и запуск nginx + PHP-FPM
Добавляем в автозагрузку nginx
sysrc nginx_enable="YES"
Добавляем в автозагрузку PHP-FPM
sysrc php_fpm_enable="YES"
Или вручную открываем файл /etc/rc.conf и добавляем строки
nano /etc/rc.conf
# Web-server nginx + PHP
nginx_enable="YES"
php_fpm_enable="YES"
Теперь веб-сервер (nginx + PHP) будет загружатся при старте системы.
Запускаем PHP-FPM
service php_fpm start
Запускаем nginx
service nginx start
6. Проверка nginx и PHP
Создаем в каталоге /usr/local/www/ файл index.php
cd /usr/local/www/
nano index.php
следующего содержимого
<?php
phpinfo();
?>
Открываем браузер, вводим IP адрес сервера FreeBSD в адресную строку и нажимаем Enter
Будет выведена информация о PHP.
Также можно проверить с сервера через терминал используя утилита cURL, если она установлена
curl localhost
Если что-то не работает, смотрим журналы ошибок. Логи nginx находятся по умолчанию в каталоге /var/log/nginx/
cd /var/log/nginx/
Логи PHP-FPM по умолчанию находятся в файле /var/log/php-fpm.log
cat /var/log/php-fpm.log