Cara Install Nginx, PHP 8.4, MariaDB, dan phpMyAdmin di Ubuntu Server
πŸš€ Tutorial Ubuntu Server

Panduan lengkap membangun web server berbasis Ubuntu Server menggunakan Nginx, PHP 8.4 FPM, MariaDB, phpMyAdmin, Composer, dan Supervisor.

πŸ“Œ Konfigurasi yang digunakan: Ubuntu Server 24.04, Nginx, PHP 8.4, MariaDB, phpMyAdmin, domain codekopdev.my.id, dan Cloudflare Tunnel.

1. Persiapan Ubuntu Server

Sebelum menginstal web server, perbarui repository dan paket Ubuntu terlebih dahulu.

sudo apt update
sudo apt upgrade -y

Install paket dasar yang akan digunakan:

sudo apt install -y \
curl \
unzip \
zip \
git \
ca-certificates \
software-properties-common \
apache2-utils
Paket apache2-utils tidak menginstal web server Apache. Paket ini hanya diperlukan untuk menggunakan perintah htpasswd.

2. Install Nginx

Install Nginx dari repository Ubuntu:

sudo apt install -y nginx

Aktifkan service Nginx:

sudo systemctl enable --now nginx

Periksa statusnya:

sudo systemctl status nginx

Status yang benar:

Active: active (running)

Cek versi Nginx:

nginx -v

3. Install PHP 8.4

Tambahkan repository PHP:

sudo add-apt-repository ppa:ondrej/php -y
sudo apt update

Install PHP 8.4 FPM, CLI, dan ekstensi yang umum digunakan:

sudo apt install -y \
php8.4 \
php8.4-cli \
php8.4-fpm \
php8.4-common \
php8.4-mysql \
php8.4-curl \
php8.4-mbstring \
php8.4-xml \
php8.4-bcmath \
php8.4-zip \
php8.4-gd \
php8.4-intl \
php8.4-soap \
php8.4-readline \
php8.4-opcache

Aktifkan PHP-FPM:

sudo systemctl enable --now php8.4-fpm

Periksa statusnya:

sudo systemctl status php8.4-fpm

Jadikan PHP 8.4 sebagai PHP CLI default:

sudo update-alternatives --set php /usr/bin/php8.4

Cek versi:

php -v

4. Membuat Konfigurasi PHP Terpisah

Supaya tidak mengubah file php.ini bawaan secara langsung, buat file konfigurasi tambahan.

sudo nano /etc/php/8.4/mods-available/php-conf.ini

Isi file tersebut:

; Custom PHP 8.4 configuration
date.timezone = Asia/Jakarta

memory_limit = 256M
upload_max_filesize = 50M
post_max_size = 50M

max_execution_time = 120
max_input_time = 120
max_input_vars = 5000

cgi.fix_pathinfo = 0
expose_php = Off

session.cookie_httponly = 1
session.cookie_samesite = Lax
session.cookie_secure = 1

opcache.enable = 1
opcache.enable_cli = 0
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 20000
opcache.validate_timestamps = 1
opcache.revalidate_freq = 2
Jika website belum memakai HTTPS, ubah sementara session.cookie_secure = 0.

Aktifkan untuk FPM dan CLI:

sudo phpenmod -v 8.4 -s fpm php-conf
sudo phpenmod -v 8.4 -s cli php-conf

Restart PHP-FPM:

sudo systemctl restart php8.4-fpm

Cek konfigurasi yang dibaca PHP:

php --ini

Jika sudah ada file 99-php-conf.ini, cukup gunakan file yang sudah ada dan jangan membuat konfigurasi duplikat.

5. Install Composer

Masuk ke folder sementara:

cd /tmp

Download dan verifikasi installer Composer:

EXPECTED_CHECKSUM="$(php8.4 -r 'copy("https://composer.github.io/installer.sig", "php://stdout");')"
php8.4 -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

ACTUAL_CHECKSUM="$(php8.4 -r "echo hash_file('sha384', 'composer-setup.php');")"

if [ "$EXPECTED_CHECKSUM" != "$ACTUAL_CHECKSUM" ]; then
echo "Checksum Composer tidak valid"
rm -f composer-setup.php
exit 1
fi

Install Composer secara global:

sudo php8.4 composer-setup.php \
--install-dir=/usr/local/bin \
--filename=composer
rm -f composer-setup.php

Cek Composer:

composer --version
composer diagnose
Hindari menjalankan sudo composer install di dalam project. Jalankan Composer menggunakan user biasa.

6. Install Supervisor

