notby.NET Logo

Установка и настройка 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
FreeBSD установка пакета nginx командой "pkg install nginx", веб-сервер успешно установлен

1.3. Установка nginx из портов

Устанавливаем веб-сервер nginx с нужными опциями

cd /usr/ports/www/nginx/ && make install clean
FreeBSD конфигурация сборки порта 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'
FreeBSD поиск доступных пакетов PHP командой [pkg search ^php | grep 'PHP Scripting Language'], найдены пакеты php81, php82, php83

Выбираем поседению версию PHP (php83), если нет оснований устанавливать более старую версию.

Устанавливаем PHP 8.3 в FreeBSD

pkg install php83
FreeBSD установка пакета php83 командой "pkg install php83", PHP 8.3 успешно установлен

Дожидаемся окончания установки.

Производим поиск расширений для установленной версии PHP (php83 – версия PHP 8.3)

pkg search ^php83 | grep 'extension'
FreeBSD, Поиск доступных расширений PHP командой [pkg search ^php83 | grep 'extension'], выведен список расширений PHP 8.3

Устанавливаем необходимые расширения PHP, например php83-ctype, php83-mbstring, php83-mysqli

pkg install php83-ctype php83-mbstring php83-mysqli

Или можно установить пакет с базовыми, популярными расширения PHP

pkg install php83-extensions
FreeBSD установка пакета php83-extensions командой "pkg install php83-extensions", список расширений PHP 8.3 в пакете

3.2. Установка PHP из портов

Производим поиск доступных версий PHP для установки из портов

ls -lh /usr/ports/lang/ | grep php
Вывод каталогов с именем php в каталоге /usr/ports/lang/ командой "ls -lh /usr/ports/lang/ | grep php" в FreeBSD

Были выведены доступные версии PHP и каталоги для установки расширений PHP.

Выбираем поседению версию PHP (php83) и переходим в каталог порта php83

cd /usr/ports/lang/php83/

Устанавливаем PHP 8.3 в FreeBSD

make install clean

Для работы в связке с nginx, параметр FPM обязателен для сборки PHP.

Выбор параметров сборки порта php83 (PHP 8.3) в FreeBSD, CGI и CLI не выбрано, FPM выбрано

Дожидаемся окончания сборки и установки.

Переходим в каталог расширений для установленной версии PHP (php83-extensions – расширения для PHP 8.3)

cd /usr/ports/lang/php83-extensions/

Устанавливаем расширения PHP в FreeBSD

make install clean
Выбор параметров сборки порта php83-extensions (расширения для PHP 8.3) в FreeBSD

Выбираем необходимые расширения которые будут собраны и установлены.

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

Открыта в браузере страница для проверки веб-сервера. На странице успешно выведено phpinfo. PHP версии 8.3.3 работает в FreeBSD 14.

Будет выведена информация о 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