NGINX и PHP FPM - общие проблемы с настройкой и производительностью при использовании open_basedir
Я хочу настроить сервер NGINX, на котором можно размещать несколько веб-сайтов, которые отделены друг от друга, поэтому vhosta
не может получить доступ к файлам из vhostb
,
Я установил свежий сервер Debian 7.5 и установил NGINX и PHP FPM из пакетов Debian по умолчанию.
Тогда я добавлю 2 новых пользователей vhosta
а также vhostb
и добавил пользователя веб-сервера NGINX www-data
группе каждого пользователя.
Затем я создал следующую структуру каталогов.
var/
|---www/
|---vhosta
|---httpdocs (permissions 750 - owner: vhosta - group: vhosta)
|---vhostb
|---httpdocs (permissions 750 - owner: vhostb - group: vhostb)
Я настроил отдельный пул PHP FPM для каждого виртуального хоста, чтобы отделить процессы PHP для каждого виртуального хоста. Конфигурация выглядит следующим образом (просто показывает для vhosta
)
[vhosta]
listen = /var/run/php5-fpm-vhosta.sock
user = vhosta
group = vhosta
listen.owner = vhosta
listen.group = vhosta
Насколько мне известно, эта конфигурация должна отделяться vhosta
от доступа к файлам в vhostb's
каталог httpdocs, так как vhosta
не имеет прав доступа к папке httpdocs из vhosta
, Я проверил это, пытаясь создать простой скрипт PHP в vhosta
, который пытается получить доступ к файлам в vhostb's
Каталог httpdocs.
Все идет нормально. Я установил приложение PHP (CMS) в vhosta
и сделал некоторое тестирование производительности с ApacheBench.
Как правило, все работает более плавно и быстро, чем с Apache2, и я получу следующий результат.
Requests per second: 31.62 [#/sec] (mean)
Time per request: 316.209 [ms] (mean)
Time per request: 31.621 [ms] (mean, across all concurrent requests)
Transfer rate: 430.58 [Kbytes/sec] received
Хорошо, 31.62 запросов в секунду - это нормально для меня на данный момент.
Последнее, что я хочу доступ ограничить оба vhosta
а также vhostb
к подмножеству каталогов, поэтому они не имеют доступа к другим читаемым в мире системным файлам. Я делаю это с помощью директивы PHP open_basedir.
Я добавил следующее для каждого пула PHP FPM виртуальных хостов (просто показывает vhosta
)
php_admin_value[open_basedir] = /var/www/vhosta/httpdocs/:/tmp/
При этом vhosts не должен иметь доступа, например, к /etc/passwd. Я создал простой PHP-скрипт, который проверяет, что vhosts не может получить доступ к файлам снаружи из настроенных каталогов.
Наконец, я повторил тест производительности и в итоге получил следующий результат.
Requests per second: 11.82 [#/sec] (mean)
Time per request: 8460.087 [ms] (mean)
Time per request: 84.601 [ms] (mean, across all concurrent requests)
Transfer rate: 161.18 [Kbytes/sec] received
Похоже, что добавление директивы open_basedir в пул PHP FPM приводит к значительному снижению производительности. Время доступа и количество запросов в секунду теперь довольно схожи по сравнению с настройкой, использующей Apache2 с mod_php.
Мои вопросы следующие:
Может ли созданная мной установка считаться "безопасной", чтобы отдельные vhosts не могли получить доступ друг к другу? Если нет, то что лучше делать, и чего мне не хватает?
Почему производительность сильно падает, когда я использую open_basedir? Или это сохранить, чтобы не использовать open_basedir, так как такие файлы, как / etc / passwd, в любом случае, доступны для чтения всему миру?
1 ответ
Если вы действительно хотите, чтобы они не имели доступа к чему-либо реальному в системе, настройте chroot для php-fpm, создав таким образом "фальшивый" /etc/passwd и так далее. Или, что еще проще, используйте докер!
1) Я не уверен, как вы настроили статические файлы для загрузки с этих vhosts, потому что они не должны загружаться в этом случае, возможно, только если вы передадите все в php-fpm, который открывает вас для другого вида атакует и снижает производительность. Обычно вы устанавливаете такие разрешения (учитывая, что nginx - это пользователь, запускающий процесс nginx):
- / var / vhosta: владелец vhosta.nginx; Пермь 750
- / var / vhostb: владелец vhostb.nginx; Пермь 750
2) Я не уверен на 100%, однако, если у вас сложное приложение, которое загружает огромное количество файлов, а ваш ввод / вывод не обеспечивает хорошую производительность, то это может иметь смысл. Ограничения open_basedir выполняют такие вещи, как проверка, не являются ли файлы символической ссылкой или внутри символической ссылки, и т. д., делая много запросов ввода-вывода, что повышает IOPS вашего диска. Еще одна причина использовать докер или хотя бы chroot.