Supervisor digunakan untuk menjalankan proses background seperti queue worker. Untuk tahap awal, kita hanya menginstal servicenya.

sudo apt install -y supervisor

Aktifkan Supervisor:

sudo systemctl enable --now supervisor

Periksa status dan versi:

sudo systemctl status supervisor
supervisord --version
sudo supervisorctl status

Jika belum ada program yang terdaftar, hasil supervisorctl status dapat kosong dan itu normal.

Konfigurasi aplikasi nantinya disimpan di:

/etc/supervisor/conf.d/

7. Install MariaDB

Install MariaDB Server dan client:

sudo apt install -y mariadb-server mariadb-client

Aktifkan MariaDB:

sudo systemctl enable --now mariadb

Periksa status dan versi:

sudo systemctl status mariadb
mariadb --version

Amankan MariaDB

sudo mariadb-secure-installation

Gunakan pilihan berikut:

Enter current password for root: tekan Enter
Switch to unix_socket authentication: Y
Change the root password: N
Remove anonymous users: Y
Disallow root login remotely: Y
Remove test database: Y
Reload privilege tables now: Y
Biarkan akun root MariaDB menggunakan unix_socket. Root tidak perlu memakai password login biasa.

Login root dilakukan melalui terminal:

sudo mariadb

8. Membuat User dbadmin

Jangan menggunakan root untuk login melalui phpMyAdmin. Buat akun admin terpisah.

sudo mariadb

Jalankan SQL berikut:

CREATE USER 'dbadmin'@'localhost'
IDENTIFIED BY 'GANTI_PASSWORD_YANG_KUAT';

GRANT ALL PRIVILEGES ON *.*
TO 'dbadmin'@'localhost'
WITH GRANT OPTION;

FLUSH PRIVILEGES;
EXIT;

Tes login:

mariadb -u dbadmin -p

Periksa hak akses:

SHOW GRANTS FOR 'dbadmin'@'localhost';
Jangan gunakan akun dbadmin pada konfigurasi aplikasi. Buat user database terpisah untuk setiap aplikasi.

9. Install phpMyAdmin

Pastikan ekstensi PHP tersedia:

sudo apt install -y \
php8.4-mysql \
php8.4-mbstring \
php8.4-xml \
php8.4-curl \
php8.4-zip \
php8.4-gd

Install phpMyAdmin:

sudo apt install -y phpmyadmin

Pilihan saat instalasi

Saat muncul pilihan web server, jangan centang Apache maupun Lighttpd.

[ ] apache2
 [ ] lighttpd

Tekan Tab → OK → Enter

Saat muncul pertanyaan konfigurasi database menggunakan dbconfig-common, pilih Yes.

Cek hasil instalasi:

dpkg -l | grep phpmyadmin
ls -lah /usr/share/phpmyadmin/index.php

Jika Tidak Sengaja Memilih Lighttpd

sudo systemctl disable --now lighttpd
sudo apt purge -y lighttpd
sudo apt autoremove -y

phpMyAdmin tetap aman dan tidak ikut terhapus.

10. Membuat Guard Password Nginx

Tambahkan login awal sebelum halaman phpMyAdmin menggunakan HTTP Basic Auth.

sudo htpasswd -c /etc/nginx/.htpasswd-phpmyadmin codekop

Username guard pada contoh ini adalah:

codekop

Cek username yang tersimpan:

sudo cut -d: -f1 /etc/nginx/.htpasswd-phpmyadmin

Untuk mengganti password:

sudo htpasswd /etc/nginx/.htpasswd-phpmyadmin codekop

11. Membuat Folder Website

Secara default, folder /var/www/codekopdev/public belum tersedia. Buat folder tersebut dan atur kepemilikannya agar user aktif dapat mengelola file project tanpa selalu menggunakan sudo.

sudo mkdir -p /var/www/codekopdev/public
sudo chown -R $USER:www-data /var/www/codekopdev

Atur permission folder dan file:

sudo find /var/www/codekopdev -type d -exec chmod 775 {} \;
sudo find /var/www/codekopdev -type f -exec chmod 664 {} \;

Kemudian buat file halaman utama:

nano /var/www/codekopdev/public/index.php

Isi dengan kode sederhana berikut:

<?php

echo '<h1>CodekopDev Home Lab</h1>';
echo '<p>PHP ' . PHP_VERSION . ' berjalan dengan baik.</p>';
Simpan dengan Ctrl + O, tekan Enter, lalu keluar menggunakan Ctrl + X.
Jangan menggunakan chmod -R 777.
Catatan: file index.php yang dibuat setelah perintah find biasanya otomatis dimiliki user aktif karena dibuat menggunakan nano tanpa sudo. Jadi perintah chown dan chmod kedua tidak perlu diulang.

