Running Beberapa Versi PHP secara bersamaan di Ubuntu 22.04

Beberapa waktu yang lalu saya mendapatkan amanah untuk menangani dua project. Kebetulan kedua project ini saling terintegrasi dan memiliki requirement yang berbeda. Project pertama menggunakan PHP versi 7.4 dan project kedua menggunakan PHP versi 8.1. Karena keduanya saling terintegrasi, kedua project ini harus running secara bersamaan dan terdapat kendala karena menggunakan LAMPP stack biasa hanya bisa running satu versi PHP saja. Setelah membaca beberapa referensi, kita bisa gunakan PHP-FPM mengatasi kendala tersebut.

PHP-FPM (FastCGI Process Manager) adalah implementasi utama FastCGI PHP yang mengandung beberapa fitur yang (sebagian besar) berguna untuk situs dengan beban berat.

Fitur-fitur ini meliputi:

  • manajemen proses lanjutan dengan stop/start yang halus;
  • pools yang memberikan kemampuan untuk memulai worker dengan uid/gid/chroot/environment yang berbeda, mendengarkan port yang berbeda, dan menggunakan php.ini yang berbeda (menggantikan safe_mode);
  • logging stdout dan stderr yang dapat dikonfigurasi;
  • restart darurat jika terjadi penghancuran tak disengaja pada cache opcode;
  • dukungan upload yang dipercepat;
  • "slowlog" - mencatat skrip (bukan hanya nama mereka, tetapi juga backtrace PHP mereka juga, menggunakan ptrace dan hal serupa untuk membaca execute_data proses remote) yang dieksekusi dengan kecepatan yang luar biasa lambat;
  • fastcgi_finish_request() - fungsi khusus untuk menyelesaikan permintaan dan mengosongkan semua data sambil tetap melakukan sesuatu yang membutuhkan waktu (konversi video, pemrosesan statistik, dll.);
  • pemunculan anak dinamis/berdasarkan permintaan/statis;
  • info status dasar dan diperluas (mirip dengan Apache mod_status) dengan berbagai format seperti json, xml, dan mendukung openmetrics;
  • file konfigurasi berbasis php.ini.

Jadi berdasarkan referensi dari web resmi PHP, PHP-FPM ini dapat mengelola multiple versi PHP dalam satu single instance. Berbeda dengan yang sebelumnya saya tulis di tutorial setup dan menggunakan multiple version PHP sebelumnya yang hanya bisa running satu versi PHP saja, kita bisa menggunakan PHP FPM yang digabungkan dengan apache dan juga virtual host untuk running project menggunakan beberapa versi PHP yang berbeda secara bersamaan.

Persyaratan

Terdapat beberapa persyaratan untuk mengikuti tutorial ini, yaitu:

  1. Server atau komputer atau laptop dengan OS Ubuntu 22.04. Pada percobaan ini saya menggunakan laptop dengan OS Ubuntu 22.04
  2. Apache web server yang sudah terinstall dan sudah berjalan.

Overview

Studi kasus dalam tutorial ini adalah kita akan menjalankan dua aplikasi web dengan versi PHP yang berbeda.

  1. Aplikasi web pertama dengan domain http://app_one.test dengan PHP versi 7.4
  2. Aplikasi web kedua dengan domain http://app_two.test dengan PHP versi 8.1

Goal dari tutorial ini adalah kedua aplikasi web berjalan menggunakan PHP versi yang disebutkan di atas.

Step 1 - Install PHP Versi 7.4 dan 8.1 dengan PHP-FPM

Pada tahapan ini kita akan menginstall PHP versi 7.4, PHP versi 8.1, PHP-FPM dan beberapa extention yang diperlukan. Selain itu kita juga perlu menginstall beberapa software dan repositori yang diperlukan.

Pertama kita install terlebih dahulu software-properties-common. Buka terminal, lalu run command berikut ini untuk menginstall software-properties-common.

sudo apt install software-properties-common -y 

Tunggu sampai proses install software-properties-common selesai.

Sekarang kita tambahkan repositori ondrej/php ke dalam sistem kita untuk menginstall beberapa versi PHP. Buka kembali terminal, lalu kita tambahkan repositori ondrej/php.

sudo add-apt-repository ppa:ondrej/php

Selanjutnya update repositori.

sudo apt update -y

Tunggu sampai proses update repositori selesai.

Sekarang kita sudah bisa menginstall PHP versi 7.4 dan PHP versi 8.1 dan beberapa extension yang diperlukan.

Buka kembali terminal, lalu kita install PHP versi 7.4 dan extension menggunakan command berikut ini.

sudo apt-get install php7.4 php7.4-fpm php7.4-mysql libapache2-mod-php7.4 libapache2-mod-fcgid -y

Tunggu sampai proses instalasi selesai.

Berikut ini adalah penjelasan command di atas:

  1. sudo: Menggunakan hak akses superuser (root) untuk menjalankan perintah. Dibutuhkan hak akses superuser untuk menginstal atau menghapus paket perangkat lunak.

  2. apt-get: Manajer paket untuk sistem operasi berbasis Debian, termasuk Ubuntu. Digunakan untuk menginstal, menghapus, dan mengelola paket perangkat lunak.

  3. install: Opsi dari apt-get yang digunakan untuk menginstal paket-paket yang disebutkan setelahnya.

  4. php7.4: Instalasi paket PHP versi 7.4. Ini mencakup inti PHP dan paket-paket standar.

  5. php7.4-fpm: FastCGI Process Manager untuk PHP versi 7.4. Ini memungkinkan menjalankan PHP dengan menggunakan FastCGI, yang dapat meningkatkan kinerja situs web.

  6. php7.4-mysql: Integrasi MySQL untuk PHP versi 7.4. Paket ini diperlukan jika Anda berencana untuk menggunakan PHP dengan database MySQL.

  7. libapache2-mod-php7.4: Modul Apache untuk mengintegrasikan PHP versi 7.4 dengan server web Apache. Diperlukan agar Apache dapat memproses dan menjalankan skrip PHP.

  8. libapache2-mod-fcgid: Modul Apache untuk mendukung FastCGI. Digunakan ketika PHP dijalankan melalui FastCGI Process Manager.

  9. -y: Opsi untuk memberikan persetujuan otomatis saat instalasi. Dengan menambahkan opsi ini, perintah tidak akan menunggu konfirmasi dari pengguna dan secara otomatis menginstal paket-paket yang dibutuhkan.

Selanjutnya kita install juga PHP 8.1 dan extension yang diperlukan menggunakan command berikut ini.

sudo apt-get install php8.1 php8.1-fpm php8.1-mysql libapache2-mod-php8.1 libapache2-mod-fcgid -y

Tunggu sampai proses install PHP 8.1 selesai.

Selanjutnya kita cek start php7.4-fpm.

sudo systemctl start php7.4-fpm

Lalu kita verifikasi status php7.4-fpm.

sudo systemctl status php7.4-fpm

Output yang ditampilkan:

