Шаманград

Форум Клуба программистов
Текущее время: 04.09.2010 00:43:43

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
 Заголовок сообщения: php-fpm и виртуальный хостинг
СообщениеДобавлено: 03.10.2009 21:56:30 
Не в сети
Автоответчик
Автоответчик

Зарегистрирован: 01.07.2005 22:33:14
Сообщения: 2531
Откуда: Красногвардейское
ОС: Arch Linux
Имя: Илья Аверков
Широко используемым решением для разделяемого виртуального хостинга является связка Apache + PHP. PHP реализован в качестве модуля Apache и для обеспечения безопасности обычно достаточно заблокировать в php.ini функции типа exec и задать в настройках виртуального узла значение open_basedir при помощи директивы php_admin_value
Код:
php_admin_value open_basedir "/путь"

Для решения вопросов, касающихся безопасности при использовании Apache, тема уже есть.

Проблема возникает, когда нужно решать вопросы безопасности в связке nginx + php-fpm. В чём проблема? А в том, что возможности передать серверу PHP значение open_basedir из nginx нет. Как ни крути, пользователю не составит проблемы выйти за пределы своего домашнего каталога и смотреть чужие файлы (а в них можно порой подсмотреть пароли на MySQL-сервер и так далее).
Наиболее оптимальным решением в такой ситуации, возможно, является использование chroot. php-fpm поддерживает chroot на уровне своего конфигурационного файла. В секции <workers> имеется возможность сделать сколько угодно пулов рабочих процессов php-cgi, для каждого из пулов можно указать chroot. Чтобы различать пулы, нужно «вешать» их на разные порты TCP/IP или разные UNIX-сокеты.

Код:
<workers>
<section name="pool">
  <value name="name">erik</value> <!-- имя пула  -->
  …
  <value name="chroot"></value>
  …
</section>

</workers>


Возникает несколько новых серьёзных проблем. Рассмотрим их.

1. Каждый пул рабочих процессов «ест» память. Причём если какой-то виртуальный узел напрягается, а другой простаивает, то рабочие процессы второго узла «не смогут» помочь первому. Проблема особенно остра для VDS-серверов, где ресурсы всегда стоят денег владельцу сервера.
Возможное решение: делать отдельный пул не для одного виртуального узла, а для одного пользователя (всех его виртуальных узлов). Не очень поможет, если пользователей много, а сайтов у всех по одному. Тогда, возможно, имеет смысл группировать пользователей по доверенности, создавая пул для доверенных пользователей (они смогут подсматривать друг к другу в домашние каталоги) и соответственно «недоверенных».

2. Подключение к MySQL-серверу внутри виртуального узла возможно только по TCP/IP. Некоторые веб-приложения (к примеру, WordPress) для сервера localhost даже не пытаются использовать TCP/IP, а сразу выдают сообщение об ошибке, не обнаружив сокета MySQL.
Возможное решение: жёсткая ссылка на разъём MySQL внутри chroot-окружения. Важно заметить, что при перезапуске MySQL-сервера ссылку необходимо пересоздавать заново.

3. обращение к URL внутри chroot приводит к ошибке (getaddrinfo failed).
Возможное решение: поместить в chroot жёсткие ссылки на следующие файлы:
  • /etc/resolv.conf
  • /etc/nsswitch.conf
  • /lib/libnss_dns.so.2

_________________
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: php-fpm и виртуальный хостинг
СообщениеДобавлено: 04.10.2009 11:02:04 
Не в сети
Автоответчик
Автоответчик

Зарегистрирован: 01.07.2005 22:33:14
Сообщения: 2531
Откуда: Красногвардейское
ОС: Arch Linux
Имя: Илья Аверков
С недавних пор FastCGI Process Manager — уже не патч, а самостоятельный проект. Интересно будет посмотреть, насколько это решило одну из проблем (когда мастер-процесс потребляет почти столько же памяти, сколько рабочие процессы).
:roll:

GIT-репозиторий проекта:
git://github.com/dreamcat4/php-fpm.git

