Установка и настройка nginx + PHP в FreeBSD 14
Nginx это отличный веб-сервер по производительности и безопасности. Для совместной работы nginx с PHP используется интерфейс PHP-FPM (FastCGI Process Manager). В статье будет показана варианты установки nginx и PHP в операционную систему FreeBSD, разобраны основные параметры конфигурационных файлов 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/ | Полная стабильная версия | Включено все, кроме поддержки HTTP3, 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, если не нужна поддержка HTTP2. Если нужна поддержка HTTP2 и других модулей выбираем пакет nginx
Устанавливаем веб-сервер nginx
pkg install nginx
1.3. Установка nginx из портов
Устанавливаем веб-сервер nginx с нужными опциями
cd /usr/ports/www/nginx/ && make install clean
Изменяем параметры сборки веб-сервер nginx если необходимо, выключаем ненужные и включаем необходимые модули.
2. Настройка и конфигурация nginx (nginx.conf)
Открываем файл конфигурации 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;
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 по всем IP на 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/; # root определена в разделе 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;
}
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%%"
; A list of request_uri values which should be filtered from the access log.
;
; As a security precuation, this setting will be ignored if:
; - the request method is not GET or HEAD; or
; - there is a request body; or
; - there are query parameters; or
; - the response code is outwith the successful range of 200 to 299
;
; Note: The paths are matched against the output of the access.format tag "%r".
; On common configurations, this may look more like SCRIPT_NAME than the
; expected pre-rewrite 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