Несколько версий php на одном сервере. suphp

от автора

В соседнем топике от bondbig‘a прозвучал вопрос: «Расскажите лучше, как самому запилить две версии php на одном сервере (5.3 и 5.5, например).» И я попробую на него ответить на примере suphp, не останавливаясь на деталях, а описав только общую концепцию.

suphp это модуль для apache, который вызывается вместо mod_php и изначально был насчитан на запуск apache от разных пользователей. Это придумано для того, что бы злоумышленник взломав 1 сайт не получил доступ ко всем сайтам на сервере (ведь по умолчанию apache работает от одного пользователя для всех сайтов на сервере). Но его можно приспособить и под наши задачи.

Я не буду сравнивать suphp с mtm-itk, скажу лишь что компания, в которой я работаю применяет suphp на серверах виртуального хостинга (да, я работаю в хостинг провайдере), применяет успешно и жалоб на этот модуль на моей памяти никогда не было.

Так же я хочу отметить, что если вы возьмете сервер с CentOS 6, выполните все команды из данного поста и у вас в конце все заработает как надо, то это не значит что сервер готов для прода. Нужно ресетапнуть сервер и сделать все «по аналогии, но нормально», а не так, как тут.
Итак нам понадобиться:

  • Сервер
  • apache
  • Как минимум 2 версии php установленные на сервере
  • mod_suphp
  • Собрать все вместе

1) Поскольку лишнего боевого сервера у меня, я возьму виртуалку, установлю в нее Centos 6 minimal и введу в консоль от рута следующие:

yum -y update   yum -y groupinstall "Development Tools" yum -y install epel-release yum -y install httpd-devel httpd php php-common php-gd php-xml php-mbstring libxml2-devel libapreq2 libapreq2-devel wget vim screen links  

Таким образом мы обновим систему, подключим к ней репозитарий epel, установим apache, php (5.3) и инструменты для сборки из исходных кодов.

2) Теперь нам нужно установить вторую версию php. Как вы могли догадаться, я буду делать это из исходных кодов:

cd /usr/src/ wget http://ru2.php.net/get/php-5.6.2.tar.gz/from/this/mirror -O php.tar.gz tar xfz php.tar.gz cd php-5.6.2/ ./configure && make install 

В моем случае все прошло хорошо, и php 5.6 встал в /usr/local/bin/.

Вам же не обязательно все собирать самостоятельно. Вы можете воспользоваться пакетным менеджером дистрибутива, альтернативным пакетным менеджером (например Nix) или православно собрать пакет. В любом случае если вы делаете это на боевом сервере, то вам как минимум нужно добавить опций к ./configure.

3) Устанавливаем suphp:

cd /usr/src/ wget http://www.suphp.org/download/suphp-0.7.2.tar.gz tar xfz suphp-0.7.2.tar.gz cd suphp-0.7.2 autoreconf -f -i ./configure --with-apr=/usr/bin/apr-1-config && make install 

(Примечание как и к прошлому пункту).

4) Конфигурируем apache: подключаем модуль, прописываем вирт. хосты\папки, задаем необходимые переменные (от чьего имени запускать, какие версии php использовать).

httpd.conf

cat > /etc/httpd/conf/httpd.conf << EOF ServerRoot "/etc/httpd"  Listen 80  LoadModule authz_host_module modules/mod_authz_host.so LoadModule mime_magic_module modules/mod_mime_magic.so LoadModule headers_module modules/mod_headers.so LoadModule mime_module modules/mod_mime.so LoadModule dir_module modules/mod_dir.so LoadModule rewrite_module modules/mod_rewrite.so  LoadModule suphp_module modules/mod_suphp.so  suPHP_Engine on suPHP_AddHandler application/x-httpd-php5 # Эти 2 параметра из suphp.conf, описан ниже suPHP_AddHandler application/x-httpd-php56  TypesConfig /etc/mime.types User apache Group apache DirectoryIndex index.php MIMEMagicFile conf/magic  DocumentRoot "/var/www/html"  <Directory "/var/www/html">  #Если хотите "разные сайты от разных пользователей", то правим это тут    suPHP_UserGroup apache apache     Options Indexes FollowSymLinks    Order allow,deny    Allow from all </Directory> EOF 

5) Конфиг suphp. В нем стоит обратить внимание на секцию handlers, именно в ней указываются пути до ваших интерпретаторов и их «имена». Остальное интуитивно понятно. Подробней в документации:

suphp.conf

cat > /usr/local/etc/suphp.conf << EOF [global] logfile=/var/log/suphp.log loglevel=info webserver_user=apache docroot=/ errors_to_browser=false env_path="/bin:/usr/bin" umask=0022 min_uid=1 [handlers] application/x-httpd-php5="php:/usr/bin/php-cgi" application/x-httpd-php56="php:/usr/local/bin/php-cgi" EOF 

6) Теперь в соответствии со всем вышесказанным сформируем 2 тестовых каталога, в которых у нас будут разные версии php. Управление через файл .htaccess, а точнее директиву «AddHandler» в нем:

Скрытый текст

mkdir -p /var/www/html/53 && mkdir -p /var/www/html/56 && echo "<?php phpinfo(); ?>" > /var/www/html/53/index.php && echo "<?php phpinfo(); ?>" > /var/www/html/56/index.php && echo "AddHandler application/x-httpd-php5 .php" > /var/www/html/53/.htaccess && echo "AddHandler application/x-httpd-php56 .php" > /var/www/html/56/.htaccess && chown -R apache:apache /var/www/html 

На этом по большому счету все. Перезапускаем apache, останавливаем iptables (что мы можно было зайти браузером со своего ПК) и проверяем что все работает.

service httpd restart service iptables stop links2 -dump http://localhost/53 | grep 'PHP Version' links2 -dump http://localhost/56 | grep 'PHP Version' 

Еще раз отмечу что это не хаутушка, а лишь общая концепция примерных действий.

ссылка на оригинал статьи http://habrahabr.ru/post/245549/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *