-
PHP 7 obok standardowego PHP dzięki yumchroot
Prędzej czy później nadchodzi taki moment, że trzeba założyć na CentOS nowszego PHP. Można po prostu upgradować php-5.3 który jest w dystrybucji, ale czasami lepiej tego nie ruszać. Wiadomo, upgrade PHP, szczególnie poważny, to zawsze ryzyko, że coś pisane „pod” starego PHP się sypnie. Najprostsza metoda, to wykompilowanie nowego php gdzieś obok i podłączenie go jako FPM do konkretnego vhost-a. Ale wtedy tracimy większość zalet systemu RPM, w tym różne automatyczne aktualizacje, sprawdzanie spójności i to wszystko, co powoduje, że korzystamy z RPM. Można zrobić kontener i tam postawić osobną instancję systemu z nowym php, ale ja postanowiłem zastosować jeszcze „lżejsze” rozwiązanie. Od zawsze istnieje w linuksie mechanizm chroot i właśnie z niego postanowiłem skorzystać. Posiłkowałem się świetnym poradnikiem http://prefetch.net/articles/yumchrootlinux.html. Tylko zmodyfikowałem kilka rzeczy.
Na początek, instalujemy pakiet yum-utils, nie jest konieczny ale się przydayum install yum-utils
Teraz zakładamy katalog roboczy dla ściąganych plików i docelowy katalog gdzie zainstalujemy nasze środowisko:
mkdir jail
cd jail
mkdir -p /chroot/php7/
I zaczynamy
rpm --root /chroot/php7/ --initdb
yumdownloader redhat-release -destdir=.
rpm --root /chroot/php7/ -ivh centos-release-7-3.1611.el7.centos.x86_64.rpm
Co zrobiliśmy? Skorzystaliśmy z opcji
--root
programu rpm aby zainicjalizować bazę programu rpm w naszym izolowanym środowisku. Następnie pobraliśmy pakiet centos-release i go w tym środowisku zainstalowaliśmy. Do tego przydał się program yum-downloader z pakietu yum-utils, to tam znalazł nam właściwy pakiet zawierający „redhat-release”. Można by sobie poradzić bez niego, pobierając pakiet „ręcznie”. Mamy już założony „szkielet”, możemy jechać dalej.wget https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
yumdownloader epel-release -destdir=.
rpm --root=/chroot/php7/ -ivh epel-release-7-10.noarch.rpm
rpm --root=/chroot/php7/ -ivh webtatic-release.rpm
yum --installroot=/chroot/php7/ -y install php71w-fpm
W zasadzie wygląda to jak zwykła instalacja php71 z repozytorium webtatic, ale działamy w izolowanym środowisku, więc nic nam się nie konfliktuje. Parametr –installroot programu yum działa identycznie jak –root dla rpm-a.
Teraz możemy sobie doinstalować potrzebne moduły, np.
yum --installroot=/chroot/php7/ -y install php71w-mysql php71w-pdo php71w-pear php71w-mbstring php71w-mcrypt php71w-bcmath
Nasze izolowane środowisko potrzebuje jeszcze kilku plików specjalnych w katalogu /dev/. Normalnie, załatwia to udev, ale tu go nie ma, a bez tych plików, niektóre rzeczy mogą działać dziwnie. No to zakładamy „urządzenia”.
cd /chroot/php7/dev
mknod null c 1 3
mknod zero c 1 5
mknod random c 1 8
mknod urandom c 1 9
mknod tty c 5 0
chgrp tty tty
chmod go+w *
Startujemy naszego php-fpm przez „/sbin/chroot /chroot/php7 /usr/sbin/php-fpm”. Ja sobie stworzyłem odpowiedni do /etc/rc.d/init.d i startuje mi automatycznie. Próbowałem przekonać systemd żeby robił to bezpośrenio, ale po kilku próbach się poddałem. Na koniec została jeszcze jedna sprawa. php71 działający w chroot-cie oczywiście nie widzi nic „powyżej” swojego „korzenia”. Jeśli nasz vhost jest powiedzmy w katalogu /var/www/vhost1 to nie ma szans, żeby php7 „dobrał się” do plików tam znajdujących. Jest na to prosta recepta, przenosimy pliki do /chroot/php7/var/www/vhotst1 i robimy linka do /var/www/. Dzięki temu zarówno apache działający w „macierzystym” systemie jak i php7 działający w środowisku izolowanym, będą widziały takie same ścieżki. Warto też porobić inne linki, np. dla /var/log/php-fpm, /var/run/php-fpm czy /etc/php-fpm. No i przy okazji robienia yum update zrobić też
yum --installroot=/chroot/php7/ update
A o tym jak podłączyć php-fpm-a do apache, to można poczytać w innych artykułach.