Обновление PHP до 5.3.19 из сырцов + обновление OpenSSL до 0.9.8x из сырцов

Дата Автор cdb1 комментарий

Данная статья устарела, оставлена исключительно для желающих покомпилировать php. Остальным людям предлагаю поставить php5.5 из репозитария, т.к. в нем он относительно свежий и телодвижений требуется совершить меньше.


Написал я как-то год назад себе мануальчик как ставить php из сырцов, а сегодня столкнулся с проблемой обработки https. И все бы ничего — создал устройство /dev/urandom и отключил проверку сертификатов — вроде бы что-то заработало, но работало это что-то через раз. Т.е. file_get_contents тянул файлы каждый третий раз, в остальное время выдавая ошибки SSL подобного плана:

Warning: file_get_contents() [function.file-get-contents]: SSL: Success in /../../1.php on line ....
Warning: file_get_contents() [function.file-get-contents]: Failed to enable crypto in /../../1.php on line ...
Warning: file_get_contents(https://gmail.com) [function.file-get-contents]: failed to open stream: operation failed in /../../1.php on line ...

На просторах интернетов проблема обычно решалась «переходом на CURL» — такой вариант меня не устроил и я нашел себе развлечение на пару дней 🙂 Как выяснилось — в состав Ubuntu 10.04 входит крайне древняя версия openssl 0.9.8k от 2009 года, которая и содержала глюки. За одно было решено и php обновить. Собственно запишу ниже как ставил.

Эта статья является продолжением этого мануала

Подготовка
Сначала ставим пакеты, необходимые для компиляции PHP 5.3.19 и прочего добра:

sudo apt-get install autoconf2.13 libcurl4-openssl-dev libmysqld-dev libssl-dev libcurl4-gnutls-dev libjpeg62-dev libpng12-dev  libmysql++-dev libfreetype6-dev libt1-dev libc-client-dev mysql-client libevent-dev libxml2-dev libtool libmcrypt-dev

А еще нам потребуется checkinstall для автоматической сборки пакетов:

sudo apt-get install checkinstall

Теперь поставим новый OpenSSL из исходников

cd /usr/local/src/
wget -O ./openssl-0.9.8x.tar.gz http://www.openssl.org/source/openssl-0.9.8x.tar.gz
tar xvfz ./openssl-0.9.8x.tar.gz
rm ./openssl-0.9.8x.tar.gz
cd ./openssl-0.9.8x
./config
make
make test
sudo checkinstall --type=debian --default --pkgname=openssl-0.9.8x -pkgversion=1

После удачной установки наш OpenSSL будет находиться тут /usr/local/ssl, теперь подправим маленько конфиги:
/etc/manpath.config
добавим строчку

MANPATH_MAP     /usr/local/ssl/bin      /usr/local/ssl/man

Далее обновим базу мануалов:

sudo mandb

Поправим файл переменных окружения /etc/environment добавив наш путь /usr/local/ssl/bin перед /usr/bin
Теперь перелогинимся. Если в консоли набрать openssl version то увидим что-то типа:

OpenSSL 0.9.8x 10 May 2012

Старые программы, скомпилированные под старый OpenSSL продолжат работать на старых библиотеках, а PHP мы сейчас соберем.

Ставим PHP 5.3.19 из сырцов

cd /usr/local/src
wget -O ./php-5.3.19.tar.gz http://php.net/get/php-5.3.19.tar.gz/from/ru2.php.net/mirror
tar xvfz ./php-5.3.19.tar.gz
rm ./php-5.3.19.tar.gz
cd ./php-5.3.19

Конфигурируем с указанием пути к новому OpenSSL:

./configure --enable-inline-optimization --enable-fpm --with-mcrypt --enable-mbstring --with-openssl=/usr/local/ssl --with-mysql --with-mysql-sock --with-gd --with-jpeg-dir=/usr/lib --enable-gd-native-ttf  --with-pdo-mysql --with-libxml-dir=/usr/lib --with-mysqli=/usr/bin/mysql_config --with-curl --enable-zip  --enable-sockets --with-zlib --enable-exif --enable-ftp --with-iconv --with-gettext --enable-gd-native-ttf --with-t1lib=/usr --with-freetype-dir=/usr --prefix=/usr/local/php --with-fpm-user=www-data -–with-fpm-group=www-data --with-fpm-conf=/usr/local/php/etc/php-fpm.conf --with-config-file-path=/usr/local/php/etc

Останавливаем и сносим старый php, установленный по этому мануалу

sudo service php-fpm stop
sudo dpkg -r php

Собираем и ставим новый:

sudo checkinstall --type=debian --default --pkgname=php-5.3.19 -pkgversion=1

После сборки встанет он туда же, куда и старый и конфиги автоматически сами подхватятся. Правда после обновления PHP до версии наш скомпилированный eaccelerator не сможет работать и его надо будет переустановить по мануалу.

Осталось помочь OpenSSL работать в chroot в php-fpm — для этого в папке chroot нашего сайта создадим /dev/urandom и подобные источники.

sudo mkdir /home/koteika.ru/dev
sudo mknod /home/koteika.ru/dev/urandom c 1 9
sudo mknod /home/koteika.ru/dev/null c 1 3
sudo mknod /home/koteika.ru/dev/zero c 1 5
sudo chmod 666 dev/null dev/zero dev/urandom

А поскольку скрипты будут работать в chroot то им надо иметь доступ к сертификатам для проверки https. Скопируем в chroot нашего сайта папку симлинков и самих сертификатов:

mkdir /home/koteika.ru/etc/ssl
cp -R /etc/ssl/certs /home/koteika.ru/etc/ssl/certs
mkdir /home/koteika.ru/usr/share 
cp -R /usr/share/ca-certificates /home/koteika.ru/usr/share/ca-certificates
cp -R /usr/share/ssl-cert /home/koteika.ru/usr/share/ssl-cert

Обновлять сертификаты у сайта придется теперь ручками %)
Запускаем php

sudo service php-fpm start


Во время экспериментов перепробовал разные версии OpenSSL — версии выше 0.9.8 у меня работали, но из под PHP я так и не смог заставить брать сертификаты из папки (даже принудительно указанной в скрипте PHP, хотя принудительно из одного файла сертификатов работало нормально).

Если вам понравилась моя статья, пожалуйста, не поленитесь кликнуть любую кнопочку ниже, или кинуть ссылку на статью в свой блог или форум. Всегда рад ответить на ваши вопросы в комментариях. Спасибо 🙂

Один комментарий на «Обновление PHP до 5.3.19 из сырцов + обновление OpenSSL до 0.9.8x из сырцов»

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

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