[PHP] รัน PHP สองเวอร์ชั่นบน OS เดียวกันผ่าน Apache

เรื่องมีอยู่แว่ .... //ว่า
เซิฟเวอร์ที่ทำงานใช้ PHP 5.1.6 แล้วมีโปรเจคใหม่ที่ต้องใช้ความสามารถของ PHP 5.3.x ขึ้นไป ด้วยความที่ไม่อยากให้ไปกระทบกับโค้ดชุดเก่าเลยคิดว่างั้นก็แยกโค้ดใหม่ออกมาให้มันวิ่งอีกพอร์ทเลยน่าจะดี (อันนี้คิดเอง ไม่รู้ว่ามันถูกหรือผิด) คือถ้าจะปรับโคัดชุดเก่า ก็คงจะลำบากน่าดู เพราะมัน Hard code สุดๆ ชนิดที่ว่ามี ฟังก์ชั่นตัวหนึ่งอยู่เกือบทุกไฟล์ แล้วคร่าวๆ ไฟล์ตัวโค้ดก็มีอยู่ราวๆ เกือบ 20k ... งั้นก็... เอิ่ม ... ปล่อยมันทิ้งไว้อย่างนั้นก็แล้วกัน (จริงๆ เขียนสคริปให้อัพเดทตัวมันเองก็ได้ แต่คิดว่าแค่เทสให้มันทำงานได้เกิน 80% ก็น่าจะอ้วกแล้ว) ตัวโค้ดใหม่ๆ ก็ย้ายมาเขียนบน PHP ตัวใหม่แทน แล้วถ้ามีเวลาว่างมากพอค่อยอัพเดทโค้ดตัวเก่า แค่นี้ก็ไม่น่าจะกระทบของเดิมมากนัก

ส่วนรายละเอียดเซิฟเวอร์ที่ใช้เทสเป็น CentOS 6.6 i386 วิ่งบน VirtualBox เอาที่ใกล้เคียงกับเซิฟเวอร์จริงก็จะมีการลง Apache 2.2, PHP 5.1.6 แล้วก็ PHP 5.3.29

เข้าเรื่อง
อย่างแรกถ้าไม่อยากมีปัญหาให้ลง Dev tools
$ yum groupinstall "Development tools"

ตามด้วย Extra Package บน CentOS
$ wget http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
$ rpm -ivh epel-release-6-8.noarch.rpm

EPEL มันง่ายกับชีวิตเราสุดๆ ฮะ เวลาจะลง Package อะไรแปลกๆ เช่น zbar, ImageMagick ฯลฯ ที่ใน Core yum ของตัว Cent มันไม่มี ... ไม่รู้ว่าศัพท์ทางการเค้าเรียกว่าอะไร

ติดตั้ง Apache
$ yum install httpd httpd-devel
$ chkconfig httpd on
หรืออ่านต่อได้ที่ https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-centos-6

ลองเช็กเวอร์ชั่น
$ httpd -V
Apache 2.2.15

ติดตั้ง PHP 5.1.6
$ wget http://museum.php.net/php5/php-5.1.6.tar.gz
$ tar xvzf php-5.1.6.tar.gz
$ cd php-5.1.6
$  ./configure --with-apxs2=/usr/sbin/apxs --with-zlib --with-gd --with-mysql
$ make && make install
$ cp php.ini-recommed /usr/local/lib/php.ini

ลองเช็กเวอร์ชั่น
$ php -v
PHP 5.1.6

ติดตั้ง PHP 5.3.29
$ wget http://museum.php.net/php5/php-5.3.29.tar.gz
$ tar xvzf php-5.3.29.tar.gz
$ cd php-5.3.29
$  ./configure --prefix=/opt/php53 \
--with-config-file-path=/etc/php53 \
--with-config-file-scan-dir=/etc/php53/php.d \
--enable-fpm \
--with-fpm-user=apache \
--with-fpm-group=apache \
--with-libdir=lib \
--with-mysql \
--with-mysqli \
--with-pdo-mysql \
--with-iconv \
--with-gd
$ make && make install
$ mkdir /etc/php53
$ cp php.ini-production /etc/php53/php.ini

ลองเช็กเวอร์ชั่นกันครับ ต้องเรียก path แบบเต็มๆ
PHP 5.3.29

ที่เหลือก็ก๊อบเค้ามาเกือบหมดเลยครับ
$ sed -i -e 's#php_fpm_CONF=\${prefix}/etc/php-fpm.conf#php_fpm_CONF=/etc/php53/php-fpm.conf#' \
sapi/fpm/init.d.php-fpm
$ cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
$ chmod a+x /etc/init.d/php-fpm
$ /sbin/chkconfig --add php-fpm
$ /sbin/chkconfig php-fpm on

