Разграничение доступа Nginx+PHP-FPM

Проблемы с установкой, настройкой и работой системных и сетевых программ.

Модераторы: GRooVE, alexco

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
Sun
прапорщик
Сообщения: 496
Зарегистрирован: 2008-07-14 18:27:14
Откуда: Красноярск
Контактная информация:

Разграничение доступа Nginx+PHP-FPM

Непрочитанное сообщение Sun » 2011-08-19 13:08:38

Доброго времени уважаемые!

Возникла задача на домашней машине за чирутить пользователей веб сервера.

Информация по серверу:

Код: Выделить всё

[16:35][gw][root][/usr/local/etc]# uname -srm
FreeBSD 8.2-RELEASE i386
[16:35][gw][root][/usr/local/etc]# pkg_info
nginx-1.0.5,1       Robust and small WWW server
php52-5.2.17_1      PHP Scripting Language
php52-extensions-1.3_1 A "meta-port" to install PHP extensions
php52-sockets-5.2.17_1 The sockets shared extension for php
php52-xml-5.2.17_1  The xml shared extension for php
PHP собрано как FPM. Есть следующие каталоги:

Код: Выделить всё

drwxr-xr-x   user1        user2         /hosting/site1
drwxr-xr-x   user2        user2         /hosting/site2
Необходимо чтобы PHP выполнял скрипты в этих каталогах от разных пользователей.
Настройки nginx.conf:

Код: Выделить всё

