Instalasi Web Server Nginx, MariaDB, PHP (LEMP) di Ubuntu 24.04
LEMP adalah kumpulan software yang digunakan dalam membuat sebuah server web. LEMP terdiri dari Linux sebagai sistem operasinya, Nginx (dibaca: Engine X) sebagai software web server, MySQL server sebagai databasenya dan PHP sebagai pemrograman web dinamisnya.
Pada tutorial ini kita akan menggunakan Linux Ubuntu Server 24.04 LTS sebagai sistem operasi. Khusus untuk server database kita akan menggunakan MariaDB karena MySQL sekarang sudah diakuisisi oleh Oracle yang berarti tidak benar-benar opensource lagi. Fitur, konfigurasi dan perintah-perintah pada MariaDB tidak jauh berbeda dengan MySQL sehingga kita tidak perlu beradaptasi lagi. Keunggulannya MariaDB tetap berkomitmen menjadi software opensource dan terus dikembangkan oleh komunitas.
Seperti biasa sebelum memulai tutorial ada beberapa prasyarat yang harus disiapkan sebelum install LEMP di ubuntu 24.04.
Prasyarat:
- Sudah melakukan konfigurasi awal server. Silahkan lihat tutorial pengaturan awal pada Ubuntu Server 24.04.
- [Opsional] Sudah memiliki domain. Anda dapat membelinya pada penyedia domain (domain registrar seperti Godaddy, Namecheap, idwebhost dan lainnya.
- [Opsional] Sudah menghubungkan domain ke server atau VPS yang digunakan. Kita bisa menggunakan fitur DNS hosting pada Cloudflare untuk mengatur DNS Record domain kita. Silahkan simak cara menghubungkan domain ke server dengan DNS Cloudflare.
Berikut ini adalah cara install web server Nginx, MariaDB dan PHP8.3 (LEMP) pada Ubuntu Server 24.04 LTS.
1. Install Web Server Nginx
Perbarui database dari repositori dengan melakukan perintah:
$ sudo apt update
Install paket Nginx dengan perintah:
$ sudo apt -y install nginx
Karena pada pengaturan awal ubuntu server kita mengaktifkan firewall melalui UFW maka izinkan Nginx agar web kita dapat diakses.
$ sudo ufw allow 'Nginx Full'
Dengan mengizinkan Nginx Full berarti kita memberi akses pada port 80 yaitu HTTP dan 443 yaitu HTTPS.
Sekarang server kita telah memiliki web server. Untuk melakukan tes apakah web server telah benar-benar berjalan kita bisa mengakses tampilan default dari Nginx melalui internet browser dengan mengetikkan ip address server kita.
http://alamat_ip_server_anda
Seharusnya akan tampil seperti gambar di bawah ini:
2. Install PHP 8.3
Kita akan menggunakan versi PHP terbaru yang support Ubuntu 24.04 yaitu PHP8.3 untuk mendapatkan semua fitur terbaru dan performa terbaik. Nginx tidak mendukung modul PHP biasa seperti yang digunakan di Apache melainkan menggunakan fastCGI. Oleh karena itu kita akan menginstall paket fastCGI dari PHP8.3 yaitu php8.3-fpm (fastCGI process manager).
Menurut pengalaman saya, php8.3-fpm memiliki kecepatan dan performa yang lebih baik dibandingkan modul pada Apache. Hal ini tentunya akan menghasilkan website yang lebih cepat dengan kombinasi Nginx yang lebih ringan dibanding Apache.
Lakukan instalasi php8.3-fpm dengan perintah:
$ sudo apt -y install php8.3-fpm
3. Install MariaDB (Database Server)
Selain menginstall mariadb-server kita juga harus install php8.3-mysql sebagai modul yang mendukung mySQL pada PHP.
$ sudo apt -y install mariadb-server php8.3-mysql
Lakukan instalasi keamanan dasar pada mariadb dengan perintah:
$ sudo mysql_secure_installation
Berikut ini rekomendasi pengaturan sesuai output pertanyaan yang muncul.
Enter current password for root (enter for none):
Tekan enter karena kita tidak belum mengatur passwordnya.
Set root password? [Y/n] Y
Ketik Y karena kita akan memberi password.
New password:
Masukkan password baru untuk root database sesuai keinginan.
Re-enter new password:
Masukkan lagi passwordnya.
Remove anonymous users? [Y/n] Y
Ketik Y untuk menghapus user yang tidak diperlukan.
Disallow root login remotely? [Y/n] Y
Ketik Y untuk menonaktifkan root login ke database.
Remove test database and access to it? [Y/n] Y
Ketik Y untuk menghapus database test.
Reload privilege tables now? [Y/n] Y
Ketik Y untuk menyimpan perubahan.
4. Konfigurasi Dasar Nginx
Sebelum berlanjut ke konfigurasi Nginx baiknya kita mengetahui file-file konfigurasi pada Nginx yang terletak pada direktori /etc/nginx/
. Berikut ini saya jelaskan secara singkat bagian yang paling penting agar lebih mudah dipahami.
- File
nginx.conf
berisi konfigurasi utama pada nginx. - Direktori
sites-available
berisi file-file konfigurasi website. Dalam nginx disebut dengan server block sedangkan pada Apache disebut Virtualhost. - Direktori
sites-enabled
berisi file-file symbolic link yang merujuk sites-available. Gunanya adalah untuk mengaktifkan website. - Direktori
snippets
berisi potongan konfigurasi yang bisa dimasukkan pada file konfigurasi website. Gunanya adalah agar tidak memasukkan konfigurasi yang berulang-ulang pada tiap website.
Pengaturan nginx tidak memiliki standar resmi. Setiap sysadmin memiliki style tersendiri sesuai kreativitas mereka. Saya biasanya membuat file konfigurasi berdasarkan fungsinya di direktori snippet. Misalnya semua pengaturan tentang gzip diletakkan pada file gzip.conf atau tentang ssl di file ssl.conf di direktori snippet.
Sebagai awal, pada tahap ini kita akan melakukan konfigurasi file utama yaitu nginx.conf. Buka file /etc/nginx/nginx.conf dengan teks editor seperti nano:
$ sudo nano /etc/nginx/nginx.conf
Ubah isi file tersebut. Berikut ini adalah isi dari file konfigurasi nginx.conf saya:
user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; events { worker_connections 1024; # multi_accept on; } http { ## # Basic Settings ## sendfile off; tcp_nopush off; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; server_tokens off; server_names_hash_bucket_size 64; # server_name_in_redirect off; client_max_body_size 2M; include /etc/nginx/mime.types; default_type application/octet-stream; ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log warn; ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
Simpan dan tutup file tersebut.
Penjelasan bagian penting konfigurasi di atas:
- User yang menjalankan Nginx adalah www-data.
- worker_connections adalah jumlah yang dapat dihandle dalam 1 detik oleh 1 core CPU. Nilai didapat dari perintah
$ ulimit -n
. - sendfile dan tcp_nopush off agar paket dikirim langsung tanpa menunggu paket penuh. tcp_nodelay on agar menonaktifkan delay pengiriman paket.
- server_tokens off menonaktifkan keterangan tentang nginx di header paket.
5. Hubungkan Nginx dan php8.3-fpm
Agar server web dapat menghandle file PHP maka kita harus menghubungkan nginx dengan php8.3-fpm. Pengaturan tersebut dilakukan di dalam server block pada file di directory sites-available.
Buka file /etc/sites-available/default:
$ sudo nano /etc/nginx/sites-available/default
Ganti isi file tersebut dengan:
server { listen 80 default_server; root /var/www/html; index index.php index.html index.htm index.nginx-debian.html; server_name _; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include /etc/nginx/snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.3-fpm.sock; } }
Simpan dan tutup file tersebut.
Lihat bagian yang saya tebalkan pada file di atas. Bagian tersebut adalah bagian yang ditambahkan dari file defaultnya. Berikut penjelasannya:
- Bagian
index index.php index.html...
(dan seterusnya) artinya file yang pertama kali dibuka sebagai index diserver adalah file index.php. - Bagian
location ~ .php$...
(dan seterusnya) merupakan pengaturan untuk menghandle semua file php menggunakan php8.3-fpm.
Buat file php untuk tes apakah server PHP sudah berjalan di server kita:
$ sudo nano /var/www/html/info.php
Masukkan script PHP di bawah ini:
<?php phpinfo();
Simpan dan tutup file itu.
Restart Nginx dengan perintah:
$ sudo systemctl reload nginx
Anda dapat melihat hasilnya pada internet browser dengan mengetikkan alamat IP addressnya http://alamat_ip_server_anda/info.php
Maka seharusnya hasilnya adalah berupa informasi PHP seperti gambar di bawah ini:
Nah, dari awal tutorial kita hanya bisa melihat hasilnya dari alamat IP. Lalu bagaimana jika ingin kita punya domain yang sudah dihubungkan dengan server (prasyarat 2 & 3 terpenuhi)? Maka kita harus membuat server block untuk domain tersebut. Silahkan baca langkah 6 di bawah ini.
6. Atur Server Block untuk Membuat Website Berdasarkan Nama Domain (Opsional)
Langkah ini hanya untuk anda yang sudah memiliki domain dan telah menghubungkannya ke server atau VPS (prasyarat 2 dan 3). Dengan langkah ini maka kita dapat mengakses website di server berdasarkan nama domain.
Buat file baru pada direktori sites-available untuk membuat server block domain website kita.
$ sudo nano /etc/nginx/sites-available/itkoding.com
Masukkan kode di bawah ini pada file tersebut:
server { listen 80; root /var/www/itkoding; index index.php index.html index.htm index.nginx-debian.html; server_name itkoding.com; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { include /etc/nginx/snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.3-fpm.sock; } }
Simpan dan tutup file tersebut. Penjelasan lengkap kode tersebut akan saya share pada artikel khusus membahas server block nginx karena terlalu panjang.
Aktifkan website tersebut dengan membuat symbolic link:
$ sudo ln -s /etc/nginx/sites-available/itkoding.com /etc/nginx/sites-enabled/
Buat direktori root website:
$ sudo mkdir /var/www/itkoding
Buat file php untuk tes domain:
$ sudo nano /var/www/itkoding/index.php
Masukkan kode di bawah ini:
<?php phpinfo();
Restart Nginx dengan perintah:
$ sudo systemctl reload nginx
Nah, selanjutnya kita bisa mencoba mengakses website dengan mengetikkan nama domainnya di browser misalnya http://itkoding.com
Maka akan muncul halaman PHP seperti gambar ini:
Selanjutnya kita bisa meletakkan semua script PHP website kita pada root directory sesuai pengaturan server block di atas misalnya /var/www/itkoding
. Pengaturan tersebut bersifat mendasar. Tidak ada konfigurasi keamanan, kompresi gzip, ssl dan lainnya. Silahkan baca tulisan saya lainnya sesuai dengan kebutuhan.
ketika saya restart nginx dengan mengetik :
$ sudo systemctl reload nginx
yang muncul seperti ini:
Job for nginx.service failed.
See “systemctl status nginx.service” and “journalctl -xe” for details.
mohon petunjuk mas…
Kemungkinan konfigurasinya ada yang salah. Coba cek dengan $sudo systemctl status nginx.service dan $sudo journalctl -xe.
Di sana akan terlihat penyebab kesalahannya.
Kalau Ubuntu 20, webservernya apa bisa pakai xampp? dan bila pakai nginx, apa php nya bisa yg versi 7.00 ke bawah, biar match dengan aplikasi web yang dibuat dilokal? terima kasih
Kalau OS pakai Ubuntu, webserver tentunya LAMP. Kalau OS Windows baru pakai XAMPP.
Bisa pakai php versi apapun dengan menyebutkan versinya misalnya
sudo apt install php7.0
.