Suse 9.3 z php 5.0.x i 5.2.x

Tym razem opiszemy jak na jednym systemie mieć równolegle 2 różne wersje php. Użyjemy do tego starej i niewspieranej już dystrybucji SUSE 9.3. W repozytorium znajduje się php w wersji 5.0.3 (+ apache 2.0.53). Jeżeli ktoś potrzebuje nowszej wersji tych pakietów, trzeba je ręcznie skompilować. My użyjemy php 5.2.17 wraz z httpd 2.0.64. Co ważne nie rezygnujemy z oficjalnych wersji, więc w systemie będą działać 2 demony apache.
Taka konfiguracja umożliwi zdefiniowanie indywidualnej wersji php dla każdego vhost'a. Oczywiście ręcznie skompilowane php/apache może się przydać w odwrotnej sytuacji. Jeżeli nasz system obsługuje oficjalnie tylko najnowsze php 5.3.x, a niektóre z naszych stron nie są z tą wersją kompatybilne, wtedy możemy doinstalować równolegle starszą wersję.

Kompilacja i konfiguracja httpd 2.0.64

Najnowszą dostępną wersję z serii 2.0.x ściągamy z oficjalnej strony i zapisujemy ją w katalogu /usr/src. Dodatkowo użyjemy lekko zmodyfikowanej łatki ze strony LFS (Linux From Scratch), która zdefiniuje położenie katalogów/plików instalacyjnych (layout FHS).

[root@itcore src]# wget http://artfiles.org/apache.org//httpd/httpd-2.0.64.tar.gz
[root@itcore src]# wget http://tech.itcore.com.pl/wp-content/uploads/2011/04/httpd-2.0.64-config-1.patch
[root@itcore src]# tar xf httpd-2.0.64.tar.gz
[root@itcore httpd-2.0.64]# patch -Np1 -i ../httpd-2.0.64-config-1.patch 
patching file config.layout
patching file srclib/apr/config.layout
patching file srclib/apr-util/config.layout

Kompilujemy httpd do katalogu /opt/httpd2/:

[root@itcore httpd-2.0.64]# ./configure --prefix=/opt/httpd2 --sysconfdir=/opt/httpd2/etc --enable-mods-shared=all --enable-layout=FHS
[root@itcore httpd-2.0.64]# make && make install

Wszystkie pliki znajdują się teraz w katalogu /opt/httpd2/.

[root@itcore httpd-2.0.64]# ls -1 /opt/httpd2/
bin
etc
include
lib
sbin
share
var

Ponieważ oryginalny apache nasłuchuje już na porcie 80, nowy będzie działać na porcie 81. Dodatkowo ustawimy testowego vhost’a (testdomain.itcore.com.pl), który będzie działać używając już nowej wersji php.

