Несколько версий 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'
    


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

    Подробнее
    Реклама
    Комментарии 11
    • 0
      Ведь есть php-fpm, то зачем какой-то модуль, если версии php можно раскидать по разным портам?
      • 0
        Нжинкс не хочется настраивать для каждого сайта отдельно. Или есть какая-то серебряная пуля для этого?
        • 0
          так апач сам может fpm, если так хочется.
        • +1
          Если мы предположим что администратор сервера и администратор сайта это разные люди, то в моем случае мы получим ситуацию когда администратор сервера сначала все настраивает, а потом делегирует администратору сайта функцию выбора версии версии. Причем:
          • администратору сайта не нужен доступ к конфигам, веб-сервера, а нужен только к файлам сайта.
          • На одном сайте могут работать разные версии (в разных директориях или даже в одной с разными разрешениями)
          • php для разных сайтов может работать от разных пользователей


          Я конечно не говорю что надо именно так, и не как иначе. Я просто поделился тем, что знаю.
          • 0
            можно еще чуть проще, развернув обе php можно указать в http.conf какие расширения каким php обрабатывать. Например: *.php53 и *.php56

            так Вы получите более гибкую возможность в одном ну ООоочень большом проекте (на к-ом деньги нужно зарабатывать уже сейчас) иметь обе версии (скажем когда осуществляете обновление проекта на более свежую версию php)
        • –1
          Оооочень похожая статья про это была недавно. Правда там совсем нативно, ставить ничего не надо
          • 0
            // @example https://travis-ci.org
            // @see phpenv
            
            • 0
              А как же этот самый новомодный Докер?
              • 0
                Докер это принципиально другой подход. Если он вам подходит, то можно и его использовать, лично мне в этом случае он не подходит.
                • 0
                  А каким образом вы его предлагаете использовать на шаред-хостинге? Поднимать отдельные контейнеры с версиями php и наружу выводить только сокеты?
                  Докер хорош тем что на одном сервере можно поднять кучу контейнеров с совершенно другим ПО, но вот для шаред-хостинга где пользователю нужно на лету из панельки переключать версии php это думаю не подойдет никак.
                  • 0
                    В принципе эту проблему внутри каждого контейнера тоже можно решить, если уже очень надо

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.