● php7.4-fpm.service - The PHP 7.4 FastCGI Process Manager
     Loaded: loaded (/lib/systemd/system/php7.4-fpm.service; enabled; vendor pr>
     Active: active (running) since Mon 2024-01-08 07:54:44 WIB; 1h 33min ago
       Docs: man:php-fpm7.4(8)
    Process: 1495 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run>
   Main PID: 1223 (php-fpm7.4)
     Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req>
      Tasks: 3 (limit: 18923)
     Memory: 23.1M
        CPU: 325ms
     CGroup: /system.slice/php7.4-fpm.service
             ├─1223 "php-fpm: master process (/etc/php/7.4/fpm/php-fpm.conf)" ">
             ├─1491 "php-fpm: pool www" "" "" "" "" "" "" "" "" "" "" "" "" "" >
             └─1493 "php-fpm: pool www" "" "" "" "" "" "" "" "" "" "" "" "" "" >

Selanjutnya kita start juga php8.1-fpm.

sudo systemctl start php8.1-fpm

Setelah itu kita verifikasi status php8.1-fpm.

● php8.1-fpm.service - The PHP 8.1 FastCGI Process Manager
     Loaded: loaded (/lib/systemd/system/php8.1-fpm.service; enabled; vendor pr>
     Active: active (running) since Mon 2024-01-08 07:54:44 WIB; 1h 35min ago
       Docs: man:php-fpm8.1(8)
    Process: 1293 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run>
   Main PID: 1225 (php-fpm8.1)
     Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req>
      Tasks: 3 (limit: 18923)
     Memory: 19.9M
        CPU: 333ms
     CGroup: /system.slice/php8.1-fpm.service
             ├─1225 "php-fpm: master process (/etc/php/8.1/fpm/php-fpm.conf)" ">
             ├─1291 "php-fpm: pool www" "" "" "" "" "" "" "" "" "" "" "" "" "" >
             └─1292 "php-fpm: pool www" "" "" "" "" "" "" "" "" "" "" "" "" "" >

Kedua service php7.4-fpm dan php8.1-fpm sudah active.

Selanjutnya kita enable beberapa modul supaya service apache2 dapat bekerja dengan beberapa versi PHP.

sudo a2enmod actions fcgid alias proxy_fcgi

Perintah Linux tersebut digunakan untuk mengaktifkan beberapa modul Apache yang diperlukan untuk mengonfigurasi FastCGI, yang dapat digunakan untuk meningkatkan kinerja dan skalabilitas server web. Berikut adalah penjelasan singkat untuk setiap modul yang diaktifkan oleh perintah tersebut:

  1. sudo: Menggunakan hak akses superuser (root) untuk menjalankan perintah. Dibutuhkan hak akses superuser untuk melakukan konfigurasi pada level sistem.

  2. a2enmod: Ini adalah skrip utilitas di lingkungan Debian (termasuk Ubuntu) yang digunakan untuk mengaktifkan modul-modul Apache.

  3. actions: Modul Actions digunakan untuk mendefinisikan aksi yang dapat dilakukan oleh server Apache berdasarkan peristiwa tertentu, seperti permintaan HTTP tertentu.

  4. fcgid: Modul FCGID (FastCGI) adalah modul untuk Apache yang mendukung FastCGI, yang memungkinkan server web menjalankan skrip PHP secara efisien dan terisolasi.

  5. alias: Modul Alias memungkinkan Anda membuat alias atau pemetaan URL yang dapat digunakan untuk menyederhanakan struktur URL pada server web.

  6. proxy_fcgi: Modul ini memungkinkan Apache untuk bertindak sebagai pengaturan antara server web dan server FastCGI, mengarahkan permintaan PHP ke FastCGI Process Manager.

Dengan mengaktifkan modul-modul ini, Anda dapat mengonfigurasi Apache untuk mengelola permintaan PHP menggunakan FastCGI, yang dapat meningkatkan kinerja dan responsifitas server web Anda. Setelah menjalankan perintah ini, selanjutnya kita perlu me-restart server Apache agar perubahan konfigurasi berlaku dengan perintah berikut ini.

sudo service apache2 restart

Step 2 - Setup Project

Pada tahapan ini kita akan coba setup project sesuai yang sudah kita bahas di section overview di atas. Kita akan buat dua direktori project untuk php versi 7.4 dan php versi 8.1.

Sekarang kita buat direktori untuk kedua project, yaitu app_one.test dan app_two.test.

sudo mkdir /var/www/app_one.test
sudo mkdir /var/www/app_two.test
sudo chown -R www-data:www-data /var/www/app_one.test
sudo chown -R www-data:www-data /var/www/app_two.test
sudo chmod -R 755 /var/www/app_one.test
sudo chmod -R 755 /var/www/app_two.test

Selanjutnya kita buat file index.php di kedua project kita. Pada file ini kita gunakan untuk menampilkan informasi versi PHP yang digunakan.

Kita buat file index.php untuk project app_one.test terlebih dahulu. Buka terminal, lalu run command berikut ini.

sudo nano /var/www/app_one.test/index.php 

Selanjutnya kita ketik baris kode berikut ini.

<?php phpinfo(); ?>

Save kembali file /var/www/app_one.test/index.php.

Selanjutnya kita buat juga file index.php untuk project app_two.test.

sudo nano /var/www/app_two.test/index.php

Selanjutnya kita ketik baris kode berikut ini.

<?php phpinfo(); ?>

Save kembali file /var/www/app_two.test/index.php.

Step 3 - Mengatur Konfigurasi Apache untuk kedua project

Pada tahapan ini kita akan membuat dua file konfigurasi virtual host. Dengan konfigurasi ini, kedua project kita dapat berjalan secara bersamaan.

Sekarang kita buat file konfigurasi untuk project app_one.test dengan menggunakan php versi 7.4.

sudo nano /etc/apache2/sites-available/app_one.test.conf

Lalu kita tambahkan konfigurasi berikut ini.

<VirtualHost *:80>
     ServerAdmin admin@app_one.test
     ServerName app_one.test
     DocumentRoot /var/www/app_one.test
     DirectoryIndex index.php

     <Directory /var/www/app_one.test>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
     </Directory>

    <FilesMatch \.php$>
        # From the Apache version 2.4.10 and above, use the SetHandler to run PHP as a fastCGI process server
         SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
    </FilesMatch>

     ErrorLog ${APACHE_LOG_DIR}/app_one.test_error.log
     CustomLog ${APACHE_LOG_DIR}/app_one.test_access.log combined
</VirtualHost>

Save kembali file /etc/apache2/sites-available/app_one.test.conf.

Selanjutnya kita buat file konfigurasi kedua untuk project app_two.test dengan php versi 8.1.

sudo nano /etc/apache2/sites-available/app_two.test.conf

Lalu kita tambahkan konfigurasi berikut ini.

<VirtualHost *:80>
     ServerAdmin admin@app_two.test
     ServerName app_two.test
     DocumentRoot /var/www/app_two.test
     DirectoryIndex index.php

     <Directory /var/www/app_two.test>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
     </Directory>

    <FilesMatch \.php$>
        # From the Apache version 2.4.10 and above, use the SetHandler to run PHP as a fastCGI process server
         SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost"
    </FilesMatch>

     ErrorLog ${APACHE_LOG_DIR}/app_two.test_error.log
     CustomLog ${APACHE_LOG_DIR}/app_two.test_access.log combined
</VirtualHost>

Save kembali file /etc/apache2/sites-available/app_two.test.conf.

Sekarang kita cek apakah konfigurasi sudah sesuai.

sudo apachectl configtest

Output yang ditampilkan

Syntax OK

Selanjutnya kita enable kedua file konfigurasi virtual host yang sudah kita tambahkan.

sudo a2ensite app_one.test
sudo a2ensite app_two.test

Selanjutnya kita restart service apache untuk mengimplementasi perubahan konfigurasi.

sudo systemctl restart apache2

Step 4 - Menambahkan domain ke /etc/hosts

Selanjutnya kita tambahkan domain kedua project kita ke file /etc/hosts.

Buka file /etc/hosts menggunakan command berikut ini.

sudo nano /etc/hosts

Lalu tambahkan domain app_one.test dan app_two.test.

127.0.0.1     app_one.test
127.0.0.1     app_two.test

Save kembali file /etc/hosts.

Step 5 - Uji Coba

Tahapan selanjutnya adalah menguji coba apakah kedua project kita berjalan dan apakah kedua project kita menggunakan versi PHP yang sesuai.

Sekarang kita buka project kita di browser dengan mengetikan http://app_one.test di url. Selanjutnya kita bisa lihat project app_one.test menampilkan informasi PHP yang digunakan. Project app_one.test

Bisa kita lihat pada gambar di atas, versi PHP yang digunakan adalah PHP versi 7.4

Selanjutnya kita buka project kedua di browser dengan mengetikan http://app_two.test. Selanjutnya kita bisa lihat tampilah project app_two.test dan informasi PHP yang digunakan. Project app_two.test Bisa kita lihat pada gambar di atas, versi PHP yang digunakan adalah PHP versi 8.1.

Penutup

Pada tutorial ini kita sudah mencoba menggunakan PHP-FPM, apache dan virtual host untuk run project dengan versi PHP yang berbeda secara bersamaan. Ini bisa dijadikan sebagai salah satu alternatif solusi ketika kita menangani beberapa project secara bersamaan dengan versi PHP yang berbeda.

Kalau kamu, solusi apa yang kamu gunakan ketika menangani project dengan requirement yang berbeda? Boleh sharing-sharing di kolom komentar ya.

Gun Gun Priatna
Software Engineer, Content Writer and Founder qadrlabs.com
Related Article
Komentar

blog comments powered by Disqus