Ubuntu 18.04. Установка и настройка Apache2 + PHP-FPM 7.2. Запуск сайтов от разных пользователей

Задача: настроить Apache2 на работу с php-fpm по сокету, при этом php скрипты сайтов должны запускаться от своего пользователя.
Имеем сайт test1.local

Установка Apache

apt update
apt install apache2

Установка PHP-FPM

apt install php-fpm php-cli php-curl php-gd php-mysql php-mbstring php-xml php-zip

Включаем дополнительные модули

mpm_prefork заменяем на mpm_event

a2dismod autoindex mpm_prefork php7.2
a2enmod proxy_fcgi setenvif rewrite ssl mpm_event headers http2
a2enconf php7.2-fpm

Добавляем в автозапуск apache2 и php7.2-fpm

update-rc.d apache2 defaults
update-rc.d php7.2-fpm defaults

Создаём пользователя test1 и устанавливаем пароль

useradd --shell=/bin/date test1
passwd test1

Создание пула для php-fpm

Создаём пул для сайта test1.local
В каталоге /etc/php/7.2/fpm/pool.d/ создаём файл test1.conf

[test1]

;prefix = /path/to/pools/$pool

user = test1
group = test1

listen = /run/php/php-fpm-test1.sock

;listen.backlog = 511

listen.owner = www-data
listen.group = www-data
listen.mode = 0660

;listen.acl_users =
;listen.acl_groups =

;listen.allowed_clients = 127.0.0.1

pm = dynamic
pm.max_children = 10
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 2

;pm.process_idle_timeout = 10s;
pm.max_requests = 500
;pm.status_path = /status

;ping.path = /ping
;ping.response = pong
;access.log = log/$pool.access.log
;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
;slowlog = log/$pool.log.slow
;request_slowlog_timeout = 0
request_terminate_timeout = 30s
;rlimit_files = 1024
;rlimit_core = 0
;chroot =
;chdir = /var/www
;catch_workers_output = yes
;clear_env = no
;security.limit_extensions = .php .php3 .php4 .php5 .php7

;env[HOSTNAME] = $HOSTNAME
;env[PATH] = /usr/local/bin:/usr/bin:/bin
;env[TMP] = /tmp
;env[TMPDIR] = /tmp
;env[TEMP] = /tmp

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
php_admin_value[allow_url_fopen] = off
php_admin_value[open_basedir] = "/var/www/test1.local/:/tmp/"

где в квадратных скобках указывается название пула test1
user и group — имя пользователя test1
Т.к. под отдельным пользователем test1 запускаются только php скрипты, то все остальные запросы на статику будет обрабатывать apache, а он запускается от www-data. Apache обращается к сокету.
Поэтому права на сокет /run/php/php-fpm-test1.sock в переменных listen.owner и listen.group прописываем под www-data пользователя.
В этом же файле можно переопределить переменные из php.ini для данного сайта. Например изменить open_basedir:

php_admin_value[open_basedir] = "/var/www/test1.local/:/tmp/"

Режим создания дочерних процессов:

;       static   -       фиксированное число процессов (pm.max_children)
;       dynamic  -       процессы будут создаваться динамически в зависимости от нагрузки.
;                        всегда будет существовать хоть один процесс.
;                        pm.max_children - максимальное число процессов;
;                        pm.start_servers - количество процессов создаваемых при старте;
;                        pm.min_spare_servers - минимальное число простаивающих процессов;
;                        pm.max_spare_servers - максимальное число простаивающих процессов.
;       ondemand -       дочерние процессы не создаются при запуске, а только при обработке
;                        входящих соединений:
;                        pm.max_children - максимальное число процессов;
;                        pm.process_idle_timeout - время в секундах после чего простаивающий процесс будет удалён.
;                        pm.max_requests - количество обработаных запросов, после которых процессы php-fpm будут перезагружены

Apache файл конфигурации хоста test1.local
файл /etc/apache2/sites-enabled/test1.local.conf

<VirtualHost *:80>
	ServerName test1.local
	ServerAlias www.test1.local
	DocumentRoot /var/www/test1.local
 
	CustomLog ${APACHE_LOG_DIR}/test1.local.access.log combined
	ErrorLog ${APACHE_LOG_DIR}/test1.local.error.log
	ServerAdmin webmaster@test1.local
 
	<FilesMatch \.php$>
		SetHandler "proxy:unix:/run/php/php-fpm-test1.sock|fcgi://localhost"
	</FilesMatch>
</VirtualHost>

Если права на файлы сайта будут test1:test1, то чтобы Apache мог читать статику — добавляем пользователя www-data в группу пользователя test1

adduser www-data test1

Фикс безопасности
в файле /etc/php/7.2/fpm/php.ini

cgi.fix_pathinfo = 0

Проверка и перезапуск сервисов

apachectl configtest
service apache2 restart
service php7.2-fpm restart

https://www.8host.com/blog/razmeshhenie-neskolkix-sajtov-na-nginx-i-php-fpm-v-ubuntu-14-04/
http://php.net/manual/ru/install.fpm.configuration.php
http://php.net/manual/ru/configuration.changes.modes.php
http://php.net/manual/ru/configuration.file.per-user.php
http://php.net/manual/ru/ini.list.php
https://hcbogdan.com/php/2016/09/16/php-fpm-dynamic/