php-ftp+chroot = ошибка

54 просмотра
Перейти к первому непрочитанному сообщению

alekciy

не прочитано,
11 июл. 2009 г., 10:10:2811.07.2009
– highload-php-ru
Поставил nginx 0.6.32 + php-fpm 5.3.0 для которого прописан choor.
Запустил и оказалось, что сессии не работают. Оказалось из-за chroot и
дефолтного пути сохранения файлов сессии /tmp которых лежит вне
заданного значения chroot. Поэтому решил сделать следущее.

Каталог /home/ftpuser/alekciy для всех файлов пользователя (для
пользователя alekciy), именно в него попадает пользователь через ftp.
Имеем папку /home/ftpuser/alekciy/tmp (ftpuser:ftpgroup 0777) для
хранения временных файлов и файлов сессий. Так же есть папка /home/
ftpuser/alekciy/site.ru (ftpuser:ftpgroup 0755) для веба. Конфигурации
следущие.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
nginx:
user ftpuser ftpgroup;
worker_processes 1;

error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

access_log /var/log/nginx/access.log;

sendfile on;

keepalive_timeout 65;
tcp_nodelay on;

gzip on;
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Из etc/nginx/conf.d/ в него инлюдиться такой конфиг:
server {
listen 80;
server_name site.ru;
access_log /home/ftpuser/alekciy/httpd.log main;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
include fastcgi_params;
}

location / {
root /home/ftpuser/alekciy/site.ru;
index index.php index.html index.htm;
}
}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
php-fpm конфиг:
<?xml version="1.0" ?>
<configuration>
<section name="global_options">
<value name="pid_file">/usr/local/logs/php-fpm.pid</
value>
<value name="error_log">/usr/local/logs/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="pool">
<value name="name">site.ru</value>
<value name="listen_address">127.0.0.1:9001</
value>
<value name="listen_options">
<value name="backlog">-1</value>
<value name="owner">ftpuser</value>
<value name="group">ftpgroup</value>
<value name="mode">0666</value>
</value>
<value name="php_defines">
<value name="error_log">/home/ftpuser/
alekciy/php-fpm-error.log</value>
<value name="session.save_path">/home/
ftpuser/alekciy/tmp</value>
</value>
<value name="user">ftpuser</value>
<value name="group">ftpgroup</value>
<value name="pm">
<value name="style">static</value>
<value name="max_children">3</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">300s</
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">/home/ftpuser/alekciy</
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">/home/ftpuser/
alekciy/tmp</value>
<value name="TMPDIR">/home/ftpuser/
alekciy/tmp</value>
<value name="TEMP">/home/ftpuser/
alekciy/tmp</value>
<value name="OSTYPE">$OSTYPE</value>
<value name="MACHTYPE">$MACHTYPE</
value>
<value name="MALLOC_CHECK_">2</value>
</value>
</section>
</workers>
</configuration>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -

Ни каких грубых ошибок в таком конфиге я не вижу, но при обращению к
любому php файлу получаю ошибку:
Warning: Unknown: Filename cannot be empty in Unknown on line 0 Fatal
error: Unknown: Failed opening required '' (include_path='.:/usr/local/
lib/php') in Unknown on line 0
статика же отдается корректно.

В чем проблема? Если изменить директиву chroot на /home/ftpuser/
alekciy/site.ru (т.е. сделать её равной директиве root nginx-а), то
скрипты начинают работать, но не работают сессии, т.к. tmp получается
выше, чем chroot-а, а выносить tmp папку в веб директорию /home/
ftpuser/alekciy/site.ru совершенно не хочется.

Даже если вынести временную директорию в /home/ftpuser/alekciy/site.ru/
tmp все равно сессии не работают, получаю ошибку:
Warning: session_register(): open(/home/ftpuser/alekciy/site.ru/tmp/
sess_u5tknsofg8plb74unsujgoh7o2, O_RDWR) failed: No such file or
directory (2) in /test.php on line 3

В логах вообще пусто.

alekciy

не прочитано,
11 июл. 2009 г., 11:32:0411.07.2009
– highload-php-ru
Очень странно, убрал chroot директивы и все равно получаю ошибку. В
документации вроде как написано, что по умолчанию директива пустая,
что как я понимаю означает, что она не является обязательной. Однико
если chroot не равно директиве root nginx-а, то ни чего не работает,
если равно, то скрипты отрабатываются, но механизм сессий не работает
даже если session.save_path равень директории внутри chroot-а.

В чем получаестя проблема? В nginx? Вроде нет, статику он отдает
корректно. В самом php, т.к. релиз достаточно нов? В самом fpm?

Alexey V. Karagodov

не прочитано,
11 июл. 2009 г., 11:58:2711.07.2009
– highloa...@googlegroups.com
Warning: Unknown: Filename cannot be empty in Unknown on line 0 Fatal
error: Unknown: Failed opening required '' (include_path='.:/usr/local/
lib/php') in Unknown on line 0



из командной строки пхп попробуйте запустить
просто
# php-cgi
или php-cgi -v или php-cgi -i
или как там его на вашем сервере зовут
у Вас неправильные настройки именно пых-а

alekciy

не прочитано,
11 июл. 2009 г., 13:40:5511.07.2009
– highload-php-ru
Я тогда не улавливаю, в чем неправильность? Если chroot директива
равна root, то работает. Конфиг получается верный.

Все это запускается на Debian 4, через php-fpm start. Он запускается
нормально и работает при условии равенства chroot и root директив.

# php-cgi -v
PHP 5.3.0 (cgi-fcgi) (built: Jul 9 2009 07:17:26)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies

php-cgi -i выдал что и phpinfo() выдает.

alekciy

не прочитано,
11 июл. 2009 г., 13:42:2811.07.2009
– highload-php-ru
При php-cgi -b 127.0.0.1:9001 получаю такую же ошибку.

Alexey V. Karagodov

не прочитано,
11 июл. 2009 г., 14:42:5911.07.2009
– highloa...@googlegroups.com
смотрите конфиг, где там путь неправильно указан

alekciy

не прочитано,
11 июл. 2009 г., 19:12:5911.07.2009
– highload-php-ru
Да конфиг я уже не по первому разу смотрел... все пути верные, ведь их
не руками писал, а копировал.
Сейчас и вовсе стал выдавать "No input file specified. "

anlide

не прочитано,
12 июл. 2009 г., 05:18:1512.07.2009
– highload-php-ru
Попробуйте использовать везде абсолютные пути. Часто помогает решать
такие проблемы.

polkila

не прочитано,
13 июл. 2009 г., 05:23:4213.07.2009
– highload-php-ru
в php safe_mode?

alekciy

не прочитано,
13 июл. 2009 г., 21:58:3513.07.2009
– highload-php-ru
Так я абсолютные и использую.

alekciy

не прочитано,
13 июл. 2009 г., 21:59:0613.07.2009
– highload-php-ru
Нет. Компилилось из исходников, а он там в Off по дефолту.

On 13 июл, 13:23, polkila <polk...@gmail.com> wrote:
> в php safe_mode?

alekciy

не прочитано,
13 июл. 2009 г., 22:04:1513.07.2009
– highload-php-ru
Выяснилось следущее. nginx считает, что $document_root=/usr/local/
nginx/html, хотя в location-е вроде явно прописано другое (причем путь
этот правильный). Так что видимо сначала придется понять, в чем дело у
nginx-а.

anlide

не прочитано,
23 июл. 2009 г., 12:46:2023.07.2009
– highload-php-ru
Интересно, проблему удалось решить?

alekciy

не прочитано,
23 июл. 2009 г., 13:29:0323.07.2009
– highload-php-ru
Да, удалось. Спасибо Александру Хохлову:
http://groups.google.com/group/highload-php-ru/browse_thread/thread/959378e8bb9e835d?hl=ru

Пути должны быть относительно chroot, а не абсолютными.

Konstantin Belov

не прочитано,
23 июл. 2009 г., 13:07:2423.07.2009
– highloa...@googlegroups.com
chroot = /home/ftpuser/alekciy/
/home/ftpuser/alekciy/tmp

В конфиге надо прописать:

<value name="environment">
...

<value name="TMP">/tmp</value>
<value name="TMPDIR">/tmp</value>
<value name="TEMP">/tmp</value>
...
</value>

Alexander V. Khokhlov

не прочитано,
24 июл. 2009 г., 04:12:0724.07.2009
– highloa...@googlegroups.com
2alekciy

А как вы решили проблему с подключением к MySQL ? У нас существующие клиенты подключались через unix-socket, а из-под chroot-а эта директория не была видна и по символической ссылке тоже нельзя было пройти. Решили, опять таки, максимально быстрым способом: joomla из-под chroot-а подключается через tcp socket на 127.0.0.1

-- 

Yours sincerely
Alexander V. Khokhlov

Aleksei Miheev

не прочитано,
24 июл. 2009 г., 04:24:1924.07.2009
– highloa...@googlegroups.com
Можно сокет положить внутрь chroot, в чём проблема-то? А если он нужен
кому-нибудь "снаружи" по старому пути - уже сделать симлинк.

В Fri, 24 Jul 2009 11:12:07 +0300
"Alexander V. Khokhlov" <alex....@gmail.com> пишет:

> 2alekciy
> А как вы решили проблему с подключением к MySQL ? У нас существующие
> клиенты подключались через unix-socket, а из-под chroot-а эта
> директория не была видна и по символической ссылке тоже нельзя было
> пройти. Решили, опять таки, максимально быстрым способом: joomla
> из-под chroot-а подключается через tcp socket на 127.0.0.1
>

--
С уважением,
Алексей Михеев
mailto:ale...@miheev.info | xmpp:ale...@miheev.info
http://ru.miheev.info

signature.asc

Alexander V. Khokhlov

не прочитано,
24 июл. 2009 г., 04:33:5524.07.2009
– highloa...@googlegroups.com
2009/7/24 Aleksei Miheev <ale...@miheev.info>

Можно сокет положить внутрь chroot, в чём проблема-то? А если он нужен
кому-нибудь "снаружи" по старому пути - уже сделать симлинк. 


Так, действительно, будет работать. Но это негибкое решение. Если понадобится еще десяток chroot-ов ?.. 

Alex Vorona

не прочитано,
24 июл. 2009 г., 04:41:5424.07.2009
– highloa...@googlegroups.com
24.07.2009 11:33, Alexander V. Khokhlov wrote:
> 2009/7/24 Aleksei Miheev <ale...@miheev.info
> <mailto:ale...@miheev.info>>
Скрипт запуска mysql должен уметь делать хардлинки во все chroot'ы (=>
сокет mysql и все chroot'ы должны быть в одном разделе), либо все юзают tcp.

Konstantin Belov

не прочитано,
24 июл. 2009 г., 06:07:4424.07.2009
– highloa...@googlegroups.com
У меня на одном из серверов вот такая конструкция:

for i in `ls /var/home`
do
/bin/ln -f /var/db/mysql/mysql.sock /var/home/$i/tmp
done

alekciy

не прочитано,
24 июл. 2009 г., 20:15:5424.07.2009
– highload-php-ru
Нет, пока не решил, трясу конфиги. Сокет через хардлинк проброшен
внутрь chroot-а (подобно тому, как это сделано у Константина Белова),
соединение вроде как происходит, но запросы не работают. Поэтому еще
раз прохожу по всему конфигу при этом в голове держу коннект по
локалхосту как крайний вариант.

On 24 июл, 12:12, "Alexander V. Khokhlov" <alex.so...@gmail.com>
wrote:


> 2alekciy
> А как вы решили проблему с подключением к MySQL ?

Alexey V. Karagodov

не прочитано,
24 июл. 2009 г., 20:19:4124.07.2009
– highloa...@googlegroups.com
mount -t nullfs
On 25.07.2009, at 4:15, alekciy wrote:

> Нет, пока не решил, трясу конфиги. Сокет через хардлинк проброшен
> внутрь chroot-а (подобно тому, как это сделано у Константина Белова),
> соединение вроде как происходит, но запросы не работают. Поэтому еще
что значит не работают?
они до сервера доходят? читать писать в сокет все могут кому надо?

Andrey N. Oktyabrski

не прочитано,
25 июл. 2009 г., 11:41:2025.07.2009
– highloa...@googlegroups.com
alekciy wrote:
> Нет, пока не решил, трясу конфиги. Сокет через хардлинк проброшен
> внутрь chroot-а (подобно тому, как это сделано у Константина Белова),
> соединение вроде как происходит, но запросы не работают. Поэтому еще
> раз прохожу по всему конфигу при этом в голове держу коннект по
> локалхосту как крайний вариант.
Это нормальный вариант, ничего плохого в нём нет.

Konstantin Belov

не прочитано,
25 июл. 2009 г., 18:28:5225.07.2009
– highloa...@googlegroups.com
alekciy wrote:
> Нет, пока не решил, трясу конфиги. Сокет через хардлинк проброшен
> внутрь chroot-а (подобно тому, как это сделано у Константина Белова),
> соединение вроде как происходит, но запросы не работают. Поэтому еще
> раз прохожу по всему конфигу при этом в голове держу коннект по
> локалхосту как крайний вариант.
>
>
а без chroot работает?

alekciy

не прочитано,
26 июл. 2009 г., 20:36:3326.07.2009
– highload-php-ru
Да, работает. Собственно пока я тряс конфиг и вывел этот пул из chroot-
а дабы доступ к страницам был.

alekciy

не прочитано,
26 июл. 2009 г., 20:38:2726.07.2009
– highload-php-ru
В общем перетряс конфиг. Все вроде верно. Еще раз переписал на всякий
пожарный, выгрузил php-fpm, mysqld. Запустил мускул, прокинул
хардлинк, запустил php-fpm и все заработало!
Ответить всем
Отправить сообщение автору
Переслать
0 новых сообщений