[16:39][gw][root][/usr/local/etc]# cat nginx/nginx.conf
user  www www;
worker_processes  1;
events {
    worker_connections  1024;
    use kqueue;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    include vhost/*conf;
}
Настройка виртуальных хостов site1 & site2:

Код: Выделить всё

   server {
        listen       80;
        server_name  site1 www.site1;
        client_max_body_size 10m;
        charset koi8-r;
        access_log  /hosting/site1/log/access.log;
        error_log   /hosting/site1/log/error.log;
        location / {
            root   /hosting/site1/www;
            index  index.html index.php;
        }
        location ~ \.php$ {
            root        www;
            fastcgi_pass   "unix:/tmp/php-fpm.sock";
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /hosting/site1/www$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
###########################################################################
   server {
        listen       80;
        server_name  site2 www.site2;
        charset koi8-r;
        access_log  /hosting/site2/log/access.log;
        error_log   /hosting/site2/log/error.log;
        location / {
            root   /hosting/site2/www;
            index  index.html index.php;
        }
        location ~ \.php$ {
            root        www;
            fastcgi_pass   "unix:/tmp/php-fpm.sock";
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /hosting/site2/www$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
Настройка php-fpm:

Код: Выделить всё

<configuration>
        <section name="global_options">
                <value name="pid_file">/var/run/php-fpm/php-fpm.pid</value>
                <value name="error_log">/var/log/php-fpm/php-fpm.log</value>
                <value name="log_level">notice</value>
                <value name="emergency_restart_threshold">10</value>
                <value name="emergency_restart_interval">1m</value>
                <value name="process_control_timeout">5s</value>
                <value name="daemonize">yes</value>
        </section>
        <workers>
#====================================================================
                <section name="site1">
                        <value name="name">site1</value>
                        <value name="listen_address">/tmp/php-fpm.sock</value>
                        <value name="listen_options">
                                <value name="backlog">-1</value>
                                <value name="owner">www</value>
                                <value name="group">www</value>
                                <value name="mode">0666</value>
                        </value>
                        <value name="php_defines">
                        </value>
                        <value name="user">user1</value>
                        <value name="group">user1</value>
                        <value name="pm">
                                <value name="style">static</value>
                                <value name="max_children">5</value>
                                <value name="apache_like">
                                        <value name="StartServers">20</value>
                                        <value name="MinSpareServers">5</value>
                                        <value name="MaxSpareServers">35</value>
                                </value>
                        </value>
                        <value name="request_terminate_timeout">0s</value>
                        <value name="request_slowlog_timeout">0s</value>
                        <value name="slowlog">logs/slow.log</value>
                        <value name="rlimit_files">1024</value>
                        <value name="rlimit_core">0</value>
                        <value name="chroot"></value>
                        <value name="chdir"></value>
                        <value name="catch_workers_output">yes</value>
                        <value name="max_requests">500</value>
                        <value name="allowed_clients">127.0.0.1</value>
                        <value name="environment">
                                <value name="HOSTNAME">$HOSTNAME</value>
                                <value name="PATH">/usr/local/bin:/usr/bin:/bin</value>
                                <value name="TMP">/tmp</value>
                                <value name="TMPDIR">/tmp</value>
                                <value name="TEMP">/tmp</value>
                                <value name="OSTYPE">$OSTYPE</value>
                                <value name="MACHTYPE">$MACHTYPE</value>
                                <value name="MALLOC_CHECK_">2</value>
                        </value>
                </section>
#====================================================================
                <section name="site2">
                        <value name="name">site2</value>
                        <value name="listen_address">/tmp/php-fpm.sock</value>
                        <value name="listen_options">
                                <value name="backlog">-1</value>
                                <value name="owner">www</value>
                                <value name="group">www</value>
                                <value name="mode">0666</value>
                        </value>
                        <value name="php_defines">
                        </value>
                        <value name="user">user2</value>
                        <value name="group">user2</value>
                        <value name="pm">
                                <value name="style">static</value>
                                <value name="max_children">5</value>
                                <value name="apache_like">
                                        <value name="StartServers">20</value>
                                        <value name="MinSpareServers">5</value>
                                        <value name="MaxSpareServers">35</value>
                                </value>
                        </value>
                        <value name="request_terminate_timeout">0s</value>
                        <value name="request_slowlog_timeout">0s</value>
                        <value name="slowlog">logs/slow.log</value>
                        <value name="rlimit_files">1024</value>
                        <value name="rlimit_core">0</value>
                        <value name="chroot"></value>
                        <value name="chdir"></value>
                        <value name="catch_workers_output">yes</value>
                        <value name="max_requests">500</value>
                        <value name="allowed_clients">127.0.0.1</value>
                        <value name="environment">
                                <value name="HOSTNAME">$HOSTNAME</value>
                                <value name="PATH">/usr/local/bin:/usr/bin:/bin</value>
                                <value name="TMP">/tmp</value>
                                <value name="TMPDIR">/tmp</value>
                                <value name="TEMP">/tmp</value>
                                <value name="OSTYPE">$OSTYPE</value>
                                <value name="MACHTYPE">$MACHTYPE</value>
                                <value name="MALLOC_CHECK_">2</value>
                        </value>
                </section>
#====================================================================
        </workers>
</configuration>
Пользователя www добавил в группы обоих пользователей user1 & user2:

Код: Выделить всё

pw groupmod www -m user1 && pw groupmod www -m user2
Вопрос, каталоги пользователей каждый со своими правами получились, но в процессах все процессы от пользователя www:

Код: Выделить всё

25941 www           1  76    0 21732K 13328K accept  0   0:00  0.00% php-cgi
25938 www           1  76    0 21732K 13328K accept  0   0:00  0.00% php-cgi
25940 www           1  76    0 21732K 13328K accept  1   0:00  0.00% php-cgi
25942 www           1  76    0 21732K 13328K accept  0   0:00  0.00% php-cgi
25918 root          1  76    0  4796K  2992K pause   1   0:00  0.00% nginx
Я так понимаю что скрипты выполняются PHP-FPM выполняются от хозяев созданных каталогов и передаются в nginx пользователю www?
Товарищи если кто знает объясните пожалуйсто в правильном направлении думаю или нет. Заранее большое спасибо всем! :drinks:

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Marcello
ефрейтор
Сообщения: 64
Зарегистрирован: 2011-07-09 11:59:08

Re: Разграничение доступа Nginx+PHP-FPM

Непрочитанное сообщение Marcello » 2011-08-19 13:19:08

в php.ini не забудь прописать

cgi.fix_pathinfo=0

Аватара пользователя
Sun
прапорщик
Сообщения: 496
Зарегистрирован: 2008-07-14 18:27:14
Откуда: Красноярск
Контактная информация:

Re: Разграничение доступа Nginx+PHP-FPM

Непрочитанное сообщение Sun » 2011-08-19 15:18:42

Marcello писал(а):в php.ini не забудь прописать

cgi.fix_pathinfo=0
Спасибо, в 5.2 по дефолту оно отключено, т.е. 0.
Сейчас немного поковырявшись понял. PHP скрипты не имеют права на запись от nginx... Попробовал изменить права доступа на каталог и скрипты, на 765, не помогло :( Все таки склоняюсь к тому что нужно курить php-fpm.conf эти секции:

Код: Выделить всё

                        <value name="listen_address">/tmp/php-fpm.sock</value>
                        <value name="listen_options">
                                <value name="backlog">-1</value>
                                # Пользователь и группа от которых создается сокет
                                <value name="owner">www</value>
                                <value name="group">www</value>
                                <value name="mode">0666</value>
                        </value>
                        <value name="php_defines">
                        </value>
                        # Пользователь и группа от которых работаем в каталоге со скриптами
                        # Т.е. предполагается что эти дерективы задают владельца каталога
                        <value name="user">www</value>
                        <value name="group">www</value>
Если я все правильно понимаю то должно все гладко работать, но увы... Я предполагаю что вся беда в nginx, так как он запускается от пользователя www. Как это обойти или сделать по другому не пойму.

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: Разграничение доступа Nginx+PHP-FPM

Непрочитанное сообщение LMik » 2011-08-19 16:01:08

Какой-то у вас не правильный пхп, соберите 5.3 из портов, там есть опция с FPM. Конфиг другой будет очень понятный. Настраивается за 2 минуты. Ну и весь 5.2 пхп будет вполне работать.
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

Аватара пользователя
Sun
прапорщик
Сообщения: 496
Зарегистрирован: 2008-07-14 18:27:14
Откуда: Красноярск
Контактная информация:

Re: Разграничение доступа Nginx+PHP-FPM

Непрочитанное сообщение Sun » 2011-08-19 17:06:38

LMik писал(а):Какой-то у вас не правильный пхп, соберите 5.3 из портов, там есть опция с FPM. Конфиг другой будет очень понятный. Настраивается за 2 минуты. Ну и весь 5.2 пхп будет вполне работать.
Меня пока всем устраивает и 5.2, просто есть часть сайтов которые написаны были под 5.2 и на 5.3 отказываются корректно работать. А возможно ли иметь на сервере 5.2 и 5.3 версию и допустим предоставлять юзеру на выбор нужную ему версию?

Ну и мой вопрос 5.3 пых устранит эти проблемы с доступом на каталоги?

5.2 кстати ставил из портов и там тоже в портах уже есть возможность ставить его как fpm.

Marcello
ефрейтор
Сообщения: 64
Зарегистрирован: 2011-07-09 11:59:08

Re: Разграничение доступа Nginx+PHP-FPM

Непрочитанное сообщение Marcello » 2011-08-21 16:00:32

чтобы другие не заблуждались, судя по проверке ресурса Sun'a не надейтесь на дефолт cgi.fix_pathinfo=0 судя по всему этого дефолта там нету, так что лучше явно его укажите.

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: Разграничение доступа Nginx+PHP-FPM

Непрочитанное сообщение LMik » 2011-08-22 8:20:07

Sun писал(а):
LMik писал(а):Какой-то у вас не правильный пхп, соберите 5.3 из портов, там есть опция с FPM. Конфиг другой будет очень понятный. Настраивается за 2 минуты. Ну и весь 5.2 пхп будет вполне работать.
Меня пока всем устраивает и 5.2, просто есть часть сайтов которые написаны были под 5.2 и на 5.3 отказываются корректно работать. А возможно ли иметь на сервере 5.2 и 5.3 версию и допустим предоставлять юзеру на выбор нужную ему версию?

Ну и мой вопрос 5.3 пых устранит эти проблемы с доступом на каталоги?

5.2 кстати ставил из портов и там тоже в портах уже есть возможность ставить его как fpm.
Вы даже не попробовали судя по всему запустить на 5.3 эти сайты. Попробуйте и напишите ошибки, даже если не работает - исправит дело двух минут. А фпм с 5.3 собирается совсем не такой как вы тут пишите для 5.2.
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!