Panduan lengkap membangun web server berbasis Ubuntu Server menggunakan Nginx, PHP 8.4 FPM, MariaDB, phpMyAdmin, Composer, dan Supervisor.
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
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
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
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
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';
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:
codekopCek 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>';
Ctrl + O, tekan Enter, lalu keluar menggunakan Ctrl + X.chmod -R 777.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.
codekopdev.my.idService:
http://localhost:80Alur 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
- Guard Nginx
Username:codekop
Password: password dari perintahhtpasswd - phpMyAdmin
Username:dbadmin
Password: password MariaDB untuk userdbadmin
15. Struktur Akhir Server
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.