Дано
Дистрибутив — Debian Jessie (systemd) x86_64
Php — 5.6
Nginx — 1.6.1
Проблема
Запустить на одном сервере/рабочей станции кучу разного кода, в том числе дремучего legacy
Решаем
Сразу оговорюсь, все версии php собираем руками, пакеты готовить не будем. Так как будем собирать довольно древний софт, то заранее подготовим некоторые моменты
Установим необходимый софт
libmysqlclient18 libmysqlclient-dev icu-devtools libicu-dev libedit-dev \
libreadline-dev libsnmp-dev libxslt1-dev libpspell-dev \
libxml2 libxml2-dev pkg-config libbz2-dev libcurl4-openssl-dev \
libmcrypt-dev libmhash-dev libg2-dev libgd2-xpm-dev\
build-essential sqlite sqlite3 libsqlite0-dev libsqlite0 \
libsqlite3-0 libsqlite3-dev libfreetype6-dev \
libt1-5 libt1-dev (для jessie этого пакета не было, вытащил из wheezy)
php 5.2.17
Берем исходники
tar -xjf php-5.2.17.tar.bz2
Немного магии
sudo mkdir -p /usr/include/freetype2/freetype
sudo ln -s /usr/include/freetype2/freetype.h /usr/include/freetype2/freetype/freetype.h
sudo ln -s /usr/lib/x86_64-linux-gnu/libXpm.so.4 /usr/lib/libXpm.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libpng.so /usr/lib/
sudo ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so /usr/lib/
sudo ln -s /usr/lib/x86_64-linux-gnu/libgd.so.3 /usr/lib/libgd.so
cd php-5.2.17/
wget -c http://packages.gwinn.ru/patches/php/5.2.17/libxml29_compat.patch
patch -p0 < libxml29_compat.patch
Собираем
./configure --prefix=/opt/php/5.2 \
--with-libdir=lib64 \
--with-layout=GNU \
--enable-gd-jis-conv \
--enable-gd-native-ttf \
--enable-mbregex \
--enable-calendar \
--enable-exif \
--enable-magic-quotes \
--enable-force-cgi-redirect \
--enable-gd-jis-conv \
--enable-pcntl \
--enable-sockets \
--enable-fastcgi \
--enable-ftp \
--enable-posix=shared \
--enable-mbstring=shared \
--enable-bcmath=shared \
--enable-soap=shared \
--enable-wddx=shared \
--enable-zip=shared \
--enable-dbase=shared \
--enable-pdo=shared \
--enable-json=shared \
--with-pic \
--with-bz2 \
--with-readline \
--with-gettext \
--with-iconv \
--with-pcre-regex \
--with-zlib \
--with-freetype-dir=/usr \
--with-png-dir=/usr \
--with-jpeg-dir=/usr \
--with-xpm-dir=/usr \
--with-t1lib=/usr \
--with-libxml-dir=/usr \
--with-mysql=shared,/usr \
--with-mysqli=shared,/usr/bin/mysql_config \
--with-pgsql=shared,/usr \
--with-curl=shared,/usr \
--with-sqlite=shared,/usr \
--with-pdo-mysql=shared,/usr \
--with-pdo-pgsql=shared,/usr \
--with-pdo-sqlite=shared,/usr \
--with-pdo-odbc=shared,unixODBC,/usr \
--with-xmlrpc=shared \
--with-pspell=shared \
--with-xsl=shared,/usr \
--with-snmp=shared,/usr \
--with-mcrypt=shared,/usr \
--with-mhash=shared,/usr \
--with-ttf=shared,/usr \
--with-gd=shared,/usr \
--disable-rpath \
--disable-debug \
--without-pear \
--without-gdbm
make && sudo make install
Пишем php.ini
sudo vim /opt/php/5.2/etc/php.ini
date.timezone = 'Europe/Moscow'
cgi.fix_pathinfo = 0
magic_quotes_gpc = Off
extension=bcmath.so
extension=curl.so
extension=dbase.so
extension=gd.so
extension=json.so
extension=mbstring.so
extension=mcrypt.so
extension=mhash.so
extension=mysqli.so
extension=mysql.so
extension=pdo_mysql.so
extension=pdo_odbc.so
extension=pdo_pgsql.so
extension=pdo.so
extension=pdo_sqlite.so
extension=pgsql.so
extension=posix.so
extension=pspell.so
extension=snmp.so
extension=soap.so
extension=sqlite.so
extension=wddx.so
extension=xmlrpc.so
extension=xsl.so
extension=zip.so
# Пример добавленного расширения после сборки php
zend_extension=/opt/php/5.2/lib/php/20060613/ZendOptimizer.so
Добавляем настройки окружения для запуска php-cgi
sudo vim /opt/php/5.2/etc/php.env
PHP_FCGI_CHILDREN=4
PHP_FCGI_MAX_REQUESTS=5000
Создаем юнит для автозапуска
sudo vim /etc/systemd/system/php52.service
[Unit]
Description=php-cgi v.5.2 process
[Service]
EnvironmentFile=-/opt/php/5.2/etc/php.env
ExecStart=/opt/php/5.2/bin/php-cgi -b 127.0.0.1:9001 -c /opt/php/5.2/etc/php.ini
# ИЛИ ЖЕ ЧЕРЕЗ СОКЕТ
# ExecStart=/opt/php/5.2/bin/php-cgi -b /var/run/php52.sock -c /opt/php/5.2/etc/php.ini
[Install]
WantedBy=multi-user.target
sudo systemctl enable php52
sudo service php52 start
Nginx
--with-libdir=lib64 \
--with-layout=GNU \
--enable-gd-jis-conv \
--enable-gd-native-ttf \
--enable-mbregex \
--enable-calendar \
--enable-exif \
--enable-magic-quotes \
--enable-force-cgi-redirect \
--enable-gd-jis-conv \
--enable-pcntl \
--enable-sockets \
--enable-fastcgi \
--enable-ftp \
--enable-posix=shared \
--enable-mbstring=shared \
--enable-bcmath=shared \
--enable-soap=shared \
--enable-wddx=shared \
--enable-zip=shared \
--enable-dbase=shared \
--enable-pdo=shared \
--enable-json=shared \
--with-pic \
--with-bz2 \
--with-readline \
--with-gettext \
--with-iconv \
--with-pcre-regex \
--with-zlib \
--with-freetype-dir=/usr \
--with-png-dir=/usr \
--with-jpeg-dir=/usr \
--with-xpm-dir=/usr \
--with-t1lib=/usr \
--with-libxml-dir=/usr \
--with-mysql=shared,/usr \
--with-mysqli=shared,/usr/bin/mysql_config \
--with-pgsql=shared,/usr \
--with-curl=shared,/usr \
--with-sqlite=shared,/usr \
--with-pdo-mysql=shared,/usr \
--with-pdo-pgsql=shared,/usr \
--with-pdo-sqlite=shared,/usr \
--with-pdo-odbc=shared,unixODBC,/usr \
--with-xmlrpc=shared \
--with-pspell=shared \
--with-xsl=shared,/usr \
--with-snmp=shared,/usr \
--with-mcrypt=shared,/usr \
--with-mhash=shared,/usr \
--with-ttf=shared,/usr \
--with-gd=shared,/usr \
--disable-rpath \
--disable-debug \
--without-pear \
--without-gdbm
cgi.fix_pathinfo = 0
magic_quotes_gpc = Off
extension=bcmath.so
extension=curl.so
extension=dbase.so
extension=gd.so
extension=json.so
extension=mbstring.so
extension=mcrypt.so
extension=mhash.so
extension=mysqli.so
extension=mysql.so
extension=pdo_mysql.so
extension=pdo_odbc.so
extension=pdo_pgsql.so
extension=pdo.so
extension=pdo_sqlite.so
extension=pgsql.so
extension=posix.so
extension=pspell.so
extension=snmp.so
extension=soap.so
extension=sqlite.so
extension=wddx.so
extension=xmlrpc.so
extension=xsl.so
extension=zip.so
# Пример добавленного расширения после сборки php
zend_extension=/opt/php/5.2/lib/php/20060613/ZendOptimizer.so
PHP_FCGI_MAX_REQUESTS=5000
Description=php-cgi v.5.2 process
[Service]
EnvironmentFile=-/opt/php/5.2/etc/php.env
ExecStart=/opt/php/5.2/bin/php-cgi -b 127.0.0.1:9001 -c /opt/php/5.2/etc/php.ini
# ИЛИ ЖЕ ЧЕРЕЗ СОКЕТ
# ExecStart=/opt/php/5.2/bin/php-cgi -b /var/run/php52.sock -c /opt/php/5.2/etc/php.ini
[Install]
WantedBy=multi-user.target
sudo service php52 start
В конфигах nginx указываем fastcgi_pass 127.0.0.1:9001 или fastcgi_pass unix:/var/run/php52.sock;
php 5.3.29
Конфигурируем
--with-config-file-path=/opt/php/5.3 \
--with-libdir=/usr/lib/x86_64-linux-gnu \
--with-bz2 \
--with-curl \
--with-gettext \
--with-libedit \
--with-mcrypt \
--with-mhash \
--with-mysql \
--with-pdo-mysql \
--with-pdo-pgsql \
--with-pgsql \
--with-pspell \
--with-readline \
--with-snmp \
--with-xmlrpc \
--with-xsl \
--with-zlib \
--enable-bcmath \
--enable-calendar \
--enable-intl \
--enable-ftp \
--enable-mbstring \
--enable-pcntl \
--enable-soap \
--enable-sockets \
--enable-sqlite-utf8 \
--enable-zip \
--disable-debug
Немного магии
В сгенерированном Makefile находим строчку, которая начинается на EXTRA_LIBS и добавляем сразу после знака равно
Собираем
Пишем php.ini
# Пример добавленного расширения после сборки php
zend_extension=/opt/php/5.3/lib/php/ext/ZendOptimizer.so
Добавляем настройки окружения для запуска php-cgi
PHP_FCGI_MAX_REQUESTS=5000
Создаем юнит для автозапуска
Description=php-cgi v.5.3 process
[Service]
EnvironmentFile=-/opt/php/5.3/etc/php.env
ExecStart=/opt/php/5.3/bin/php-cgi -b 127.0.0.1:9002 -c /opt/php/5.3/etc/php.ini
# ИЛИ ЖЕ ЧЕРЕЗ СОКЕТ
# ExecStart=/opt/php/5.3/bin/php-cgi -b /var/run/php53.sock -c /opt/php/5.3/etc/php.ini
[Install]
WantedBy=multi-user.target
sudo service php53 start
Nginx
В конфигах nginx указываем fastcgi_pass 127.0.0.1:9002 или fastcgi_pass unix:/var/run/php53.sock;
php 5.4 и php 5.5
Собираются без магии, по тому же принципу что и остальные версии
i386
Особых отличий от x86_64 не будет, разве что —with-libdir=/usr/lib/x86_64-linux-gnu надо будет заменить на —with-libdir=/usr/lib/i386-linux-gnu
http://phpbrew.github.io/phpbrew/
Ага, еще phpenv есть, но я со времен пользования rbenv этот метод не очень люблю, к тому же, на сервере, имхо, такие штуки использовать не комильфо.
А собирать софт на сервере без пакетов комильфо значит?
в /opt — вполне, текущую стабильную версию — пакетом из репозитория.
Thanks a lot for this man, I am too working with old legacy shit… 🙂