_________________
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: php-fpm и виртуальный хостинг
СообщениеДобавлено: 07.10.2009 21:09:33 
Не в сети
Автоответчик
Автоответчик

Зарегистрирован: 01.07.2005 22:33:14
Сообщения: 2531
Откуда: Красногвардейское
ОС: Arch Linux
Имя: Илья Аверков
Очередной подводный камень — отправка e-mail. Обнаружилось сегодня на jsmart.web.id.
Цитата:
[20:05:31] <bLaDe¤> The e-mail could not be sent.
Possible reason: your host may have disabled the mail() function...

Скорее всего, нужно сделать жёсткую ссылку на /usr/bin/sendmail. Если ему нужно ещё что-то из внешнего мира, подскажите, на выходных буду делать.

_________________
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: php-fpm и виртуальный хостинг
СообщениеДобавлено: 07.10.2009 23:47:40 
Не в сети
Автоответчик
Автоответчик
Аватара пользователя

Зарегистрирован: 03.12.2005 16:42:40
Сообщения: 1821
ОС: Linux: openSUSE
Имя: Алексей
Боюсь что много чего =(

Во-первых, /usr/sbin/sendmail может быть враппером для вызова реальной проги (которую в chroot-окружении тоже надо как-то найти), для postfix если не ошибаюсь это postdrop. Ему нужен как минимум конфиг /etc/postfix/main.cf и может быть ещё что-то. postdrop записывает письмо в каталог /var/spool/postfix/maildrop откуда MTA уже по расписанию делает отправку. Вот тут тоже хз, толи она напрямую записывает в этот каталог или использует unix-сокет (возможно /var/spool/postfix/private/maildrop )

По всей видимости это будет более сложная проблема. Если вариант, то использовать phpMailer с работой через SMTP. С учетом твоих проблем с памятью включать SMTP-сервер тоже проблематично.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: php-fpm и виртуальный хостинг
СообщениеДобавлено: 11.11.2009 12:47:43 
Не в сети
Автоответчик
Автоответчик

Зарегистрирован: 01.07.2005 22:33:14
Сообщения: 2531
Откуда: Красногвардейское
ОС: Arch Linux
Имя: Илья Аверков
Итак, очередной серьёзной проблемой на пути к использованию PHP в chroot-окружении стала отправка электронной почты. PHP должно вызывать программу sendmail, передавая ей некоторый список аргументов. Само письмо пишется в стандартный ввод, так ведь?
Так что моей идеей для независящего от используемого MTA решения этой проблемы будет банальный перевызов реального sendmail (вне chroot-окружения) одноимённым враппером из chroot. Как этого можно добиться? Один из вариантов пришёл на ум сразу — sendmail, работающий в chroot, просто сбрасывает письма в некоторую базу данных SQLite, которую затем (например, по cron-у раз в несколько минут) сканирует внешний сценарий. Если в базе данных есть письма, они отправляются реальным sendmail.

У кого будут варианты проще? :roll:

_________________
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: php-fpm и виртуальный хостинг
СообщениеДобавлено: 13.11.2009 21:49:16 
Не в сети
Администратор
Администратор
Аватара пользователя

Зарегистрирован: 14.10.2005 16:43:54
Сообщения: 827
ОС: Linux
WST писал(а):
У кого будут варианты проще? :roll:

Использовать IPC типа D-Bus или даже сокетов для рантаймного дёргания sendmail. sendmail в chroot будет просто дёргать соответствующий сервер, пинающий настоящий sendmail.

_________________
WatchRooster писал(а):
Не связывайтесь с японской попсой, если не хотите запоминать имена типа モーニング娘。 или 浜崎あゆみ :)

Лучше связывайтесь с музыкой в стиле J-rock, чтобы помнить названия типа チューチュー ラブリー ムニムニ ムラムラ プリンプリン ボロン ヌルル レロレロ ;-).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: php-fpm и виртуальный хостинг
СообщениеДобавлено: 14.11.2009 01:05:29 
Не в сети
Автоответчик
Автоответчик
Аватара пользователя

