Доброго времени суток, уважаемые форумчане!
Имеем такой стенд:
ОС
Ubuntu 16.04 LTS,
Nginx
1.15 + PHP-FPM
7.x и тестовый сайт на
WordPress - «
my-wp.loc»
Имя пользователя и группа, от которого запускаю новый pool веб-сервера для тестируемого сайта, -
tester:testerВнимание: Указанный пользователь и группа должны быть зарегистрированными (существовать) в ОС!Сам веб-сервер работает от имени пользователя/группы -
www-data:www-data (эти значения заданы в его основном конфигурационном файле -
/etc/nginx/nginx.conf, т.к. первоначальная настройка Nginx проводилась согласно статьи -
https://interface31.ru/tech_it/2016/04/nginx-php-fpm-debian-ubuntu.html)
В качестве отправной точки для решения поставленной задачи была взята вот эта статья -
https://xakep.ru/2017/01/11/nginx-custom-config/Вся иная, изложенная тут ниже информация, - собиралась мной на просторах Интернета по кусочкам и калькулировалась.
«При использовании Nginx доступ разграничивают, создавая отдельные PHP-FPM-пулы для каждого пользователя. Процесс при этом запускается с правами конкретного пользователя, и он будет без проблем редактировать свои файлы в FTP-клиенте, не рискуя, что кто-то еще может к ним подобраться».1. Подключаем каталог с пулами в файле -
/etc/php/7.0/fpm/php-fpm.conf, раскоментировав строку (если она отсутствует, то добавляем):
include=/etc/php/7.0/fpm/pool.d/*.conf2. Переходим в каталог пулов:
cd /etc/php/7.0/fpm/pool.d/3. Копируем конфиг для нового пула:
sudo cp www.conf pool2.conf4. Редактируем конфиг нового пула:
sudo mcedit pool2.conf[pool2]listen = /var/run/php/php7.0-fpm-pool2.sock# /var/run/ - это символьная ссылка на /run/php/, поэтому можно указывать и так и так; Пользователь и группа, под которыми будет работать пулuser =
testergroup =
tester; По умолчанию сокет работает под теми же учетками, что указаны в user/group, nginx должен его читать
; Иногда нужно использовать другие учетные данные
; Также следует убедиться что веб-сервер (или любой другой процесс, которому необходима коммуникация) имеет доступ на чтение/запись в ваш сокет.
; Для этого существуют настройки listen.group и listen.mode
; Проще всего - запускать оба процесса от одного пользователя или группы.
; В нашем случае php-fpm и веб-сервер будет запущен с группой "www-data":listen.owner =
www-datalisten.group =
www-datalisten.mode =
0660; Включаем отдельный лог для данного пула:catch_workers_output = yes
php_admin_value[error_log] =
/home/tester/fpm-pool2/p2-error.logphp_admin_flag[log_errors] = on
; Под планируемую нагрузку проставляем количество процессовpm = dynamic
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 3
pm.max_spare_servers = 6
5. В файле виртуального хоста
«my-wp.loc.conf» изменяем сокет, после чего он будет выглядеть примерно так:
server {
listen 80;
server_name
my-wp.loc;
root /var/www/html/
my-wp/;
index index.php;
access_log /var/log/nginx/
my-wp.loc_access.log;
error_log /var/log/nginx/
my-wp.loc_error.log;
# Включение ЧПУ (Support Clean URLs (aka Search Engine Friendly)) location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
}
# Подключаем нужные шаблоны с новым UNIX-сокетомinclude /etc/nginx/templates/php-fpm-
pool2.conf;
include /etc/nginx/templates/phpmyadmin-
pool2.conf;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_pass unix:/var/run/php/php7.0-fpm-
pool2.sock;
}
}
# Отдельно слушаем домен с www и редиректим его на основнойserver {
listen 80;
server_name
www.my-wp.loc;
rewrite ^(.*)
http://my-wp.loc$1 permanent;
}
6. Содержимое шаблона
«php-fpm-pool2.conf» с новым Unix-сокетом:
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php/php7.0-fpm-
pool2.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
#Запрещаем обрабатывать htaccess-файлыlocation ~ /\.ht {
deny all;
}
#Настройка кэширования статического содержимогоlocation ~* \.(gif|jpeg|jpg|txt|png|tif|tiff|ico|jng|bmp|doc|pdf|rtf|xls|ppt|rar|rpm|swf|zip|bin|exe|dll|deb|cur)$ {
expires 168h;
}
#кэширование для скриптов и стилейlocation ~* \.(css|js)$ {
expires 180m;
}
7. Даем права доступа на сайт нашему пользователю (под которым работает новый
pool2), то есть -
tester:tester:
sudo chown -R tester:tester /var/www/html/my-wp/cd /var/www/html/my-wp/find . -type f -exec chmod 644 {} +
find . -type d -exec chmod 755 {} +8. Включаем сайт
sudo ln -s /etc/nginx/sites-available/my-wp.loc.conf /etc/nginx/sites-enabled/9. Чтобы протестировать внесенные новые настройки
PHP-FPM:
sudo php-fpm7.0 -t10. Тестируем корректность настройки самого Nginx:
sudo nginx -t11. Если тестирование прошло без ошибок, то перезапускаем PHP-FPM и Nginx:
sudo service php7.0-fpm restart ----------# или же
sudo systemctl restart php7.0-fpmsudo service nginx reload -----------# или же
sudo systemctl restart nginx12. Убеждаемся, что новый пул запущен правильно, запросив его процессы:
sudo ps aux |grep testerВ итоге новый пул заработал от пользователя
«tester» и вместе с ним тестируемый сайт
«my-wp.loc». Но, после проделанной работы у меня возник целый ряд вопросов.
1. Правильно ли я решил задачу (исходя из названия данной темы) или Вам знаком более оптимальный вариант? Если есть, то прошу подсказать «какой»?!
2. Безопасна ли указанная выше конфигурация для продакшн среды? Если нет, тогда прошу посильной помощи в "допиливании".
3. Нужно ли указывать в конфиге нового пула параметр
«chdir =»?! Если нужно, то какое будет его правильное значение?
4. Как протестировать, что все ошибки ново-созданного
«pool-а» пишутся в отдельный лог-файл (в данном случае -
"/home/tester/fpm-pool2/p2-error.log")? Может, есть какой-то скрипт для этого?!
5. Правильно ли я понимаю, что владельцем папки и отдельного лог-файла должен быть пользователь, от которого мы запускаем новый пул? Если нет, то кто?