12. Konfigurasi Nginx dan phpMyAdmin

Buat virtual host:

sudo nano /etc/nginx/sites-available/codekopdev.my.id

Isi konfigurasi berikut:

server {
    listen 80;
    listen [::]:80;

    server_name codekopdev.my.id;

    root /var/www/codekopdev/public;
    index index.php index.html;

    client_max_body_size 50M;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /phpmyadmin {
        return 301 /phpmyadmin/;
    }

    location /phpmyadmin/ {
        auth_basic "Codekop Database Area";
        auth_basic_user_file /etc/nginx/.htpasswd-phpmyadmin;

        alias /usr/share/phpmyadmin/;
        index index.php;

        location ~ ^/phpmyadmin/(.+\.php)$ {
            auth_basic "Codekop Database Area";
            auth_basic_user_file /etc/nginx/.htpasswd-phpmyadmin;

            include fastcgi_params;
            fastcgi_pass unix:/run/php/php8.4-fpm.sock;

            fastcgi_param SCRIPT_FILENAME /usr/share/phpmyadmin/$1;
            fastcgi_param DOCUMENT_ROOT /usr/share/phpmyadmin;
        }

        location ~* ^/phpmyadmin/(.+\.(css|js|jpg|jpeg|png|gif|ico|svg|webp|woff|woff2|ttf|map))$ {
            alias /usr/share/phpmyadmin/$1;
            expires 7d;
            access_log off;
        }
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.4-fpm.sock;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Aktifkan virtual host:

sudo ln -s \
/etc/nginx/sites-available/codekopdev.my.id \
/etc/nginx/sites-enabled/codekopdev.my.id

Hapus konfigurasi default jika tidak digunakan:

sudo rm -f /etc/nginx/sites-enabled/default

Tes konfigurasi:

sudo nginx -t

Reload Nginx:

sudo systemctl reload nginx
sudo systemctl restart php8.4-fpm

13. Konfigurasi Cloudflare Tunnel

Jika HTTPS ditangani Cloudflare Edge, Nginx lokal cukup menggunakan port 80.

Public hostname: codekopdev.my.id
Service: http://localhost:80

Alur koneksinya:

Browser
β”‚
β–Ό HTTPS
Cloudflare Edge
β”‚
β–Ό Cloudflare Tunnel
cloudflared
β”‚
β–Ό HTTP lokal
Nginx localhost:80

Jangan tambahkan konfigurasi berikut jika tidak memiliki sertifikat lokal:

listen 443 ssl;

Jika directive tersebut digunakan tanpa ssl_certificate, Nginx akan menghasilkan error.

14. Pengujian Akhir

Cek seluruh service

sudo systemctl status nginx
sudo systemctl status php8.4-fpm
sudo systemctl status mariadb
sudo systemctl status supervisor

Cek versi aplikasi

nginx -v
php -v
composer --version
mariadb --version
supervisord --version

Cek ekstensi PHP

php8.4 -m | grep -E 'mysqli|pdo_mysql|mbstring|xml|curl|zip|gd'

Cek socket PHP-FPM

ls -lah /run/php/php8.4-fpm.sock

Tes website secara lokal

curl -I \
-H "Host: codekopdev.my.id" \
http://127.0.0.1/

Tes phpMyAdmin

curl -I \
-H "Host: codekopdev.my.id" \
http://127.0.0.1/phpmyadmin/

Hasil yang diharapkan:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="Codekop Database Area"

Buka phpMyAdmin:

https://codekopdev.my.id/phpmyadmin/

Urutan Login

  1. Guard Nginx
    Username: codekop
    Password: password dari perintah htpasswd
  2. phpMyAdmin
    Username: dbadmin
    Password: password MariaDB untuk user dbadmin
Pesan “Masuk tanpa kata sandi tidak diperbolehkan” berarti phpMyAdmin menolak login tanpa password. Kondisi ini aman.

15. Struktur Akhir Server

 ChatGPT Image 1 Agu 2026, 19.40.16 (1).png

Baca Juga : Tutorial Lengkap Proxmox, Ubuntu VM, Cloudflare Tunnel & SSH Domain

βœ… Instalasi Selesai

Server sekarang sudah memiliki Nginx, PHP 8.4 FPM, Composer, Supervisor, MariaDB, dan phpMyAdmin. Stack ini dapat digunakan untuk menjalankan Laravel, CodeIgniter, PHP Native, REST API, aplikasi internal, dan server development Codekop.

Komentar