[root@itcore ~]# cat /opt/httpd2/etc/httpd.conf 
...
Listen 81
# include vhost
Include /opt/httpd2/etc/vhosts.d/*.conf
[root@itcore ~]# cat /opt/httpd2/etc/vhosts.d/testdomain.itcore.com.pl.conf
<VirtualHost x.x.x.x:81>
	ServerName testdomain.itcore.com.pl
   	DocumentRoot /var/www/testdomain.itcore.com.pl
    	ErrorLog /var/log/hosts/testdomain.itcore.com.pl-error_log
    	CustomLog /var/log/hosts/testdomain.itcore.com.pl-access_log combined

	<Directory "/var/www/testdomain.itcore.com.pl">
        	AllowOverride None
        	Order allow,deny
        	Allow from all
	</Directory>
</VirtualHost>

Restartujemy apache'a:

[root@itcore ~]# /opt/httpd2/sbin/apachectl -k stop
[root@itcore ~]# /opt/httpd2/sbin/apachectl -k start

Jeżeli wszystko działa to testową stronę możemy zobaczyć w przeglądarce wpisując: testdomain.itcore.com.pl:81 (:81 oznacza użycie portu 81). Teraz czas na kompilację php.

Przygotowanie php 5.2.17

Kompilacja php jest zdecydowanie bardziej problematyczna i czasochłonna. Należy doinstalować mnóstwo bibliotek wraz z plikami nagłówkowymi (*-dev albo *-devel). Wszystko zależy od tego jakie opcje wybraliśmy w skrypcie configure. Dla ułatwienia sprawy, możemy podejrzeć z jakimi opcjami zostało skompilowane php w dystrybucji:

[root@itcore ~]# php5 -v
PHP 5.0.3 (cli) (built: May  8 2007 19:43:29)
[root@itcore ~]# php5 -i | grep configure
Configure Command =>  '../configure' '--prefix=/usr' '--datadir=/usr/share/php5' '--mandir=/usr/share/man' '--bindir=/usr/bin' ...

Podobnie jak poprzednio ściągamy źródła z oficjalnej strony php i rozpakowujemy je w katalogu /usr/src. Następnie kompilujemy z obsługą wszystkich modułów, które będą nam potrzebne. Całość instalujemy w katalogu /opt/php52:

[root@itcore src]# tar xf php-5.2.17.tar.gz
[root@itcore src]# cd php-5.2.17
[root@itcore php-5.2.17]# ./configure '--prefix=/opt/php52' '--bindir=/opt/php52/bin' '--libdir=/opt/php52/lib64' '--includedir=/opt/php52/include' \
'--with-libdir=lib64' '--with-_lib=lib64' '--sysconfdir=/opt/php52/etc/php5/cli' '--with-config-file-path=/opt/php52/etc/php5/cli' \
'--with-config-file-scan-dir=/opt/php52/etc/php5/conf.d' '--with-exec-dir=/opt/php52/lib64/php5/bin' '--with-apxs2=/opt/httpd2/sbin/apxs' \
'--enable-magic-quotes' '--enable-libxml' '--enable-session' '--with-pcre-regex' '--enable-xml' '--enable-simplexml' '--enable-spl' \
'--enable-safe-mode' '--enable-sigchild' '--disable-debug' '--enable-memory-limit' '--enable-inline-optimization' '--disable-rpath' '--enable-cli' \
'--with-pear=/opt/php52/share/php5/PEAR' '--enable-bcmath=shared' '--enable-calendar=shared' '--enable-ctype=shared' '--enable-dio=shared' \
'--enable-dom' '--enable-exif=shared' '--enable-filepro=shared' '--enable-ftp=shared' '--enable-gd-native-ttf=shared' '--enable-gd-jis-conv=shared' \
'--enable-mbstring=shared' '--enable-mbregex' '--enable-pcntl=shared' '--enable-posix=shared' '--enable-shmop=shared' '--enable-ucd-snmp-hack=shared' \
'--enable-soap=shared' '--enable-sockets=shared' '--enable-sysvmsg=shared' '--enable-sysvsem=shared' '--enable-sysvshm=shared' '--enable-tokenizer=shared' \
'--with-zlib=shared' '--with-bz2=shared' '--with-curl=shared' '--with-db4=shared' '--with-inifile=shared' '--with-flatfile=shared' \
'--with-fam=shared' '--with-gd=shared' '--enable-gd-native-ttf' '--with-freetype-dir=yes' '--with-ttf' '--with-png-dir=/usr' '--with-jpeg-dir=/usr' \
'--with-zlib-dir=/usr' '--with-gettext=shared' '--with-iconv=shared' '--with-ldap=shared' '--with-mcrypt=shared' '--with-mhash=shared' \
'--with-mysql=shared,/usr' '--with-mysql-sock=/var/lib/mysql/mysql.sock' '--with-ncurses=shared' '--with-openssl=shared' '--with-readline=shared' \
'--with-mm=shared' '--with-xmlrpc=shared' '--with-xsl=shared' '--disable-cgi'
[root@itcore php-5.2.17]# make && make install
[root@itcore php-5.2.17]# ls -1 /opt/php52/
bin
etc
include
lib64
man
share

Sprawdzamy czy nowe php działa:

[root@itcore php-5.2.17]# /opt/httpd2/sbin # /opt/php52/bin/php -v
PHP 5.2.17 (cli) (built: Apr  7 2011 10:15:39) 
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies
[root@itcore php-5.2.17]# /opt/httpd2/sbin # /opt/php52/bin/php -i
...
...

Teraz musimy dodać świeżo skompilowany moduł php do pliku /opt/httpd2/etc/httpd.conf:

[root@itcore ~]# cat /opt/httpd2/etc/httpd.conf 
....
LoadModule php5_module        lib/apache/libphp5.so
...
DirectoryIndex index.php index.html
AddType application/x-httpd-php .php
[root@itcore ~]# /opt/httpd2/sbin/apachectl -k stop
[root@itcore ~]# /opt/httpd2/sbin/apachectl -k start

Jeżeli wszystko poszło bez problemów, testujemy konfigurację, tworząc prostą stronę w php (warto zacząć od phpinfo()) i wpisujemy ponownie adres testomain.itcore.com.pl:81.

Opcja ProxyPass

Dwie różne wersje php i httpd działają równolegle, jednak nie możemy wymagać od użytkowników, żeby wpisywali w przeglądarce :81 dla niektórych stron. Problem ten rozwiążemy używając w głównej instancji httpd (tej działającej na domyślnym porcie 80) modułu mod_proxy. Musimy stworzyć też vhost'a dla naszej testowej domeny testdomain.itcore.com.pl. Będzie on nasłuchiwał domyślnie na porcie 80, ale używając dyrektywy ProxyPass wszystkie zapytania zostaną automatycznie przekierowane na port 81 (czyli do testdomain.itcore.com.pl:81). Co najważniejsze użytkownik nie zauważy żadnych zmian.

[root@itcore ~]# cat /etc/apache2/vhosts.d/testdomain.itcore.com.pl.conf
<VirtualHost x.x.x.x:80>
    ServerName testdomain.itcore.com.pl
    DocumentRoot /var/www/testdomain.itcore.com.pl

    ProxyPreserveHost On
    ProxyPass / http://testdomain.itcore.com.pl:81/
    ProxyPassReverse / http://testdomain.itcore.com.pl:81/

    ErrorLog /var/log/hosts/testdomain.itcore.com.pl-error_log
    CustomLog /var/log/hosts/testdomain.itcore.com.pl-access_log combined
                                                     
</VirtualHost>

Zostaw komentarz


Podpowiedź - możesz użyć tych HTML tagów i atrybutów:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Obraz CAPTCHY

*