Website

Cara Install WordPress di VPS Ubuntu (LEMP Stack + SSL Let's Encrypt)

06 Jun 2026 Administrator
Header Hero

Cara Install WordPress di VPS Ubuntu (LEMP Stack + SSL Let's Encrypt)

Panduan Produksi: Manajemen Web Server Nginx, Tuning Ekstensi PHP-FPM, Sekuritisasi DBMS MySQL, dan Otomatisasi Enkripsi HTTPS

Menjalankan website WordPress di dalam lingkungan VPS (Virtual Private Server) pribadi memberikan kedaulatan penuh bagi pengembang untuk mengontrol efisiensi performa server, fleksibilitas alokasi memori, hingga pengetatan sektor keamanan siber aplikasi. Dibandingkan dengan shared hosting konvensional yang kaku dan sarat batasan resource, mengombinasikan WordPress dengan arsitektur LEMP Stack (Linux, Nginx, MySQL, PHP-FPM) merupakan standardisasi industri terbaik untuk menangani lonjakan trafik masif secara hemat penggunaan RAM.

Meskipun proses deployment via command line (CLI) pada awalnya terlihat rumit, mengikutinya langkah demi langkah secara presisi akan menjamin kestabilan sistem jangka panjang. Panduan komprehensif ini dirancang khusus untuk mengawal proses instalasi core WordPress pada VPS berbasis Ubuntu Server dari nol—mulai dari isolasi hak akses berkas (*file permissions*), kustomisasi ambang batas runtime PHP, pembuatan user pangkalan data terisolasi, hingga otomatisasi sertifikat SSL Let's Encrypt gratis demi mengunci enkripsi global HTTPS.

Prasyarat Infrastruktur: Pastikan Anda telah memiliki VPS aktif dengan sistem operasi Ubuntu Server, akses masuk via SSH client dengan privilese sudo, serta nama domain asli yang catatan DNS-nya (*A Record*) sudah mengarah tepat ke alamat IP publik VPS Anda.

1. Pembaruan Sistem dan Pembuatan User Terisolasi

Langkah awal yang mandatori adalah memperbarui indeks repositori Ubuntu server untuk mendapatkan patch keamanan siber terbaru, dilanjutkan dengan membuat user non-root demi menghindari bahaya eksekusi perintah fatal harian langsung dari user root:

# 1. Perbarui indeks paket repositori sistem operasi
sudo apt update && sudo apt upgrade -y

# 2. Membuat user baru kustom khusus penangan WordPress
sudo adduser wordpressuser
sudo usermod -aG sudo wordpressuser

# 3. Keluar dari root dan masuk kembali menggunakan user baru Anda
exit
ssh wordpressuser@IP_PUBLIK_VPS_ANDA

2. Instalasi Web Server Nginx dan Konfigurasi Firewall

Nginx dipilih karena memiliki arsitektur *event-driven* yang jauh lebih cepat dan ringan dalam memproses file statis dibandingkan Apache. Gunakan dinding api UFW untuk membatasi akses port luar:

# 1. Pasang paket biner Nginx web server
sudo apt install nginx -y

# 2. Konfigurasi jaring pengaman firewall UFW
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full' # Otomatis membuka gerbang port HTTP (80) & HTTPS (443)

# 3. Aktifkan firewall daemon ke dalam sistem kernel
sudo ufw enable
Database Layer

3. Pemasangan dan Sekuritisasi DBMS MySQL Server

WordPress membutuhkan pangkalan data relasional untuk mengamankan data teks artikel, password hash user, dan pengaturan sistem. Jalankan pembersihan script default bawaan database demi menutup celah peretasan:

# 1. Install engine basis data MySQL
sudo apt install mysql-server -y

# 2. Jalankan perlindungan script keamanan internal
sudo mysql_secure_installation

*Rekomendasi pilihan wizard: Aktifkan VALIDATE PASSWORD COMPONENT (Pilih level 1/Medium), setel password root baru yang rumit, hapus anonymous users (Y), disallow root login remotely (Y), remove test database (Y), dan reload privilege tables (Y).*

Langkah berikutnya, masuk ke konsol MySQL untuk memprovisikan database kosong beserta user terisolasi khusus WordPress:

sudo mysql -u root -p

-- Membuat database penampung data WordPress
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- Membuat user lokal khusus dengan hak sandi yang aman
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'PasswordKuatWordPress123!';

-- Memberikan privilese penuh hanya pada database wordpress
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
PHP Processing

4. Pemasangan dan Tuning Ambang Batas Kinerja PHP-FPM

Nginx memerlukan pemroses biner eksternal berupa PHP-FPM beserta sekumpulan pustaka ekstensi pendukung agar fungsi grafis GD, cURL, dan pembacaan zip kode plugin berjalan normal. Pasang paketnya lalu optimalkan batas kinerjanya:

# 1. Memasang PHP-FPM core beserta pustaka biner mandatori WordPress
sudo apt install php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-xmlrpc php-soap php-intl php-zip -y

# 2. Buka file php.ini (Sesuaikan nomor versi PHP yang aktif, misal: php8.1 atau php8.3)
sudo nano /etc/php/8.1/fpm/php.ini

Tekan `Ctrl + W` untuk mencari variabel berikut, lalu modifikasi nilainya mengikuti panduan alokasi memori produksi demi mencegah kendala *upload timeout* media:

memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300

Simpan (`Ctrl + O` -> `Enter` -> `Ctrl + X`), kemudian segarkan daemon sistem via perintah:

sudo systemctl restart php8.1-fpm

5. Pembuatan Konfigurasi Server Block Nginx (Virtual Host)

Buat berkas konfigurasi penunjuk rute jalan trafik baru untuk mengaitkan string nama domain Anda dengan direktori folder penampung file source code WordPress:

sudo nano /etc/nginx/sites-available/suryassh.net

Tempel susunan kode arsitektur RESTful berikut ke dalamnya *(Ganti suryassh.net dengan domain asli Anda, serta sesuaikan versi file .sock PHP Anda)*:

server {
    listen 80;
    server_name suryassh.net www.suryassh.net;
    root /var/www/suryassh.net;
    index index.php index.html index.htm;

    access_log /var/log/nginx/suryassh.access.log;
    error_log /var/log/nginx/suryassh.error.log;

    location / {
        # Mengunci aturan penting agar fitur permalink kustom 'Post Name' WordPress berjalan mulus tanpa error 404
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        # Pastikan string lokasi file socket ini sinkron dengan versi PHP sistem Anda
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # Proteksi Sektor Keamanan: Blokir akses luar langsung ke file konfigurasi rahasia internal
    location ~ /\.ht { deny all; }
    location = /wp-config.php { deny all; }

    # Optimasi Kecepatan: Mengaktifkan kompresi cache memori statis untuk file gambar/gaya
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
}

Aktifkan server block dengan membuat simbolik link tautan, lakukan validasi pengujian struktur sintaks, lalu muat ulang web server Nginx:

sudo ln -s /etc/nginx/sites-available/suryassh.net /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

6. Unduh Paket Core WordPress & Manajemen Hak Akses Berkas

Unduh paket rilis resmi WordPress terbaru langsung dari repositori utama, ekstrak arsip biner tarbalnya, lalu tempatkan berkas ke folder root server Linux Anda:

cd /tmp
wget https://wordpress.org/latest.tar.gz
tar -xzvf latest.tar.gz

# Membuat folder direktori kerja utama situs web Anda
sudo mkdir -p /var/www/suryassh.net
sudo cp -a /tmp/wordpress/. /var/www/suryassh.net/

# KUNCI SEKURITAS: Memberikan kepemilikan penuh folder kepada user web server (www-data)
sudo chown -R www-data:www-data /var/www/suryassh.net/

# Standardisasi hak izin keamanan: Setel folder ke 755 dan seluruh file ke 644
sudo find /var/www/suryassh.net/ -type d -exec chmod 755 {} \;
sudo find /var/www/suryassh.net/ -type f -exec chmod 644 {} \;
WordPress Secrets

7. Mengonfigurasi Kredensial Berkas Utama wp-config.php

Duplikat file contoh bawaan menjadi file konfigurasi rahasia operasional aktif, lalu masukkan parameter otentikasi pangkalan data database yang telah dibuat pada langkah ke-3:

sudo cp /var/www/suryassh.net/wp-config-sample.php /var/www/suryassh.net/wp-config.php
sudo nano /var/www/suryassh.net/wp-config.php

# Isi detail variabel database SQL Anda:
define( 'DB_NAME', 'wordpress' );
define( 'DB_USER', 'wpuser' );
define( 'DB_PASSWORD', 'PasswordKuatWordPress123!' );
define( 'DB_HOST', 'localhost' );

*Pro Tip Tambahan: Akses tautan resmi api.wordpress.org/secret-key/1.1/salt/ lewat browser Anda, lalu salin baris teks acak enkripsi unik keamanan yang dihasilkan sistem untuk menimpa baris blok **Authentication Unique Keys and Salts** di dalam berkas wp-config.php Anda guna memperkuat enkripsi cookies sesi login pengguna.*

8. Otomatisasi Klaim Sertifikat Keamanan SSL Let's Encrypt

Gunakan modul otomasi klien Certbot Nginx untuk memproses klaim kunci enkripsi, sekaligus memperbarui file konfigurasi Server Block Nginx secara otomatis agar memaksa trafik berjalan di jalur aman biner HTTPS:

# 1. Memasang paket Certbot otomatisasi Let's Encrypt
sudo apt install certbot python3-certbot-nginx -y

# 2. Trigger eksekusi sertifikat SSL untuk domain kustom harian Anda
sudo certbot --nginx -d suryassh.net -d www.suryassh.net

Ikuti wisaya panduan terminal: Isi alamat email pemulihan Anda, setujui aturan lisensi pengembang, dan **pilih opsi nomor 2 (Redirect)** ketika sistem menanyakan perihal penanganan trafik HTTP agar dialihkan permanen (*301 Redirect*) ke HTTPS Let's Encrypt.

Final Setup & Backup

9. Menyelesaikan Instalasi dan Menyuntikkan Skrip Backup

Buka browser harian Anda dan ketik nama domain Anda: https://suryassh.net untuk memanggil halaman visual instalasi akhir WordPress. Buat judul situs web, masukkan username kustom administrator baru beserta password kuatnya, lalu klik tombol **"Install WordPress"**. Dasbor Anda kini sudah siap memproduksi artikel blog!

Guna menjamin keselamatan kelangsungan aset digital situs dari ancaman crash hardware server di kemudian hari, buat satu skrip pencadangan data otomatis menggunakan penjadwalan Crontab Linux:

sudo nano /usr/local/bin/wp-backup.sh

# Isi file berkas dengan skrip pencadangan kompresi database & core harian:
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/home/wordpressuser/backups"

mkdir -p $BACKUP_DIR
# Ekspor data tabel SQL database pangkalan data
mysqldump -u wpuser -p'PasswordKuatWordPress123!' wordpress > $BACKUP_DIR/wp_db_$DATE.sql
# Kompresi folder source code file website
tar -czf $BACKUP_DIR/wp_files_$DATE.tar.gz /var/www/suryassh.net

# Kebijakan retensi: Hapus file cadangan yang usianya melampaui 7 hari harian
find $BACKUP_DIR -name "*.sql" -mtime +7 -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete

Kunci file dengan izin eksekusi biner: sudo chmod +x /usr/local/bin/wp-backup.sh, buka panel penjadwalan sistem lewat perintah crontab -e, lalu daftarkan instruksi baris perintah ini di bagian bawah: 0 2 * * * /usr/local/bin/wp-backup.sh agar server mengotomatiskan jalannya proses backup lokal setiap jam 02:00 dini hari.

Resolusi Gangguan Klasik Lintas Sektor Server

Kepatuhan pada penataan arsitektur server Linux akan menghindarkan Anda dari kepanikan saat mendapati galat operasional sistem harian. Terapkan protokol pemecahan masalah berikut:

  • Solusi Kendala "Error Establishing a Database Connection": Galat ini dipicu oleh ketidaksesuaian penulisan string akun login pada berkas wp-config.php atau karena engine MySQL mati mendadak akibat konsumsi RAM VPS terkuras habis. Cek statusnya lewat CLI perintah sudo systemctl status mysql dan nyalakan kembali lewat perintah sudo systemctl restart mysql.
  • Mengatasi Pemicu Galat "404 Not Found" pada Halaman Artikel: Jika halaman depan beranda website Anda terbuka normal tetapi semua halaman artikel postingan mengembalikan status galat error 404, tandanya konfigurasi perutean URL kustom Nginx Anda terhapus atau tidak aktif. Pastikan baris teks instruksi try_files $uri $uri/ /index.php?$args; tertulis dengan benar di dalam blok file lokasi utama Server Block Anda.
  • Menghilangkan Amukan "Mixed Content Warning": Kendala ikon gembok SSL pecah atau hilangnya berkas gaya CSS harian pasca bermigrasi ke HTTPS terjadi karena database masih menyimpan link tautan statis berawalan HTTP lama. Selesaikan dengan menyisipkan instruksi deklarasi proxy global di baris paling atas file wp-config.php Anda:
    if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') { $_SERVER['HTTPS'] = 'on'; }
v