LINUX.ORG.RU
ФорумAdmin

Выполнение от разных пользователей. No input file specified.

 , , ,


1

3

Здравствуйте. Debian 6, Nginx + php-fpm. Для настройки ftp потребовалось сделать выполнение php от разных пользователей. Создал php пулы по этой инструкции - http://itbuben.org/blog/Unix-way/1674.html . Так же создал пользователей, сделал их владельцами файлов, дал права на выполнение и в пулах указал нужного пользователя для каждого сайта. Почему то нормально функционирует только первый созданный пользователь - видит и выполняет php. На остальных сайтах настроенных по аналогии вываливается это - No input file specified. Nginx говорит:

"GET /index.php HTTP/1.1" 404
php-fpm - молчит.

Вот конфиги: vhost

server {
        listen 80;
        server_name *.site.ru;
        rewrite ^(.*)$ http://site.ru$1 permanent;
}

server {
    server_name site.ru;
    root /var/www/site.ru;

    access_log /var/log/nginx/site.ru-access.log;
    error_log /var/log/nginx/site.ru-error.log;

    listen 80;
    index index.php;

    location / {
    try_files $uri $uri/ /index.php?q=$uri&$args;
    }

    location ~ \.php$ {

     fastcgi_pass   127.0.0.1:9001;
    # fastcgi_pass   unix:/tmp/newpool.sock;

    fastcgi_index  index.php;
    fastcgi_intercept_errors on;

    include fastcgi_params;

    fastcgi_param       SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_ignore_client_abort     off;
    }

    location ~ /\.ht {
        deny  all;
    }

    location /phpmyadmin {
               root /usr/share/;
               index index.php index.html index.htm;
               location ~ ^/phpmyadmin/(.+\.php)$ {
                       try_files $uri =404;
                       root /usr/share/;
                       fastcgi_pass 127.0.0.1:9000;
                       fastcgi_index index.php;
                       fastcgi_param SCRIPT_FILENAME $request_filename;
                       include /etc/nginx/fastcgi_params;
               }
               location ~*
               ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$
               {
                       root /usr/share/;
               }
        }
        location /phpMyAdmin {
               rewrite ^/* /phpmyadmin last;
        }
}

php пул

[site.ru]

listen = 127.0.0.1:9001

listen.allowed_clients = 127.0.0.1

user = clientlogin
group = clientlogin

pm = dynamic
pm.max_children = 7
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 3

chdir = /

Помогите разобраться, два дня мучаюсь(

«по аналогии» это как? приведи пример другого виртхоста, использующего другой пул

Skolotovich ★★★ ()
Ответ на: комментарий от Skolotovich

vhost2

server {
        listen 80;
        server_name *.site2.ru;
        rewrite ^(.*)$ http://site2.ru$1 permanent;
}

server {
    server_name site2.ru;
    root /var/www/site2.ru;

    access_log /var/log/nginx/site2.ru-access.log;
    error_log /var/log/nginx/site2.ru-error.log;

    listen 80;
    index index.php;

    location / {
    try_files $uri $uri/ /index.php?q=$uri&$args;
    }

    location ~ \.php$ {

     fastcgi_pass   127.0.0.1:9002;
    # fastcgi_pass   unix:/tmp/newpool.sock;

    fastcgi_index  index.php;
    fastcgi_intercept_errors on;

    include fastcgi_params;

    fastcgi_param       SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_ignore_client_abort     off;
    }

    location ~ /\.ht {
        deny  all;
    }

    location /phpmyadmin {
               root /usr/share/;
               index index.php index.html index.htm;
               location ~ ^/phpmyadmin/(.+\.php)$ {
                       try_files $uri =404;
                       root /usr/share/;
                       fastcgi_pass 127.0.0.1:9000;
                       fastcgi_index index.php;
                       fastcgi_param SCRIPT_FILENAME $request_filename;
                       include /etc/nginx/fastcgi_params;
               }
               location ~*
               ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$
               {
                       root /usr/share/;
               }
        }
        location /phpMyAdmin {
               rewrite ^/* /phpmyadmin last;
        }
}

pool2

[site2.ru]

listen = 127.0.0.1:9002

listen.allowed_clients = 127.0.0.1

user = clientlogin2
group = clientlogin2

pm = dynamic
pm.max_children = 7
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 3

chdir = /
Меняется только порт для подключения пула

arhikos ()
Ответ на: комментарий от arhikos
location ~ ^/phpmyadmin/(.+\.php)$ {
                       try_files $uri =404;
                       root /usr/share/;
                       fastcgi_pass 127.0.0.1:9000;
                       fastcgi_index index.php;
                       fastcgi_param SCRIPT_FILENAME $request_filename;
                       include /etc/nginx/fastcgi_params;
               }

тут тоже надо быть заменить на 9002. Что-то в error.log есть ?

fjoe ()
Ответ на: комментарий от fjoe

В error.log это:

2012/09/21 16:21:37 [error] 15961#0: *78500 FastCGI sent in stderr: "Unable to open primary script: /var/www/site.ru/index.php (No such file or directory)" while reading response header from upstream, client: 85.26.*.*, server: site.ru, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9001", host: "site.ru"

arhikos ()
Ответ на: комментарий от arhikos

Это запрос на vhost2 (site2.ru) выдает в лог такую ошибку? Если да, то что-то не то с редиректами, т.к. в лог ответил server: site.ru вместо server: site2.ru

fjoe ()
Ответ на: комментарий от fjoe

Не заметил разные error_log для хостов. Инетерсует то, что в /var/log/nginx/site2.ru-error.log; т.е. ошибки vhost2.

fjoe ()
Ответ на: комментарий от fjoe

Это та самая ошибка. Я так понял что php файлы недоступны юзеру clientlogin2 хотя он их владелец и в пуле прописано что они запускаются от него. html файлы в браузере открываются. Вот почему php недоступны не могу понять(

arhikos ()
Ответ на: комментарий от arhikos

Не должно быть в в /var/log/nginx/site2.ru-error.log сообщений от server: site.ru и fastcgi://127.0.0.1:9001. Там же отдельный лог на каждый домен. Что-то тут перепутано - или конфиг или лог.

fjoe ()
Ответ на: комментарий от Skolotovich

попробуй убрать listen.allowed_clients = 127.0.0.1

Убрал - ничего не изменилось.

arhikos ()
Ответ на: комментарий от fjoe

Что-то тут перепутано - или конфиг или лог.

Это я так написал просто. На всех нерабочих сайтах эта ошибка. На единственном рабочем ее нет.

arhikos ()
Ответ на: комментарий от arhikos

Это я так написал просто. На всех нерабочих сайтах эта ошибка.

Одновременно на всех? Или только на одном? И всё точно совпадает кроме времени: порт fastcgi и имя сервера в логе? Т.е. какой бы я домен ни открыл, везде будет порт 9001 в сообщении об ошибке?

html файлы в браузере открываются.

А эти файлы соотвтествуют домену или все домены siteX.ru открывают одни и те же файлы из основного домена site.ru или еще откуда-то?

Еще можно попробовать убрать эти

server {
        listen 80;
        server_name *.site.ru;
        rewrite ^(.*)$ http://site.ru$1 permanent;
}
редиректы для каждого домена. Ну и вобще убрать всё лишнее.

fjoe ()
Ответ на: комментарий от fjoe

какой бы я домен ни открыл, везде будет порт 9001 в сообщении об ошибке

Нет, у каждого домена свой порт. В логах имя сервера и порт соответствует домену.

А эти файлы соотвтествуют домену

Соответствуют.

Еще можно попробовать убрать эти редиректы

Не помогло

arhikos ()
Ответ на: комментарий от arhikos

Нет, у каждого домена свой порт. В логах имя сервера и порт соответствует домену.

Логи должны быть идентичны натуральным, а не 'Это я так написал просто.'

Пользователи могут читать свои php файлы?

su - clientloginN
cat /var/www/siteN.ru/index.php;

Процессы fcgi запущены под правильными пользователями?

ps aux

fjoe ()
Ответ на: комментарий от fjoe

Пользователи могут читать свои php файлы?

root@vedro:~# su arhimed
root@vedro:~# cat /var/www/arhimed.name/index.php
<?php

/**
 * @file
 * The PHP page that serves all page requests on a Drupal installation.
 *
 * The routines here dispatch control to the appropriate handler, which then
 * prints the appropriate page.
 *
 * All Drupal code is released under the GNU General Public License.
 * See COPYRIGHT.txt and LICENSE.txt.
 */

Процессы fcgi запущены под правильными пользователями?

arhimed    20336  0.0  0.2 248168   5556 ?        S    19:40   0:00 php-fpm: pool arhimed.name
arhimed    20337  0.0  0.2 248168   5556 ?        S    19:40   0:00 php-fpm: pool arhimed.name 
www-data 21608  2.8  2.3 259356 48368 ?        S    20:19   0:00 php-fpm: pool www                                         
www-data 21628  2.1  1.3 253280 28364 ?        S    20:20   0:00 php-fpm: pool www                                         
www-data 21629  1.2  1.4 254252 29728 ?        S    20:20   0:00 php-fpm: pool www 

arhikos ()
Ответ на: комментарий от arhikos
root@vedro:~# su arhimed
root@vedro:~# cat /var/www/arhimed.name/index.php

Пользователь не сменился. Во второй строчке опять root. Должно быть примерно так:

[root@dis ~]# su - fl
[fl@dis ~]$ id
uid=1000(fl) gid=1000(fl) groups=1000(fl),987(wireshark) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

fjoe ()
Ответ на: комментарий от fjoe

Ни под одним пользователем не получается зайти:

root@vedro:~# su - talart
root@vedro:~# su - arhimed
No directory, logging in with HOME=/
root@vedro:~# su - vipfashionlife
No directory, logging in with HOME=/
root@vedro:~# 
Из папки home/ тоже не заходит.

Но почему то

~# su - talart
не показывает ошибки. Это единственный домен который работает.

arhikos ()
Ответ на: комментарий от arhikos

не показывает ошибки.

Скорее всего, у него /home/username присутствует или на него выставлены правильные права доступа. Для других юзеров домашний каталог есть?.

Еще интересует выхлоп id сразу после 'su - username' для рабочих и нерабочих пользователей:

~# su - talart
~# id
[...]
~# su - arhimed
~# id
[...]

Можно попробовать выставить bash остальным юзерам если у них его нет

chsh arhimed $(which bash)

Ну и права на webroot до кучи проверить не помешало бы.

ls -l /var/www/arhimed.name/index.php
ls -ld /var/www/arhimed.name
ls -ld /var/www
ls -ld /var

Как были созданы все эти пользователи?

fjoe ()
Ответ на: комментарий от fjoe

Скорее всего, у него /home/username присутствует

Неа, папка home/ пустая.

выхлоп id сразу после 'su - username'

root@vedro:~# su - talart
root@vedro:~# id
uid=0(root) gid=0(root) groups=0(root)
root@vedro:~# su - arhimed
No directory, logging in with HOME=/
root@vedro:~# id
uid=0(root) gid=0(root) groups=0(root)

Можно попробовать выставить bash остальным юзерам

Не помогает.

Ну и права на webroot до кучи проверить не помешало бы.

root@vedro:~# ls -l /var/www/arhimed.name/index.php
-rwxr-xr-x 1 arhimed arhimed 529 Aug  5 15:27 /var/www/arhimed.name/index.php
root@vedro:~# ls -ld /var/www/arhimed.name
drwxr-xr-x 10 arhimed arhimed 4096 Sep 21 13:00 /var/www/arhimed.name
root@vedro:~# ls -ld /var/www
drwxrwx--- 14 talart www-data 4096 Sep 19 10:43 /var/www
root@vedro:~# ls -ld /var
drwxr-xr-x 16 root root 4096 Sep  9 15:10 /var

Как были созданы все эти пользователи?

Пример:

~# groupadd arhimed
~# useradd -g arhimed -d /var/www/arhimed.name -s /bin/false arhimed
~# passwd arhimed
~# sudo chown -R arhimed:arhimed /var/www/arhimed.name
~# sudo chmod 755 /var/www/arhimed.name

arhikos ()
Ответ на: комментарий от arhikos
root@vedro:~# ls -ld /var/www
drwxrwx--- 14 talart www-data 4096 Sep 19 10:43 /var/www

Вот в этот каталог не может никто зайти кроме пользователя talart и группы www-data. Для начала можно попробовать вот так:

chmod 777 /var/www
Если заработает - вернуть права как были и добавить остальных пользователей в группу www-data

fjoe ()
Ответ на: комментарий от fjoe

Юзер talart случайно оказался владельцем /var/www, владелец www-data. По этому один talart и работал, теперь не работает.

добавить остальных пользователей в группу www-data

В том то и смысл что я не хочу чтоб клиенты были в группе www-data

arhikos ()
Ответ на: комментарий от arhikos

Пока у пользователя не будет прав пройти полный путь до конечного php файла, fcgi работать не будет. nginx запущен, скорее всего, с правами www-data, и у него есть права читать содержимое в отличии от php.

fjoe ()
Ответ на: комментарий от fjoe

А как же это делается на хостингах? Или такое возможно только на Apache?

nginx запущен, скорее всего, с правами www-data

Именно так

у него есть права читать содержимое в отличии от php

Так для этого и делается пул и в нем указывается пользователь и группа отличные от www-data

Или я неправильно это понял?

arhikos ()
Ответ на: комментарий от arhikos

А как же это делается на хостингах?

обычно там апач или паравиртуализаця типа openvz.

Можно сделать примерно так: добавить пользователя www-data (т.е. nginx) в группы всех клиентов, чтобы статика читалась:

usermod -a -G arhimed www-data

а на каталоги пользователей:

chmod 750 /var/www/arhimed.name
chown -R arhimed:arhimed /var/www/arhimed.name

и на /var/www

chmod 550 /var/www

Как-то так.

fjoe ()
Ответ на: комментарий от arhikos

После добавления nginx-у групп его надо перезапустить, чтобы изменения применились.

Не помогло((( Есть еще варианты?

А более конкретно? Где и каких прав не хватает?

Опять же:

ls -l /var/www/arhimed.name/index.php
ls -ld /var/www/arhimed.name
ls -ld /var/www
ls -ld /var
Как оно выглядит теперь ?

id nginx

Для проверки групп

fjoe ()
Ответ на: комментарий от fjoe
root@vedro:~# usermod -a -G arhimed www-data
root@vedro:~# chmod 750 /var/www/arhimed.name
root@vedro:~# chown -R arhimed:arhimed /var/www/arhimed.name
root@vedro:~# ls -l /var/www/arhimed.name/index.php
-rwxr-xr-x 1 arhimed arhimed 529 Aug  5 15:27 /var/www/arhimed.name/index.php
root@vedro:~# ls -ld /var/www/arhimed.name
drwxr-x--- 10 arhimed arhimed 4096 Sep 22 17:28 /var/www/arhimed.name
root@vedro:~# ls -ld /var/www
dr-xr-x--- 14 www-data www-data 4096 Sep 22 17:36 /var/www
root@vedro:~# ls -ld /var
drwxr-xr-x 16 root root 4096 Sep  9 15:10 /var
root@vedro:~# id www-data
uid=33(www-data) gid=33(www-data) groups=33(www-data),1002(arhimed)
arhikos ()
Ответ на: комментарий от arhikos

Вот тут

root@vedro:~# ls -ld /var/www
dr-xr-x--- 14 www-data www-data 4096 Sep 22 17:36 /var/www
для php нет доступа.

Поэтому

# chmod 755 /var/www

fjoe ()
Ответ на: комментарий от arhikos

Несколько замечаний по безопасности, хоть она и сомнительна при данной архитектуре:

  •  chmod 751 /var/www 
    запретит пользователям читать список сайтов (листинг /var/www). Если всё поломается - вернуть как было 755.
  • все каталоги и файлы пользователей должны быть закрыты для other. т.е. chmod -R -v NN0 /path - пользователи не смогут читать чужие сайты.
  • если у пользователей есть возможность заливать свои php скрипты - то всё совсем плохо. Как минимум в php.ini надо отключить функции типа system(), exec() и еще с десяток подобных.
fjoe ()
Ответ на: комментарий от fjoe

Я понимаю что для поднятия качественного хостинга мне еще учиться и учиться но в данном случае я предоставляю клиентам ftp для мелких корректировок на сайтах которые я им делал. Всем подряд я ftp давать не буду и данных настроек мне пока хватит. В будущем, с приростом клиентов, я конечно постараюсь вникнуть в это поглубже и сделать все по уму.

За замечания спасибо, учту.

arhikos ()
Ответ на: комментарий от Sergi0Limit

Получше, но у php-fcgi процесса всё так же будет доступ ко всему содержимому chroot без ограничений. Внутри chroot лежат сайты пользователей. Т.е. если один пользователь зальёт себе на сайт файлменеджер на пхп - сможет пробежаться по чужим сайтам, посмотреть ихсодники или даже поправить чужие файлы, если права позволят.

fjoe ()
Ответ на: комментарий от fjoe

Не понял... если я сделаю так: есть путь к веб странице /var/www/sites/testuser/testdomain

chroot=/var/www/sites/testuser
chdir=/testdomain
то куда же он может выйти из этого окружения?

Sergi0Limit ()
Ответ на: комментарий от Sergi0Limit

Ну разве что если для каждого пользователя(сайта) делать отдельный chroot и запускать отдельный php-fcgi в нем. И в конфиге не забыть нужному юзеру нужный fcgi сокет/порт назначить. Если юзеров десяток, то нормально. Дальше хуже.

fjoe ()
Ответ на: комментарий от fjoe

Да, именно для каждого юзера свой php пул и в нем указывать chroot. Каждый пул на своем порту.

Хуже от того что больше нагрузка на память или хуже - оверхед для админа? Если второе, то не все так плохо.

Sergi0Limit ()
Ответ на: комментарий от Sergi0Limit

Памяти много кушать не должно. Кстати, если запускать php-fcgi для каждого сайта свой, то уже совсем легко можно всё разрулить обычными правами доступа. chroot уже как бы и не сильно нужно.

fjoe ()
Ответ на: комментарий от fjoe

Разве? В этой ветке кажется именно эта проблема была: php скрипт может выйти за пределы своего сайта и гулять по серверу без видимых проблем везде, где есть разрешение хх4.

Почитав пост, я попробовал реализовать у себя, залил скрипт-шел и вышел с /var/www. Поэтому и решил подойти со стороны chroot, и получил пару проблем с доступом к Mysql И прочим вещам.

создал в chroot/ etc,var,lib

Sergi0Limit ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.