Зарегистрирован: 03.12.2005 16:42:40
Сообщения: 1821
ОС: Linux: openSUSE
Имя: Алексей
хм.. IPC навело на следущую мысль: sendmail повесить на (x)inetd, а в chroot окружении вместо sendmail использовать minisend из nanosoft

Получается так:
1. PHP вызывает скрипт sendmail.sh
2. sendmail.sh вызывает minisend localhost <port>
3. minisend коннетиться к порту который слушает (x)inetd
4. (x)inetd запускает настоящий sendmail
5. sendmail делает свою работу

Думаю будет работать, но надо проверять =)

Хотя я бы все-таки попробовал бы сделать жесткие ссылки на sendmail, main.cf, maildrop и unix-сокет maildrop-а (см. мой предыдущий пост)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: php-fpm и виртуальный хостинг
СообщениеДобавлено: 14.11.2009 16:57:35 
Не в сети
Автоответчик
Автоответчик

Зарегистрирован: 01.07.2005 22:33:14
Сообщения: 2531
Откуда: Красногвардейское
ОС: Arch Linux
Имя: Илья Аверков
Я не хочу делать жёсткие ссылки, я хочу знать решение, пригодное для любого MTA, речь не только о сервере underjabber.net.ru.
Тока чтобы sh-скрипт в chroot вызвать, понадобится ещё bash, проще сам minisend немного переделать для конкретного случая.
Вообще говоря, у меня жестчайшее ограничение на число процессов, так что лишние процессы порождать не стоит.

_________________
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: php-fpm и виртуальный хостинг
СообщениеДобавлено: 27.12.2009 15:14:13 
Не в сети
Автоответчик
Автоответчик

Зарегистрирован: 01.07.2005 22:33:14
Сообщения: 2531
Откуда: Красногвардейское
ОС: Arch Linux
Имя: Илья Аверков
И всё-таки даже если решить все проблемы в виде недоступных в chroot файлов, останется ещё одна не менее серьёзная проблема. Если безопасность обеспечивать при помощи chroot, то нужно для каждого пользователя заводить свой пул рабочих процессов. А они, как известно, весьма существенно потребляют память. Вариант, сразу всплывающий в голове, — максимально уменьшить число процессов на 1 юзера, то есть 1 процесс. Но это резко увеличивает возможность 502 ошибки в случаях, когда рабочий процесс не справляется с нагрузкой. Собственно, именно это и наблюдается у многих хостеров, использующих php-fpm и делающих по 1 процессу на пользователя с тем, чтобы разместить на одном сервере как можно больше клиентов и извлечь из этого больше $$$.

Хитрость в том, что 5-7 рабочих процессов, одновременно обслуживающих десяток пользователей, работают намного эффективнее, чем 10 процессов, обслуживающих 10 пользователей, но так, что каждый обслуживает «своего». Так что chroot в плане эффективности идёт лесом.

Нужно всё-таки придумать, как бы задавать open_basedir. Я пробовал сделать это, используя директиву php.ini auto_prepend_file, но в файле, подключаемом таким образом, нельзя переопределить open_basedir (да и многие другие параметры).

В скором времени у меня хотят захоститься несколько человек, не хотелось бы делать каждому из них по 2 процесса — хочется сделать 2 процесса на всех, сайты не такие уж и посещаемые ожидаются.

P.S.: кстати, FPM приняли в основной код PHP, так что в скором будущем его появление можно ожидать в обычных релизах.

:roll:

_________________
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: php-fpm и виртуальный хостинг
СообщениеДобавлено: 02.01.2010 15:54:37 
Не в сети
Автоответчик
Автоответчик

Зарегистрирован: 01.07.2005 22:33:14
Сообщения: 2531
Откуда: Красногвардейское
ОС: Arch Linux
Имя: Илья Аверков
http://www.cyberciti.biz/tips/howto-set ... httpd.html

