Lewati ke konten utama
seratusribu.com
Semua artikel
DevOps & Shell

Cara Install LEMP (Nginx, MySQL, PHP) di Ubuntu untuk Website PHP

Oleh Anang H. Darmawan

4 menit baca
Laporkan
Cara Install LEMP (Nginx, MySQL, PHP) di Ubuntu untuk Website PHP

Foto: Tyler / Unsplash

Hampir setiap VPS baru yang saya siapkan untuk website PHP berakhir dengan susunan yang sama: Nginx di depan, PHP-FPM yang mengeksekusi kode, dan MySQL untuk data. Susunan ini biasa disebut LEMP (Linux, Nginx, MySQL, PHP). Urutannya sederhana. Yang membuat orang macet biasanya cuma tiga titik: socket PHP-FPM, server block, dan permission folder.

Urutan install yang aman

Mulai dari server yang bersih. Jalankan "sudo apt update" lalu "sudo apt upgrade" supaya daftar paket terbaru, kemudian pasang Nginx dengan "sudo apt install nginx". Kalau kamu memakai UFW, izinkan SSH dulu, baru buka port web lewat "sudo ufw allow 'Nginx Full'" dan nyalakan firewall. Mengunci diri sendiri dari server karena lupa port SSH jauh lebih sering terjadi daripada yang mau diakui orang.

Berikutnya MySQL: "sudo apt install mysql-server", lalu "sudo mysql_secure_installation" untuk menghapus user anonim dan database test. Jangan pakai user root MySQL untuk aplikasi. Buat satu database dan satu user khusus per website, dengan hak akses hanya ke database itu.

Terakhir PHP. Yang dipasang adalah php-fpm, bukan modul PHP untuk Apache: "sudo apt install php-fpm php-mysql", ditambah ekstensi yang diminta aplikasimu, misalnya php-mbstring, php-xml, php-curl, atau php-zip yang umum dipakai Laravel dan WordPress. Cek versinya dengan "php -v". Angka versi ini menentukan nama socket di langkah berikutnya.

PHP-FPM socket dan server block

Nginx tidak menjalankan PHP sendiri. Ia meneruskan request file .php ke PHP-FPM lewat socket Unix di folder /run/php/, dengan nama yang memuat versi, misalnya php8.3-fpm.sock. Cek nama persisnya dengan "ls /run/php/" daripada menyalin dari tutorial lama, karena tiap rilis Ubuntu membawa versi PHP bawaan yang berbeda.

Buat file konfigurasi baru di /etc/nginx/sites-available/, misalnya tokoku.conf. Isi minimalnya: listen 80, server_name domainmu, root ke folder publik aplikasi, index index.php index.html, blok location / dengan try_files, dan blok untuk file .php yang memuat snippets/fastcgi-php.conf serta fastcgi_pass ke socket tadi. Untuk Laravel, root harus menunjuk ke folder public di dalam proyek, bukan ke folder proyeknya.

Aktifkan dengan membuat symlink ke /etc/nginx/sites-enabled/, lalu biasakan menjalankan "sudo nginx -t" sebelum reload. Perintah itu memeriksa sintaks semua konfigurasi dan menunjuk baris yang salah. Setelah lolos, baru "sudo systemctl reload nginx". Satu jebakan kecil: kalau server block default masih aktif dan server_name-mu salah ketik, Nginx menyajikan halaman default, dan kamu mengira konfigurasimu diabaikan.

Permission folder yang sering salah

Di Ubuntu, Nginx dan PHP-FPM berjalan sebagai user www-data. Pola yang saya pakai: file dimiliki user deploy (bukan root) dengan grup www-data, folder 755, file 644. Hanya folder yang memang ditulis aplikasi, seperti storage dan bootstrap/cache di Laravel atau wp-content/uploads di WordPress, yang diberi hak tulis untuk grup.

Jangan membereskan masalah permission dengan chmod 777. Error-nya memang hilang, tapi siapa pun yang berhasil menaruh file di server jadi bisa menulis ke seluruh folder website. Kalau log menyebut "Permission denied", lihat folder mana yang disebut dan perbaiki kepemilikan folder itu saja.

Membaca error 502 Bad Gateway

502 artinya Nginx hidup tapi gagal bicara dengan PHP-FPM. Buka /var/log/nginx/error.log dan baca baris paling bawah. Pesan "connect() to unix:/run/php/... failed (2: No such file or directory)" berarti path socket di fastcgi_pass tidak cocok dengan socket yang ada. Pesan "(13: Permission denied)" berarti socket-nya ada, tapi user Nginx tidak boleh mengaksesnya. Untuk kasus kedua, cek listen.owner dan listen.group di file pool PHP-FPM, biasanya www.conf di dalam /etc/php/ sesuai versi.

Kalau log tidak menyebut socket sama sekali, cek apakah layanannya berjalan dengan "systemctl status php8.3-fpm" (ganti angkanya sesuai versimu). Penyebab 502 yang paling sering saya temui justru datang setelah upgrade PHP: socket versi lama hilang, sementara server block masih menunjuk ke sana.

Kapan sebaiknya diotomatiskan

Mengetik semua langkah di atas sekali atau dua kali itu bagus untuk belajar. Begitu kamu menyiapkan VPS baru tiap bulan, urutan manual mulai jadi sumber kesalahan: lupa satu ekstensi, lupa mengamankan MySQL, atau salah versi socket. Setup LEMP 1-command seharga Rp125.000 menjalankan instalasi dan konfigurasi dasar Nginx, MySQL, dan PHP dalam satu perintah untuk Ubuntu dan Debian, disertai panduan pemakaian, contoh konfigurasi, dan catatan keamanan.

Kalau server baru ini menggantikan hosting lama, pekerjaan berikutnya adalah memindahkan file dan database tanpa ada yang tertinggal. Skrip migrasi website antar server memindahkan keduanya lalu memverifikasi hasilnya sebelum server lama dimatikan. Kalau kamu lebih suka server langsung diamankan sekalian, ada jasa setup dan hardening VPS.

Langkah pertamamu sekarang: masuk ke server, jalankan "ls /run/php/", lalu cocokkan hasilnya dengan baris fastcgi_pass di server block. Pengecekan dua menit itu mencegah banyak 502 yang membuat orang begadang.