$ cp sapi/fpm/php-fpm.conf /etc/php53/

ปรับ php-fpm.conf โดยแก้ /etc/php53/php-fpm.conf ตัวนี้ผมไม่ปรับอะไรมากแค่ Uncomment ตัวนี้ก็พอ
# pid = run/php-fpm.pid

จากนั้นสั่ง start php-fpm
$ /etc/init.d/php-fpm start

ติดตั้ง mod_fastcgi, mod_fcgid
$ wget http://www.fastcgi.com/dist/mod_fastcgi-current.tar.gz
$ tar -xzf mod_fastcgi-current.tar.gz
$ cd mod_fastcgi-2.4.6
$ cp Makefile.AP2 Makefile
$ make top_dir=/usr/lib/httpd

จากนั้นแก้ httpd.conf โดยแก้ไฟล์ /etc/httpd/conf/httpd.conf แล้วเพิ่ม
# LoadModule fastcgi_module modules/mod_fastcgi.so

$ yum install mod_fcgid
$ mkdir /var/www/fcgi-bin

สุดท้ายคอนฟิก httpd.conf กัน ถ้าลองเข้าไปอ่าน อ้างอิง(1) ในตัวอย่างเค้าทำเป็น Subdomain น่าจะเหมาะกับเว็บทั่วๆไป แต่ด้วยความที่ระบบที่ทำงานมันเป็น Intranet ก็เลยตามน้ำไปก่อนละกัน

Listen 80
Listen 8081

NameVirtualHost 10.0.3.199:80
NameVirtualHost 10.0.3.199:8081

# module settings
# mod_fcgid
<IfModule mod_fcgid.c>
        idletimeout 3600
        processlifetime 7200
        maxprocesscount 17
        maxrequestsperprocess 16
        ipcconnecttimeout 60
        ipccommtimeout 90
</IfModule>

# mod_fastcgi with php-fpm
<IfModule mod_fastcgi.c>
        FastCgiExternalServer /var/www/fcgi-bin/php-fpm -host 127.0.0.1:9000
</IfModule>

################
# Run php-5.1
################
<VirtualHost 10.0.3.199:80>
        DocumentRoot "/var/www/html"
        <Directory "/var/www/html">
                DirectoryIndex index.php index.html index.htm
                Options -Indexes FollowSymLinks
                Order allow,deny
                Allow from all
        </Directory>
</VirtualHost>

################
# Run php-5.3
################
<VirtualHost 10.0.3.199:8081>
        DocumentRoot "/var/www/html"
        <IfModule mod_fastcgi.c>
                ScriptAlias /fcgi-bin /var/www/fcgi-bin
                AddHandler php5-fastcgi .php
                Action php5-fastcgi /fcgi-bin/php-fpm
        </IfModule>
        <Directory "/var/www/html">
                DirectoryIndex index.php index.html index.htm
                Options -Indexes FollowSymLinks +ExecCGI
                Order allow,deny
                Allow from all
        </Directory>
</VirtualHost>

แยกพอร์ทออกมาใช้ 8081 ไปเลยครับจะได้ไม่ต้องวุ่นวายกับของเก่า เสร็จแหล่วววว
ได้แล๊วววว น้ำตาจิไหล

ก่อนหน้านี้เคยเอาลงในเฟสบุคมารอบหนึ่งละ แต่ตอนนั้นยัง งงๆ มันไม่ชนกันได้ยังไงแว๊ะ พอทำไปหลายๆ รอบลองอ่านเยอะๆ ก็เก็ตละ อ๋อ ... ตัว fpm มันวิ่งบน ftp port 9000 ใน local นี่เอง เท่าที่ลอง Google ดูเค้าว่าถ้าวิ่งบน Socket Performance จะดีกว่านี้อีก ... อันนี้เดี๋ยวคงต้องไปลองทีหลังอีกรอบ

ปล.เช็ก Port 9000 ของ httpd
netstat -an | grep :9000

เพิ่มเติม การใช้ Rewrite
ด้วยความที่มันไม่ได้ใช้ apache2handler ก็เลยใช้ .httaccess ไม่ได้ ... แก้ขัดแบบนี้ไปก่อนละกันเด้อ
http://symfony.com/doc/current/cookbook/configuration/web_server_configuration.html#apache-with-mod-php-php-cgi

อ้างอิง
  1. Intall multiple version of php on one server
  2. VirtualHost Examples 
  3. How to Enable EPEL Repository for RHEL/CentOS 7.x/6.x/5.x

    Comments