_________________
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: php-fpm и виртуальный хостинг
СообщениеДобавлено: 02.01.2010 17:07:16 
Не в сети
Автоответчик
Автоответчик

Зарегистрирован: 01.07.2005 22:33:14
Сообщения: 2531
Откуда: Красногвардейское
ОС: Arch Linux
Имя: Илья Аверков
Сделал как сказано, с учётом этой информации, теперь функция mail() приводит к 504 ошибке :(
Помогите, пожалуйста :roll:

_________________
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: php-fpm и виртуальный хостинг
СообщениеДобавлено: 02.01.2010 17:18:19 
Не в сети
Автоответчик
Автоответчик

Зарегистрирован: 01.07.2005 22:33:14
Сообщения: 2531
Откуда: Красногвардейское
ОС: Arch Linux
Имя: Илья Аверков
504 ошибка возникала на уровне postfix, зависал, гад. Сейчас подправил конфиг, хоть и не работает, но уже не зависает. Короче, нужно донастроить postfix…

Код:
Jan  2 16:17:06 server postfix/smtpd[7715]: connect from jsmart.web.id[127.0.0.1]
Jan  2 16:17:07 server postfix/smtpd[7715]: 02835C260CBB: client=jsmart.web.id[127.0.0.1]
Jan  2 16:17:07 server postfix/cleanup[6116]: 02835C260CBB: message-id=<20100102131707.02835C260CBB@us1.jsmart.web.id>
Jan  2 16:17:07 server postfix/qmgr[5957]: 02835C260CBB: from=<www@us.jsmart.web.id>, size=538, nrcpt=1 (queue active)
Jan  2 16:17:07 server postfix/qmgr[5957]: warning: connect to transport filter: No such file or directory
Jan  2 16:17:07 server postfix/smtpd[7715]: disconnect from jsmart.web.id[127.0.0.1]
Jan  2 16:17:09 server postfix/error[7828]: 02835C260CBB: to=<********>, relay=none, delay=2.5, delays=0.86/0.01/0/1.7, dsn=4.3.0, status=deferred (mail transport unavailable)

_________________
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: php-fpm и виртуальный хостинг
СообщениеДобавлено: 16.01.2010 17:52:21 
Не в сети
Автоответчик
Автоответчик

Зарегистрирован: 01.07.2005 22:33:14
Сообщения: 2531
Откуда: Красногвардейское
ОС: Arch Linux
Имя: Илья Аверков
Решение проблемы найдено! В ближайшее время напишу статью на своём сайте.
Спасибо shade, что толкнул идею.

_________________
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: php-fpm и виртуальный хостинг
СообщениеДобавлено: 16.01.2010 23:22:43 
Не в сети
Автоответчик
Автоответчик

Зарегистрирован: 01.07.2005 22:33:14
Сообщения: 2531
Откуда: Красногвардейское
ОС: Arch Linux
Имя: Илья Аверков
Собственно, вот, прошу прощения, что на английском.
http://the1st.net.ru/php-fastcgi.shtml

_________________
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: php-fpm и виртуальный хостинг
СообщениеДобавлено: 20.01.2010 21:47:26 
Не в сети
Автоответчик
Автоответчик
Аватара пользователя

Зарегистрирован: 03.12.2005 16:42:40
Сообщения: 1821
ОС: Linux: openSUSE
Имя: Алексей
> echo file_get_contents('/opt/nginx/html/errors/404.html');
readfile


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: php-fpm и виртуальный хостинг
СообщениеДобавлено: 22.01.2010 15:17:54 
Не в сети
Автоответчик
Автоответчик

Зарегистрирован: 01.07.2005 22:33:14
Сообщения: 2531
Откуда: Красногвардейское
ОС: Arch Linux
Имя: Илья Аверков
shade писал(а):
> echo file_get_contents('/opt/nginx/html/errors/404.html');
readfile

fixed

_________________
Изображение


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
[ Time : 0.427s | 16 Queries | GZIP : Off ]