Skip to main content

Запуск сайтов от разных пользователей в связке nginx + php-fpm

По умолчанию все сайты будут запускаться от пользователя, указанного в настройках php-fpm. Чтобы запускать сайты от разных пользователей, необходимо создать отдельные конфигурационные файлы в директории /etc/php5/fpm/pool.d, убедившись при этом, что в файле /etc/php5/fpm/php-fpm.conf указана строчка:

include=/etc/php5/fpm/pool.d/*.conf

Теперь создаем файл конфигурации для нашего сайта (покажу на примере neblog.info) /etc/php5/fpm/pool.d/beroot.su.conf:

[neblog.info]
listen = /var/run/php5-neblog.info.sock
listen.mode = 0666
user = neblog
group = neblog
chdir = /home/www/sites/neblog.info

php_admin_value[upload_tmp_dir] = /home/www/sites/neblog.info/tmp
php_admin_value[soap.wsdl_cache_dir] = /home/www/sites/neblog.info/tmp
php_admin_value[date.timezone] = Europe/Moscow
php_admin_value[upload_max_filesize] = 100M
php_admin_value[post_max_size] = 100M
php_admin_value[open_basedir] = "/home/www/sites/neblog.info/"
php_admin_value[session.save_path] = /home/www/sites/neblog.info/tmp
php_admin_value[disable_functions] = exec,passthru,shell_exec,system,proc_open,popen,curl_multi_exec,parse_ini_file,show_source
php_admin_value[cgi.fix_pathinfo] = 0
php_admin_value[apc.cache_by_default] = 0

# В зависимости от нагрузки меняем параметры
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 4

В файле настроек /etc/nginx/sites-available/neblog.info.conf указываем сокет:

upstream neblog {server unix:/var/run/php5-neblog.info.sock;}

server {
        listen 80;
        server_name neblog.info www.neblog.info;
...
location ~ \.php$
        {
                include fastcgi.conf;
                fastcgi_intercept_errors on;
                fastcgi_pass neblog.info;
        }
...
}

Перезапускаем php-fpm и nginx:

sudo /etc/init.d/php5-fpm restart
sudo /etc/init.d/nginx restart

Теперь сайт будет запускаться от указанного пользователя.

17 комментариев к записи “Запуск сайтов от разных пользователей в связке nginx + php-fpm

    1. Конкретизируйте, что именно не работает. Здесь привязки к дистрибутиву вообще нет, так что, скорее всего, Вы что-то не так делаете.

      P.S. Проверил, у меня на одном из серверов стоит Ubuntu 14.04.4 LTS и там всё прекрасно работает.

  1. Вместо user мой пользователь ну и вместо site мой сайт.
    Настроил таким образом:
    1. vi /etc/php5/fpm/pool.d/site.conf

    [site]
    user = user
    group = user
    listen = /var/run/php5-fpm-site.sock
    listen.owner = www-data
    listen.group = www-data
    pm = dynamic
    pm.max_children = 5
    pm.start_servers = 2
    pm.min_spare_servers = 1
    pm.max_spare_servers = 3
    chdir = /

    2. service php5-fpm restart

    Проверка или появился новый pool
    3. ps aux |grep user

    4. vi /etc/php5/fpm/conf.d/05-opcache.ini
    В целях безопасности отключаем кэширование:
    opcache.enable=0
    5. service php5-fpm restart

    6. vi /etc/nginx/sites-available/site

    location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm-site.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }

    7. service nginx restart

    Таким образом удалось настроить запуск сайта от другого пользователя на Ubuntu 14.04

    1. Вы так и не описали суть проблемы, что конкретно не получилось настроить по приведенному мануалу?
      В Вашем примере я вижу добавленные директивы:

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

      А также не понятно зачем chdir, установленный в корень.

  2. Поправил chdir :
    /var/www/site/user/public_html

    В суть проблемы я не вникал просто настроил по другому ману и все заработало, спасибо что откликнулись )

  3. А собственно в каком месте мы запускаем сайт под другим пользователем? Мы только обработчик php запускаем под другим, сам то nginx как работал от имени www-data (или ngnix) так и работает. Если мы сверху ваш понуал польем каки то ftp сервером (а именно для этого обычно разбрасывают пользователей) то могут быть проблемы со статикой

    1. Данную настройку я выполнял для других целей. Nginx разруливает запросы, а php обрабатывается php-fpm. Поэтому если будет взломан один из сайтов, то злоумышленник будет ограничен правами пользователя, указанного в настройках пула в php-fpm.

  4. Извините — я начинающий. Пояснительная поподробнее суть этой статьи? Тут речь идет о случае предоставления услуг хостинга, то есть такая конфигурация поможет разграничить права между дирикториями

    1. Предоставлением хостинга никогда не занимался, Вам лучше стоит почитать специализированные мануалы на эту тему.

    2. Используйте Docker или LXC для разделения виртуальных хостов, из контейнера не вылезут, любую версию php можно развернуть под заказ

  5. А какие права на директории нужно выдавать для Nginx и php-fpm если fpm работает от пользователя в /home/user и имеет такое дерево

    $tree
    .
    ├── domains
    │   └── domain.ru
    │   ├── index.html
    │   └── info.php
    ├── etc
    ├── logs
    │   ├── nginx
    │   │   ├── domain.ru-access.log
    │   │   └── domain.ru-error.log
    │   ├── php
    │   │   ├── php56-fpm-error.log
    │   │   └── php56-fpm-slow.log
    │   └── vsftp
    └── tmp

    1. Я сейчас не вспомню, какая у меня использовалась структура на тот момент, но по логике файлы сайта принадлежат пользователю, указанному в пуле php-fpm, а логи — пользователям, от которых запускаются nginx и php-fpm соответственно.

  6. Пытаюсь настроить для php7.0-fpm + nginx/1.13.0
    nginx работает под юзером www-data
    соответственно в /etc/php5/fpm/pool.d/beroot.su.conf:
    user = neblog
    group = neblog
    (neblog это для примера)

    Не могу настроить права для корректной работы
    php_admin_value[upload_tmp_dir] = /home/www/sites/neblog.info/tmp
    php_admin_value[session.save_path] = /home/www/sites/neblog.info/tmp

    Если закомментировать эти строки, то удаётся нормально работать с сессиями php, если не комментировать, то вываливается критическая ошибка при попытке создать сессию php. В логах пишет нет доступа.
    Какие у вас указаны права на эти папки? Я пробовал владельцем ставить и neblog и www-data, не работает.

    При попытке загрузить файлы на сервер опять же возникает ошибка прав доступа.
    Как вы решаете данную проблему?

    На сколько я понимаю проблему, получается что nginx работает под юзером www-data, а php работает под юзером neblog и они не имеют прав для просмотра и изменения файлов друг друга, т.к. пользователи разные. Как обойти эту прблему?

    1. Можете дать им общую группу и права на запись для группы. Или пути изменить на /tmp, туда доступ есть у всех.

      1. Если им давать общую группу, тогда смысл в разграничениях доступа? Ведь все сайты будут в одной группе и каждый сможет получить доступ к каждому. Путь /tmp попробю

        1. Ну так права для группы то можно только на директорию tmp назначить.
          У меня не осталось структуры, которая была реализована на тот момент, а настраивать и тестировать сейчас времени нет.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *