Install PHP 8.4/8.5 untuk HestiaCP di Ubuntu 20.04
Latar Belakang
PHP 8.4+ tidak tersedia di ppa:ondrej/php untuk Ubuntu 20.04 (Focal). Hestia 1.9.6 sudah membundle PHP 8.4.21 di /usr/local/hestia/php/ yang dikompilasi khusus untuk focal.
1. Setup PHP 8.4 (menggunakan bundle Hestia)
1.1 Buat direktori & symlink
mkdir -p /etc/php/8.4/fpm/pool.d /etc/php/8.4/cli /var/log/php8.4
ln -sf /usr/local/hestia/php/bin/php /usr/bin/php8.4
1.2 Buat php-fpm.conf
cat > /etc/php/8.4/fpm/php-fpm.conf << 'EOF'
[global]
pid = /run/php/php8.4-fpm.pid
error_log = /var/log/php8.4-fpm.log
log_level = error
emergency_restart_threshold = 10
emergency_restart_interval = 60s
process_control_timeout = 10s
events.mechanism = epoll
include=/etc/php/8.4/fpm/pool.d/*.conf
EOF
1.3 Buat php.ini (dari bundled Hestia)
cp /usr/local/hestia/php/lib/php.ini /etc/php/8.4/fpm/php.ini
ln -sf /etc/php/8.4/fpm/php.ini /etc/php/8.4/cli/php.ini
1.4 Konfigurasi php.ini
sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 100M/g' /etc/php/8.4/fpm/php.ini
sed -i 's/post_max_size = 8M/post_max_size = 100M/g' /etc/php/8.4/fpm/php.ini
sed -i 's/max_execution_time = 30/max_execution_time = 60/g' /etc/php/8.4/fpm/php.ini
sed -i 's/;max_input_vars = 1000/max_input_vars = 4000/g' /etc/php/8.4/fpm/php.ini
sed -i 's/;date.timezone =/date.timezone = Asia\/Jakarta/g' /etc/php/8.4/fpm/php.ini
sed -i 's/;opcache.enable=1/opcache.enable=1/g' /etc/php/8.4/fpm/php.ini
sed -i 's/;opcache.memory_consumption=128/opcache.memory_consumption=512/g' /etc/php/8.4/fpm/php.ini
sed -i 's/;opcache.max_accelerated_files=10000/opcache.max_accelerated_files=100000/g' /etc/php/8.4/fpm/php.ini
1.5 Hapus extension= yang salah
Ekstensi berikut sudah compiled-in (tidak perlu extension=):
curl, gettext, mbstring, zip, pdo_sqlite, pdo_pgsql
Edit /etc/php/8.4/fpm/php.ini dan hapus/komentari baris:
extension=curl # compiled-in → hapus
extension=gettext # compiled-in → hapus
extension=mbstring # compiled-in → hapus
extension=zip # compiled-in → hapus
extension=pdo_sqlite # compiled-in → hapus
extension=pdo_pgsql # .so tidak ada → hapus
1.6 Aktifkan extension shared (.so)
Tambahkan di /etc/php/8.4/fpm/php.ini:
extension=gd
extension=intl
extension=pdo_mysql
extension=bcmath
zend_extension=opcache
1.7 Set MySQL socket path
pdo_mysql.default_socket = /run/mysqld/mysqld.sock
mysqli.default_socket = /run/mysqld/mysqld.sock
1.8 Disable function untuk security
disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,exec,system,passthru,shell_exec,proc_open,popen
1.9 Buat pool default
cat > /etc/php/8.4/fpm/pool.d/dummy.conf << 'EOF'
; origin-src: deb/php-fpm/dummy.conf
[www]
listen = /run/php/php8.4-fpm-dummy.sock
listen.owner = hestiamail
listen.group = www-data
listen.mode = 0660
user = hestiamail
group = hestiamail
pm = ondemand
pm.max_children = 4
pm.max_requests = 4000
pm.process_idle_timeout = 10s
EOF
1.10 Buat systemd service
cat > /lib/systemd/system/php8.4-fpm.service << 'SYSTEMD'
[Unit]
Description=PHP 8.4 FastCGI Process Manager
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/hestia/php/sbin/php-fpm --nodaemonize -c /etc/php/8.4/fpm --fpm-config /etc/php/8.4/fpm/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
RuntimeDirectory=php8.4-fpm
RuntimeDirectoryMode=0755
PIDFile=/run/php/php8.4-fpm.pid
[Install]
WantedBy=multi-user.target
SYSTEMD
systemctl daemon-reload
systemctl enable php8.4-fpm
systemctl start php8.4-fpm
Penting: Gunakan flag
-c /etc/php/8.4/fpmkarena binary bundled Hestia dikompilasi dengan--with-config-file-path=/usr/local/hestia/php/lib. Tanpa flag ini, FPM akan membaca php.ini yang salah danpdo_mysqltidak terload.
1.11 Register di HestiaCP
cp /usr/local/hestia/install/deb/php-fpm/multiphp.tpl \
/usr/local/hestia/data/templates/web/php-fpm/PHP-8_4.tpl
Verifikasi:
/usr/local/hestia/bin/v-list-sys-php
/usr/local/hestia/bin/v-list-web-templates-backend
2. Compile Extension Tambahan (bcmath, gd, intl, pdo_mysql)
2.1 Install build tools
apt-get install -y autoconf g++ pkg-config libicu-dev libpng-dev \
libjpeg-dev libfreetype6-dev libwebp-dev libxpm-dev libgd-dev
2.2 Manual install libgd-dev (jika konflik versi)
cd /tmp
apt-get download libgd-dev
mkdir -p gd-extract && dpkg-deb -x libgd-dev*.deb gd-extract/
cp -r gd-extract/usr/include/* /usr/include/
cp -r gd-extract/usr/lib/x86_64-linux-gnu/* /usr/lib/x86_64-linux-gnu/
2.3 Fix missing symlinks untuk build
ln -sf /bin/sed /usr/bin/sed
2.4 Build bcmath
cd /tmp/php-8.4.21/ext/bcmath
/usr/local/hestia/php/bin/phpize
./configure --with-php-config=/usr/local/hestia/php/bin/php-config
make -j$(nproc) && make install
2.5 Build intl
cd /tmp/php-8.4.21/ext/intl
/usr/local/hestia/php/bin/phpize
./configure --with-php-config=/usr/local/hestia/php/bin/php-config
make -j$(nproc) && make install
2.6 Build gd
cd /tmp/php-8.4.21/ext/gd
/usr/local/hestia/php/bin/phpize
./configure --with-php-config=/usr/local/hestia/php/bin/php-config \
--with-jpeg --with-webp --with-xpm --with-freetype --enable-gd
make -j$(nproc) && make install
2.7 Build pdo_mysql
cd /tmp/php-8.4.21/ext/pdo_mysql
/usr/local/hestia/php/bin/phpize
./configure --with-php-config=/usr/local/hestia/php/bin/php-config --with-pdo-mysql=mysqlnd
make -j$(nproc) && make install
3. Install PHP 8.5 (build from source)
3.1 Install build dependencies
apt-get install -y autoconf g++ pkg-config libicu-dev libpng-dev \
libjpeg-dev libfreetype6-dev libwebp-dev libxpm-dev libxml2-dev \
libcurl4-openssl-dev libssl-dev libsqlite3-dev libzip-dev libonig-dev \
libgmp-dev libbz2-dev libreadline-dev libtidy-dev libpspell-dev libtool
3.2 Fix libxml2-dev (jika konflik versi)
cd /tmp
apt-get download libxml2-dev
mkdir -p xml-dev-extract && dpkg-deb -x libxml2-dev*.deb xml-dev-extract/
cp -r xml-dev-extract/usr/include/libxml2 /usr/include/
cp xml-dev-extract/usr/lib/x86_64-linux-gnu/pkgconfig/libxml-2.0.pc /usr/lib/pkgconfig/
3.3 Download & compile PHP 8.5
cd /tmp
wget https://www.php.net/distributions/php-8.5.0.tar.gz
tar xzf php-8.5.0.tar.gz && cd php-8.5.0
./configure \
--prefix=/usr/local/php8.5 \
--with-config-file-path=/etc/php/8.5/fpm \
--with-config-file-scan-dir=/etc/php/8.5/fpm/conf.d \
--enable-fpm \
--with-fpm-user=nobody \
--with-fpm-group=nogroup \
--enable-bcmath \
--enable-calendar \
--enable-exif \
--enable-ftp \
--enable-gd \
--with-freetype --with-jpeg --with-webp --with-xpm \
--enable-intl \
--enable-mbstring \
--enable-shmop \
--enable-soap \
--enable-sockets \
--enable-sysvmsg --enable-sysvsem --enable-sysvshm \
--with-curl \
--with-gettext \
--with-gmp \
--with-mysqli \
--with-openssl \
--with-pdo-mysql \
--with-pdo-sqlite \
--with-pear \
--with-readline \
--with-zip \
--with-zlib \
--with-bz2 \
--with-iconv \
--with-pspell \
--with-tidy
make -j$(nproc) && make install
ln -sf /usr/local/php8.5/bin/php /usr/bin/php8.5
3.4 Setup FPM & systemd (sama seperti 8.4)
mkdir -p /etc/php/8.5/fpm/pool.d /etc/php/8.5/fpm/conf.d /var/log/php8.5
cp /tmp/php-8.5.0/php.ini-production /etc/php/8.5/fpm/php.ini
Ulangi langkah 1.4–1.8 untuk /etc/php/8.5/fpm/php.ini (tanpa perlu edit extension, karena semua compiled-in).
3.5 Buat systemd service PHP 8.5
cat > /lib/systemd/system/php8.5-fpm.service << 'SYSTEMD'
[Unit]
Description=PHP 8.5 FastCGI Process Manager
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/php8.5/sbin/php-fpm --nodaemonize --fpm-config /etc/php/8.5/fpm/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
RuntimeDirectory=php8.5-fpm
RuntimeDirectoryMode=0755
PIDFile=/run/php/php8.5-fpm.pid
[Install]
WantedBy=multi-user.target
SYSTEMD
systemctl daemon-reload
systemctl enable php8.5-fpm
systemctl start php8.5-fpm
3.6 Register di HestiaCP
cp /usr/local/hestia/install/deb/php-fpm/multiphp.tpl \
/usr/local/hestia/data/templates/web/php-fpm/PHP-8_5.tpl
4. Verifikasi
# Cek service
systemctl status php8.4-fpm
systemctl status php8.5-fpm
# Cek deteksi Hestia
/usr/local/hestia/bin/v-list-sys-php
# Cek PDO driver
php8.4 -r 'echo implode(", ", PDO::getAvailableDrivers()) . "\n";'
php8.5 -r 'echo implode(", ", PDO::getAvailableDrivers()) . "\n";'
5. Assign ke Domain
CLI:
v-change-web-domain-backend-tpl <user> <domain> PHP-8_4
v-change-web-domain-backend-tpl <user> <domain> PHP-8_5
Panel: Edit domain → Backend Template → pilih PHP-8_4 / PHP-8_5.