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:
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.
Terdapat beberapa persyaratan untuk mengikuti tutorial ini, yaitu:
Studi kasus dalam tutorial ini adalah kita akan menjalankan dua aplikasi web dengan versi PHP yang berbeda.
http://app_one.test
dengan PHP versi 7.4http://app_two.test
dengan PHP versi 8.1Goal dari tutorial ini adalah kedua aplikasi web berjalan menggunakan PHP versi yang disebutkan di atas.
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:
sudo
: Menggunakan hak akses superuser (root) untuk menjalankan perintah. Dibutuhkan hak akses superuser untuk menginstal atau menghapus paket perangkat lunak.
apt-get
: Manajer paket untuk sistem operasi berbasis Debian, termasuk Ubuntu. Digunakan untuk menginstal, menghapus, dan mengelola paket perangkat lunak.
install
: Opsi dari apt-get
yang digunakan untuk menginstal paket-paket yang disebutkan setelahnya.
php7.4
: Instalasi paket PHP versi 7.4. Ini mencakup inti PHP dan paket-paket standar.
php7.4-fpm
: FastCGI Process Manager untuk PHP versi 7.4. Ini memungkinkan menjalankan PHP dengan menggunakan FastCGI, yang dapat meningkatkan kinerja situs web.
php7.4-mysql
: Integrasi MySQL untuk PHP versi 7.4. Paket ini diperlukan jika Anda berencana untuk menggunakan PHP dengan database MySQL.
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.
libapache2-mod-fcgid
: Modul Apache untuk mendukung FastCGI. Digunakan ketika PHP dijalankan melalui FastCGI Process Manager.
-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:
sudo
: Menggunakan hak akses superuser (root) untuk menjalankan perintah. Dibutuhkan hak akses superuser untuk melakukan konfigurasi pada level sistem.
a2enmod
: Ini adalah skrip utilitas di lingkungan Debian (termasuk Ubuntu) yang digunakan untuk mengaktifkan modul-modul Apache.
actions
: Modul Actions digunakan untuk mendefinisikan aksi yang dapat dilakukan oleh server Apache berdasarkan peristiwa tertentu, seperti permintaan HTTP tertentu.
fcgid
: Modul FCGID (FastCGI) adalah modul untuk Apache yang mendukung FastCGI, yang memungkinkan server web menjalankan skrip PHP secara efisien dan terisolasi.
alias
: Modul Alias memungkinkan Anda membuat alias atau pemetaan URL yang dapat digunakan untuk menyederhanakan struktur URL pada server web.
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
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
.
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
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
.
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.
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.
Bisa kita lihat pada gambar di atas, versi PHP yang digunakan adalah PHP versi 8.1.
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.
© 2024 qadrLabs . All rights reserved. 000515268