Так уж получилось, что клиенту для сайта потребовалась более новая версия php, не ниже 5.3.3. Сервер, на котором располагался клиент, имеет на борту php 5.2.8, в виде модуля Apache, под управлением панели Plesk 9.5.4. В новых версия Plesk Parallels Panel (> 11v) для переключения виртуального хоста между разными версиями php есть решения «из коробки». На текущей же версии панели хостинга коробочного решения не было, нужно было что-то придумать, кроме как переносить сайт на новый сервер, т.к. это затруднительно, ведь у этого сайта было множество поддоменов в этой же учётной записи). Было принято решение: собрать из исходников отдельный индивидуальный инстанс php требуемой версии и подцепить его к apache как cgi. Тем самым клиент не только получил требуемую версию php, но и не лишился выполнения .htaccess через mod_rewrite (apache). Как это было.
Сборка осуществляется из-под пользователя-владельца виртуального хоста, для примера: сайт example.com, пользователь exampleus, группа examplegr. Создаём директорию - куда будем устанавливать файлы нового php-интерпретатора. Скачиваем исходный код php 5.3.29 из «музея» php в отдельную приватную директорию, разархивируем архив.
> mkdir -p /usr/local/www/vhosts/example.com/private/php > cd /usr/local/www/vhosts/example.com/private > wget http://museum.php.net/php5/php-5.3.29.tar.bz2 > tar -xjvf php-5.3.29.tar.bz2 > cd php-5.3.29/
Исходный код есть, теперь нужно его настроить для компиляции и установки. Как посмотреть все доступные опции сборки:
> ./configure --help | less
Изучаем конфиг, сравниваем с требованиями и создаём команду для сборки, у меня получилось следующее (основной префикс /usr/local/www/vhosts/example.com/private/php - директория, куда будут установлены бинарные файлы, библиотеки и маны):
> ./configure --prefix=/usr/local/www/vhosts/example.com/private/php --with-mysql --with-mysqli --with-layout=GNU --enable-ftp --with-config-file-scan-dir=/usr/local/www/vhosts/example.com/private/php --enable-libxml --with-pcre-regex=yes --with-regex=php --with-gdbm --with-ndbm --with-iconv --with-gd --enable-gd-native-ttf --with-jpeg-dir=/usr/local/lib --with-png-dir --with-freetype-dir --with-zlib-dir --disable-posix --enable-inline-optimization --without-pear --disable-debug --with-libdir=lib64 --enable-zend-multibyte --enable-mbstring --enable-bcmath --with-bz2 --enable-calendar --with-curl --with-gettext --with-mcrypt --enable-shared --enable-exif --with-gmp --with-imap --with-openssl --with-pdo-mysql --with-xsl --enable-zip --with-imap-ssl
Внимательно следим за процессом конфигурации, в случае ошибок внимательно изучаем config.log, формируемый в процессе configure. После настройки сборки - запускаем компиляцию!
> make install clean
Теперь копируем бинарник в cgi-bin, откуда он будет вызываться как CGI и выставляем правильные права и пользователя:группу.
> cp /usr/local/www/vhosts/example.com/private/php/bin/php-cgi /usr/local/www/vhosts/example.com/cgi-bin/ > chmod 755 /usr/local/www/vhosts/example.com/cgi-bin/php-cgi > chown exampleus:examplegr /usr/local/www/vhosts/example.com/cgi-bin/php-cgi
И копируем серверный php.ini для php-cgi, обязательно в папку, где сидит бинарник. Если серверный php и вновь собранный php разных версий (5.2 и 5.3), как в данном случае, конфигурационный файл php.ini следует скопировать из исходников php-5.3.29, из которых мы собирали бинарные файлы новой версии.
> cp /usr/local/etc/php.ini /usr/local/www/vhosts/example.com/cgi-bin/ # Серверный php.ini > cp /usr/local/www/vhosts/example.com/private/php-5.3.29/php.ini-production /usr/local/www/vhosts/example.com/cgi-bin/php.ini # Из исходников
После завершения сборки и установки - проверим, собрался ли php-cgi со всеми теми параметрами, которые нам требуются.
> cd /usr/local/www/vhosts/example.com/cgi-bin/ > ./php-cgi -m
В настройки виртуального хоста (httpd.conf) или в .htaccess добавляем инструкции для обработки php-файлов нашим вновь собранным php-cgi. Ниже - два варианта как это можно указать, оба рабочих.
Первый вариант.
AddType application/x-httpd-phpcgi .php Action application/x-httpd-phpcgi /cgi-bin/php-cgi
Второй вариант.
AddHandler php-script .php Action php-script /cgi-bin/php-cgi
В обоих вариантах бинарник располагается в /cgi-bin/, поэтому для apache нужно создать алиас /cgi-bin/, указывающий на абсолютный путь к директории с php-cgi.
ScriptAlias /cgi-bin/ /usr/local/www/vhosts/example.com/cgi-bin/ # For httpd
Через файлик .htaccess изменения подхватываются на лету, но изменения вносились также в конфигурационный файл httpd.conf, поэтому требуется перезапуск web-сервера.
# /usr/local/etc/rc.d/apache2 restart
Проверяем, работает ли наш php как cgi (через браузер) и удаляем исходный код php.
> rm -R /usr/local/www/vhosts/example.com/private/php-5.3.29*
Done!