Cara Menginstal Linux, Nginx, MySQL, PHP (stack LEMP) di Ubuntu


Pendahuluan

Tumpukan perangkat lunak LEMP melayani halaman web dinamis dan aplikasi web yang ditulis dalam PHP. Ini adalah singkatan yang menggambarkan sistem operasi Linux, dengan server web Nginx (diucapkan seperti “Engine-X”). Data backend disimpan dalam basis data MySQL dan pemrosesan dinamis ditangani oleh PHP.

Panduan ini menunjukkan cara menginstal tumpukan LEMP di server Ubuntu. Sistem operasi Ubuntu menangani bagian Linux dari tumpukan tersebut. Kami akan menjelaskan cara mengaktifkan dan menjalankan komponen lainnya.

Catatan: Tutorial ini terutama ditujukan untuk Ubuntu 22.04 LTS dengan PHP 8.1. Untuk pengguna Ubuntu 24.04 LTS, sesuaikan referensi versi PHP dari php8.1-fpm menjadi php8.3-fpm di seluruh perintah. Selain itu, pastikan untuk memperbarui jalur socket PHP-FPM di konfigurasi Nginx Anda (misalnya, gunakan /run/php/php8.3-fpm.sock untuk Ubuntu 24.04).

Cara Menginstal Linux, Nginx, MySQL, PHP (stack LEMP) di Ubuntu

  1. Menginstal Server Web Nginx
  2. Menginstal MySQL
  3. Menginstal PHP
  4. Mengonfigurasi Nginx untuk Menggunakan Prosesor PHP
  5. Menguji PHP dengan Nginx
  6. Menguji Koneksi Database dari PHP

Prasyarat

Gunakan pengguna sudo non-root di Ubuntu dengan firewall UFW diaktifkan. Ikuti panduan penyiapan server awal kami untuk Ubuntu agar dapat mengonfigurasinya.

Langkah 1 – Menginstal Server Web Nginx

Untuk menampilkan halaman web kepada pengunjung situs, Anda akan menggunakan Nginx, sebuah server web dengan kinerja tinggi. Anda akan menggunakan manajer paket APT untuk mendapatkan perangkat lunak ini.

Perbarui indeks paket server Anda, lalu pasang Nginx:

sudo apt update

Setelah itu, jalankan apt install untuk menginstal Nginx:

sudo apt install nginx

Saat diminta, tekan Y dan ENTER untuk mengonfirmasi bahwa Anda ingin menginstal Nginx. Setelah instalasi selesai, server web Nginx akan aktif dan berjalan di server Ubuntu Anda.

Verifikasi bahwa Nginx sedang berjalan:

sudo systemctl status nginx

Anda seharusnya melihat output yang menunjukkan bahwa Nginx aktif:

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since...

Di Ubuntu, Nginx dikonfigurasi untuk mulai berjalan saat pemasangan.

Izinkan lalu lintas HTTP melalui firewall ufw. Nginx mendaftarkan beberapa profil aplikasi UFW saat instalasi. Periksa profil yang tersedia:

sudo ufw app list
Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

Aktifkan profil paling ketat yang memungkinkan lalu lintas yang diperlukan. Karena SSL belum dikonfigurasi, izinkan hanya lalu lintas HTTP pada port 80:

Aktifkan ini dengan menjalankan perintah berikut:

sudo ufw allow 'Nginx HTTP'

Verifikasi perubahan firewall:

sudo ufw status

Keluaran ini menunjukkan bahwa lalu lintas HTTP sekarang diizinkan:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Untuk menguji fungsi domain server Nginx, buka http://your_domain menggunakan browser web pilihan Anda.

Jika Anda tidak memiliki nama domain yang diarahkan ke server Anda dan Anda tidak mengetahui alamat IP publik server Anda, Anda dapat menemukannya dengan menjalankan salah satu perintah berikut:

ip addr show
hostname -I

Ini akan mencetak beberapa alamat IP. Anda bisa mencoba masing-masing di browser web Anda.

Sebagai alternatif, Anda dapat memeriksa alamat IP mana yang dapat diakses, sebagaimana terlihat dari lokasi lain di internet:

curl -4 icanhazip.com

Tulis alamat yang Anda terima di browser web Anda dan itu akan membawa Anda ke halaman utama default Nginx:

http://<server_domain_or_IP>

Jika Anda menerima halaman ini, itu berarti Anda telah berhasil menginstal Nginx dan mengaktifkan lalu lintas HTTP untuk server web Anda.

Langkah 2 — Menginstal MySQL

Pasang MySQL untuk menyimpan dan mengelola data situs. MySQL adalah sistem manajemen basis data standar untuk lingkungan PHP.

Sekali lagi, gunakan apt untuk mendapatkan dan menginstal perangkat lunak ini:

sudo apt install mysql-server

Saat diminta, konfirmasi instalasi dengan menekan Y, lalu tekan ENTER.

Setelah instalasi, jalankan skrip keamanan untuk menghapus pengaturan default yang tidak aman dan mengamankan akses basis data:

sudo mysql_secure_installation

Anda akan diberi pertanyaan yang menanyakan apakah Anda ingin mengonfigurasi VALIDATE PASSWORD PLUGIN.

Catatan: Mengaktifkan fitur ini lebih merupakan keputusan berdasarkan penilaian. Jika diaktifkan, kata sandi yang tidak memenuhi kriteria yang ditentukan akan ditolak oleh MySQL dengan pesan kesalahan. Aman untuk membiarkan validasi dinonaktifkan, tetapi Anda sebaiknya selalu menggunakan kata sandi yang kuat dan unik untuk kredensial database.

Jawab Y untuk ya, atau apapun untuk melanjutkan tanpa mengaktifkan:

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: 

Jika Anda menjawab “ya”, Anda akan diminta untuk memilih tingkat validasi kata sandi. Perlu diingat bahwa jika Anda memasukkan 2 untuk tingkat terkuat, Anda akan menerima kesalahan saat mencoba mengatur kata sandi yang tidak mengandung angka, huruf besar dan kecil, serta karakter khusus:

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary              file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1

Terlepas dari apakah Anda memilih untuk mengatur VALIDATE PASSWORD PLUGIN atau tidak, server Anda akan meminta Anda untuk memilih dan mengonfirmasi kata sandi untuk pengguna MySQL root. Ini tidak sama dengan root sistem. Pengguna root database adalah pengguna administratif dengan hak istimewa penuh atas sistem database. Meskipun metode autentikasi default untuk pengguna root MySQL tidak mewajibkan penggunaan kata sandi, meskipun kata sandi telah dibuat, Anda sebaiknya menetapkan kata sandi yang kuat di sini sebagai langkah keamanan tambahan. Kita akan membahas hal ini sebentar lagi.

Jika Anda mengaktifkan validasi kata sandi, kekuatan kata sandi untuk kata sandi root yang Anda masukkan akan ditampilkan dan server Anda akan menanyakan apakah Anda ingin melanjutkan dengan kata sandi tersebut. Jika Anda puas dengan kata sandi Anda saat ini, tekan Y untuk “ya” pada prompt:

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y

Untuk sisa pertanyaan, tekan Y dan tekan tombol ENTER pada setiap prompt. Ini akan menghapus beberapa pengguna anonim dan basis data tes, menonaktifkan login root dari jarak jauh, serta memuat aturan baru ini sehingga MySQL segera menghormati perubahan yang telah Anda buat.

Setelah selesai, uji apakah Anda bisa masuk ke konsol MySQL:

sudo mysql

Ini akan terhubung ke server MySQL sebagai pengguna database administratif root, yang disimpulkan dari penggunaan sudo saat menjalankan perintah ini. Anda seharusnya menerima output berikut:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.28-0ubuntu4 (Ubuntu)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Untuk keluar dari konsol MySQL, tulis yang berikut:

exit

Perhatikan bahwa Anda tidak perlu memberikan kata sandi untuk terhubung sebagai pengguna root, meskipun Anda telah menentukan satu saat menjalankan skrip mysql_secure_installation. Hal ini karena, ketika diinstal di Ubuntu, metode otentikasi default untuk pengguna administratif MySQL adalah auth_socket, bukan metode yang menggunakan kata sandi. Pada awalnya ini mungkin terlihat seperti masalah keamanan, tetapi sebenarnya membuat server database lebih aman karena satu-satunya pengguna yang diizinkan masuk sebagai pengguna MySQL root adalah pengguna sistem dengan hak istimewa sudo yang terhubung dari konsol atau melalui aplikasi yang berjalan dengan hak istimewa yang sama. Secara praktis, hal ini berarti Anda tidak akan dapat menggunakan pengguna database administratif root untuk terhubung dari aplikasi PHP Anda.

Untuk keamanan yang lebih baik, sebaiknya memiliki akun pengguna khusus dengan hak akses yang lebih terbatas untuk setiap database, terutama jika Anda berencana memiliki beberapa database yang dihosting di server Anda.

Catatan: Beberapa versi lama dari pustaka PHP MySQL native mysqlnd tidak mendukung caching_sha2_authentication, metode autentikasi default untuk pengguna yang dibuat di MySQL 8. Untuk alasan tersebut, saat membuat pengguna database untuk aplikasi PHP di MySQL 8, Anda mungkin perlu memastikan mereka dikonfigurasi untuk menggunakan mysql_native_password sebagai gantinya. Kami akan menunjukkan cara melakukannya pada Langkah 6.

Server MySQL Anda sekarang telah terpasang dan aman. Selanjutnya, Anda akan menginstal PHP, komponen terakhir dalam tumpukan LEMP.

Langkah 3 – Menginstal PHP

Pasang PHP untuk memproses kode dan menghasilkan konten dinamis. Nginx memerlukan program eksternal untuk pemrosesan PHP.

PHP-FPM ("manajer proses fastCGI") menangani pemrosesan PHP secara efisien dengan fitur keamanan tambahan, memberikan kinerja yang lebih baik untuk situs web berbasis PHP. Instal php-fpm untuk mengarahkan permintaan PHP dari Nginx, dan php-mysql untuk mengaktifkan komunikasi PHP-MySQL. Paket inti PHP akan terinstal secara otomatis sebagai dependensi.

Untuk menginstal paket php8.1-fpm dan php-mysql, jalankan:

sudo apt install php8.1-fpm php-mysql

Saat diminta, tekan Y dan ENTER untuk mengonfirmasi instalasi.

Periksa bahwa PHP-FPM sedang berjalan:

sudo systemctl status php8.1-fpm

Anda seharusnya melihat keluaran yang menunjukkan PHP-FPM aktif:

● php8.1-fpm.service - The PHP 8.1 FastCGI Process Manager
     Loaded: loaded
     Active: active (running)

Anda juga dapat memeriksa versi PHP:

php -v
PHP 8.1.x (cli) (built: ...)
Copyright (c) The PHP Group
Zend Engine v4.1.x

Konfigurasikan Nginx untuk menggunakan komponen PHP ini.

Langkah 4 — Mengonfigurasi Nginx untuk Menggunakan Prosesor PHP

Buat server blocks Nginx (mirip dengan virtual host Apache) untuk mengenkapsulasi konfigurasi dan menampung beberapa domain di satu server. Panduan ini menggunakan your_domain sebagai contoh nama domain.

Info: Untuk mempelajari lebih lanjut tentang cara mengatur nama domain dengan Linux-Console.net, baca pengantar kami tentang DNS Linux-Console.net.

Di Ubuntu 22.04, Nginx mengaktifkan satu blok server default yang menyajikan dokumen dari /var/www/html. Untuk beberapa situs, buatlah struktur direktori di dalam /var/www untuk your_domain, dengan meninggalkan /var/www/html sebagai direktori cadangan default.

Buat direktori web root untuk your_domain sebagai berikut:

sudo mkdir /var/www/your_domain

Selanjutnya, tetapkan kepemilikan direktori dengan variabel lingkungan $USER, yang akan merujuk pada pengguna sistem Anda saat ini:

sudo chown -R $USER:$USER /var/www/your_domain

Kemudian, buka file konfigurasi baru di direktori sites-available Nginx menggunakan editor baris perintah pilihan Anda. Di sini, kita akan menggunakan nano:

sudo nano /etc/nginx/sites-available/your_domain

Ini akan membuat file kosong baru. Masukkan konfigurasi dasar berikut:

server {
    listen 80;
    server_name your_domain www.your_domain;
    root /var/www/your_domain;

    index index.html index.htm index.php;

    location / {
        try_files $uri $uri/ =404;
    }

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

    location ~ /\.ht {
        deny all;
    }

}

Ini yang dilakukan oleh masing-masing direktif dan blok lokasi ini:

  • listen — Menentukan port yang akan didengarkan oleh Nginx. Dalam hal ini, Nginx akan mendengarkan pada port 80, port default untuk HTTP.
  • root — Menentukan root dokumen di mana file yang dilayani oleh situs web ini disimpan.
  • index — Menentukan urutan di mana Nginx akan memprioritaskan file index untuk situs web ini. Hal yang umum dilakukan adalah menempatkan file index.html dengan prioritas lebih tinggi daripada file index.php untuk memungkinkan pembuatan halaman landing pemeliharaan dengan cepat pada aplikasi PHP. Anda dapat menyesuaikan pengaturan ini agar lebih sesuai dengan kebutuhan aplikasi Anda.
  • server_name — Menentukan nama domain dan/atau alamat IP mana yang harus ditangani oleh blok server ini. Arahkan direktif ini ke nama domain server Anda atau alamat IP publik.
  • location / — Blok lokasi pertama mencakup direktif try_files, yang memeriksa keberadaan file atau direktori yang sesuai dengan permintaan URL. Jika Nginx tidak dapat menemukan sumber daya yang sesuai, ia akan mengembalikan kesalahan 404.
  • location ~ \.php$ — Blok lokasi ini menangani pemrosesan PHP aktual dengan mengarahkan Nginx ke file konfigurasi fastcgi-php.conf dan file php8.1-fpm.sock, yang menyatakan soket mana yang terkait dengan php8.1-fpm.
  • location ~ /\.ht — Blok lokasi terakhir menangani file .htaccess, yang tidak diproses oleh Nginx. Dengan menambahkan direktif deny all, jika ada file .htaccess yang terlanjur masuk ke dalam root dokumen, file tersebut tidak akan disajikan kepada pengunjung.

Setelah selesai mengedit, simpan dan tutup file. Jika Anda menggunakan nano, Anda dapat melakukannya dengan menekan CTRL+X kemudian Y dan ENTER untuk mengonfirmasi.

Aktifkan konfigurasi Anda dengan menautkannya ke file konfigurasi dari direktori sites-enabled Nginx:

sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

Kemudian, lepaskan tautan file konfigurasi default dari direktori /sites-enabled/:

sudo unlink /etc/nginx/sites-enabled/default

Catatan: Jika Anda perlu mengembalikan konfigurasi default, Anda dapat melakukannya dengan membuat ulang tautan simbolik, seperti berikut:

sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/

Ini akan memberitahu Nginx untuk menggunakan konfigurasi saat dimuat ulang berikutnya. Anda dapat menguji konfigurasi Anda untuk kesalahan sintaks dengan menjalankan perintah berikut:

sudo nginx -t

Jika ada kesalahan yang dilaporkan, kembali ke file konfigurasi Anda untuk meninjau isinya sebelum melanjutkan.

Saat Anda siap, muat ulang Nginx untuk menerapkan perubahan:

sudo systemctl reload nginx

Situs web baru Anda sekarang aktif, tetapi root web /var/www/your_domain masih kosong. Buat file index.html di lokasi tersebut agar Anda dapat menguji bahwa blok server baru Anda berfungsi seperti yang diharapkan:

nano /var/www/your_domain/index.html

Sertakan konten berikut dalam file ini:

<html>
  <head>
    <title>your_domain website</title>
  </head>
  <body>
    <h1>Hello World!</h1>

    <p>This is the landing page of <strong>your_domain</strong>.</p>
  </body>
</html>

Sekarang buka browser Anda dan akses nama domain atau alamat IP server Anda, seperti yang tercantum dalam direktif server_name di file konfigurasi blok server Anda:

http://server_domain_or_IP

Anda akan menerima halaman seperti berikut:

Jika Anda menerima halaman ini, itu berarti blok server Nginx Anda berfungsi seperti yang diharapkan.

Anda dapat membiarkan berkas ini tetap ada sebagai halaman sementara untuk aplikasi Anda sampai Anda membuat berkas index.php untuk menggantikannya.

Peringatan: Setelah menambahkan file index.php Anda, pastikan untuk menghapus atau mengganti nama file index.html dari root dokumen Anda. Jika kedua file ada, Nginx akan menayangkan index.html secara default, dan halaman PHP Anda tidak akan ditampilkan—ini adalah sumber kebingungan yang umum bagi pengguna baru.

Tumpukan LEMP Anda kini telah sepenuhnya dikonfigurasi. Pada langkah berikutnya, Anda akan membuat skrip PHP untuk menguji bahwa Nginx memang dapat menangani file .php di dalam situs web yang baru dikonfigurasi.

Langkah 5 – Menguji PHP dengan Nginx

Tumpukan LEMP Anda sekarang seharusnya sudah sepenuhnya terpasang. Anda dapat mengujinya untuk memvalidasi bahwa Nginx dapat menangani file .php dengan benar ke prosesor PHP Anda.

Anda dapat melakukannya dengan membuat file PHP percobaan di root dokumen Anda. Buka file baru bernama info.php di dalam root dokumen Anda menggunakan editor teks favorit Anda:

nano /var/www/your_domain/info.php

Tambahkan baris-baris berikut ke dalam file baru. Ini adalah kode PHP yang valid yang akan mengembalikan informasi tentang server Anda:

<?php
phpinfo();

Setelah selesai, simpan dan tutup berkasnya.

Sekarang Anda dapat mengakses halaman ini di browser web Anda dengan mengunjungi nama domain atau alamat IP publik yang telah Anda atur di file konfigurasi Nginx Anda, diikuti oleh /info.php:

http://server_domain_or_IP/info.php

Anda akan menerima halaman web yang berisi informasi rinci tentang server Anda:

Setelah memeriksa informasi yang relevan tentang server PHP Anda melalui halaman itu, sebaiknya hapus file yang Anda buat karena berisi informasi sensitif tentang lingkungan PHP Anda dan server Ubuntu Anda. Anda dapat menggunakan rm untuk menghapus file tersebut:

sudo rm /var/www/your_domain/info.php

Anda selalu bisa membuat ulang file ini jika membutuhkannya nanti.

Langkah 6 — Menguji Koneksi Database dari PHP (Opsional)

Jika Anda ingin menguji apakah PHP dapat terhubung ke MySQL dan mengeksekusi query database, Anda dapat membuat tabel uji dengan data dummy dan mengambil isinya melalui skrip PHP. Sebelum melakukannya, Anda perlu membuat database uji dan pengguna MySQL baru yang dikonfigurasi dengan benar untuk mengaksesnya.

Catatan: Beberapa versi lama dari pustaka PHP MySQL bawaan mysqlnd tidak mendukung caching_sha2_authentication, metode autentikasi default untuk MySQL 8, Anda mungkin perlu memastikan mereka dikonfigurasi untuk menggunakan mysql_native_password sebagai gantinya.

Kami akan membuat basis data bernama example_database dan pengguna bernama example_user, tetapi Anda bisa mengganti nama-nama ini dengan nilai yang berbeda.

Pertama, sambungkan ke konsol MySQL menggunakan akun root:

sudo mysql

Untuk membuat database baru, jalankan perintah berikut dari konsol MySQL Anda:

CREATE DATABASE example_database;

Sekarang Anda dapat membuat pengguna baru dan memberikan mereka hak penuh pada database kustom yang telah Anda buat.

Perintah berikut membuat pengguna baru bernama example_user, menggunakan mysql_native_password sebagai metode autentikasi default. Kami menetapkan kata sandi pengguna ini sebagai password, tetapi Anda sebaiknya mengganti nilai ini dengan kata sandi yang aman sesuai pilihan Anda sendiri.

CREATE USER 'example_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

Sekarang kita perlu memberikan pengguna ini izin atas database example_database:

GRANT ALL ON example_database.* TO 'example_user'@'%';

Ini akan memberikan pengguna example_user hak penuh atas database example_database sambil mencegah pengguna ini membuat atau memodifikasi database lain di server Anda.

Sekarang keluar dari shell MySQL dengan perintah berikut:

exit

Anda dapat menguji apakah pengguna baru memiliki izin yang tepat dengan masuk kembali ke konsol MySQL, kali ini menggunakan kredensial pengguna kustom. Perhatikan flag -p dalam perintah ini, yang akan meminta Anda untuk memasukkan kata sandi yang digunakan saat membuat pengguna example_user:

mysql -u example_user -p

Setelah masuk ke konsol MySQL, pastikan bahwa Anda memiliki akses ke database example_database:

SHOW DATABASES;

Ini akan menghasilkan output berikut:

+--------------------+
| Database           |
+--------------------+
| example_database   |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)

Selanjutnya, kita akan membuat tabel uji bernama todo_list. Dari konsol MySQL, jalankan pernyataan berikut:

CREATE TABLE example_database.todo_list (

 item_id INT AUTO_INCREMENT,

 content VARCHAR(255),

 PRIMARY KEY(item_id)

);

Masukkan beberapa baris konten ke dalam tabel tes. Anda mungkin ingin mengulangi perintah berikut beberapa kali, menggunakan nilai yang berbeda:

INSERT INTO example_database.todo_list (content) VALUES ("My first important item");

Untuk memastikan bahwa data berhasil disimpan ke tabel Anda, jalankan:

SELECT * FROM example_database.todo_list;

Keluaran Anda seharusnya ditampilkan sebagai berikut:

+---------+--------------------------+
| item_id | content                  |
+---------+--------------------------+
|       1 | My first important item  |
|       2 | My second important item |
|       3 | My third important item  |
|       4 | and this one more thing  |
+---------+--------------------------+
4 rows in set (0.000 sec)

Setelah memastikan bahwa Anda memiliki data yang valid di tabel uji Anda, Anda dapat keluar dari konsol MySQL:

exit

Sekarang Anda dapat membuat skrip PHP yang akan terhubung ke MySQL dan melakukan query untuk konten Anda. Buat file PHP baru di direktori root web kustom Anda menggunakan editor pilihan Anda. Kita akan menggunakan nano untuk itu:

nano /var/www/your_domain/todo_list.php

Skrip PHP berikut menghubungkan ke database MySQL dan mengambil isi dari tabel todo_list, menampilkan hasilnya dalam bentuk daftar. Jika ada masalah dengan koneksi database, skrip ini akan memunculkan exception.

Tambahkan konten berikut ke skrip todo_list.php Anda:

<?php
$user = "example_user";
$password = "password";
$database = "example_database";
$table = "todo_list";

try {
  $db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);
  echo "<h2>TODO</h2><ol>"; 
  foreach($db->query("SELECT content FROM $table") as $row) {
    echo "<li>" . $row['content'] . "</li>";
  }
  echo "</ol>";
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

Simpan dan tutup file setelah Anda selesai mengedit.

Sekarang Anda dapat mengakses halaman ini di peramban web Anda dengan mengunjungi nama domain atau alamat IP publik yang dikonfigurasi untuk situs web Anda, diikuti dengan /todo_list.php:

http://server_domain_or_IP/todo_list.php

Anda seharusnya menerima halaman seperti berikut, yang menunjukkan konten yang telah Anda masukkan ke dalam tabel uji Anda:

Itu berarti lingkungan PHP Anda siap untuk terhubung dan berinteraksi dengan server MySQL Anda.

Pertanyaan yang Sering Diajukan

Apa kegunaan stack LEMP?

Stack LEMP digunakan untuk menghosting situs web dan aplikasi berbasis PHP yang dinamis termasuk WordPress, Laravel, Magento, Drupal, dan proyek PHP kustom. Ini sangat efektif untuk situs dengan lalu lintas tinggi yang membutuhkan penanganan koneksi bersamaan yang efisien.

Apa perbedaan antara stack LEMP dan LAMP?

LEMP menggunakan Nginx, yang menangani koneksi secara asinkron dengan arsitektur berbasis event—efisien untuk pengguna yang bersamaan. LAMP menggunakan Apache, yang secara tradisional membuat satu thread per permintaan (meskipun Apache modern mendukung mode berbasis event). LEMP umumnya menawarkan kinerja yang lebih baik untuk konten statis dan skenario dengan konkuensi tinggi, sementara LAMP menyediakan konfigurasi .htaccess yang lebih mudah dan dukungan modul yang lebih luas.

Versi Ubuntu mana yang sebaiknya saya gunakan untuk LEMP?

Ubuntu 22.04 LTS adalah target utama untuk panduan ini, menampilkan PHP 8.1, MySQL 8.0, dan Nginx dengan dukungan jangka panjang. Ubuntu 24.04 LTS (rilis terbaru) secara default sudah menyertakan PHP 8.3 dan dapat digunakan dengan panduan ini dengan menyesuaikan jalur socket PHP-FPM dan nomor versinya sesuai kebutuhan.

Bagaimana cara menginstal stack LEMP di Ubuntu 24.04?

Ikuti langkah-langkah inti berikut:

  1. Pasang Nginx: sudo apt install nginx
  2. Pasang MySQL: sudo apt install mysql-server
  3. Jalankan skrip keamanan MySQL: sudo mysql_secure_installation
  4. Pasang PHP-FPM: sudo apt install php-fpm php-mysql
  5. Konfigurasi blok server Nginx dengan integrasi PHP-FPM
  6. Uji dengan info.php dan koneksi database

Lihat panduan lengkap pada Langkah 1-6 di atas.

Versi PHP apa yang sebaiknya saya pasang dengan Nginx dan MySQL?

Gunakan PHP bawaan versi Ubuntu Anda untuk kompatibilitas terbaik:

  • Ubuntu 22.04: PHP 8.1 (diinstal melalui php8.1-fpm)
  • Ubuntu 24.04: PHP 8.3 (sesuaikan perintah dengan php8.3-fpm untuk versi ini)

Kedua versi bekerja dengan baik dengan Nginx dan MySQL 8.0, mendukung kerangka kerja modern, dan menerima pembaruan keamanan secara aktif.

Bagaimana cara mengonfigurasi Nginx untuk memproses file PHP?

Tambahkan blok location ~ \.php$ ke konfigurasi server Nginx Anda yang mengarahkan permintaan PHP ke PHP-FPM melalui soket Unix:

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

Sesuaikan jalur socket berdasarkan versi PHP Anda, uji dengan sudo nginx -t, dan muat ulang dengan sudo systemctl reload nginx.

Mengapa saya mendapatkan kesalahan "502 Bad Gateway" setelah menginstal PHP-FPM?

Kesalahan 502 menunjukkan Nginx tidak dapat berkomunikasi dengan PHP-FPM. Penyebab umum:

  1. PHP-FPM tidak berjalan: Periksa dengan sudo systemctl status php8.1-fpm dan jalankan jika diperlukan
  2. Jalur soket salah: Periksa apakah /run/php/php8.1-fpm.sock ada dan sesuai dengan konfigurasi Nginx Anda
  3. Masalah izin: Pastikan pengguna Nginx (www-data) dapat mengakses soket
  4. Kesalahan konfigurasi PHP-FPM: Periksa log di /var/log/php8.1-fpm.log

Solusi: Mulai ulang kedua layanan:

sudo systemctl restart php8.1-fpm nginx

Bagaimana cara mengamankan MySQL setelah instalasi?

Jalankan skrip keamanan bawaan:

sudo mysql_secure_installation

Ikuti petunjuk untuk:

  • Aktifkan plugin validasi kata sandi
  • Tetapkan kata sandi root yang kuat
  • Hapus pengguna anonim
  • Nonaktifkan login root jarak jauh
  • Hapus basis data uji
  • Memuat ulang hak istimewa

Untuk database aplikasi, buat pengguna khusus dengan hak terbatas daripada menggunakan akun root.

Apakah saya bisa menjalankan beberapa situs web di satu server LEMP?

Ya, buat blok server Nginx terpisah untuk setiap domain:

  1. Buat direktori: sudo mkdir -p /var/www/second_domain
  2. Buat blok server: sudo nano /etc/nginx/sites-available/second_domain
  3. Konfigurasikan dengan direktif server_name dan root yang unik
  4. Aktifkan: sudo ln -s /etc/nginx/sites-available/second_domain /etc/nginx/sites-enabled/
  5. Uji dan muat ulang: sudo nginx -t && sudo systemctl reload nginx

Setiap situs dapat memiliki pengaturan PHP dan pengguna database yang terpisah.

Bagaimana cara meningkatkan PHP ke versi yang lebih baru?

Peningkatan paket Ubuntu menangani versi minor secara otomatis. Untuk peningkatan versi mayor:

  1. Tambahkan PHP PPA Ondřej (repositori pihak ketiga tepercaya):

    sudo add-apt-repository ppa:ondrej/php
    sudo apt update
  2. Pasang versi PHP-FPM baru:

    sudo apt install php8.3-fpm php8.3-mysql -y
  3. Perbarui jalur socket konfigurasi Nginx ke /run/php/php8.3-fpm.sock

  4. Uji dan muat ulang Nginx

  5. Opsional hapus versi lama: sudo apt purge php8.1-fpm

Selalu uji di staging sebelum meningkatkan sistem produksi.

Pemecahan Masalah Umum

502 Kesalahan Gerbang Buruk

Masalah LEMP stack yang paling umum terjadi ketika Nginx tidak dapat berkomunikasi dengan PHP-FPM:

Periksa Status PHP-FPM:

sudo systemctl status php8.1-fpm

Verifikasi Jalur Soket:

ls -la /run/php/

Output yang diharapkan harus menampilkan file php8.1-fpm.sock.

Perbaikan Umum:

  1. Restart PHP-FPM: sudo systemctl restart php8.1-fpm
  2. Periksa apakah jalur socket blok server Nginx sesuai dengan socket PHP-FPM yang sebenarnya
  3. Periksa izin file: sudo chown www-data:www-data /run/php/php8.1-fpm.sock

Kesalahan Izin Ditolak

Perbaiki izin direktori web:

sudo chown -R www-data:www-data /var/www/your_domain
sudo chmod -R 755 /var/www/your_domain

Masalah Koneksi MySQL

Reset password root MySQL:

sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_password';
FLUSH PRIVILEGES;
EXIT;

Periksa layanan MySQL:

sudo systemctl status mysql

PHP Tidak Memproses

Periksa modul PHP:

php -m | grep -E 'mysql|fpm'

Periksa konfigurasi PHP-FPM:

sudo nginx -t
sudo php-fpm8.1 -t

Perbaiki Kesalahan 404:

  • Verifikasi index.php tercantum dalam direktif index Nginx
  • Periksa apakah file ada: ls -la /var/www/your_domain/
  • Tinjau log kesalahan Nginx: sudo tail -f /var/log/nginx/error.log

Kesimpulan

Dalam panduan ini, Anda membangun fondasi yang fleksibel untuk menyajikan situs web dan aplikasi PHP kepada pengunjung Anda, menggunakan Nginx sebagai server web dan MySQL sebagai sistem basis data. Anda juga dapat melakukan ini dengan server web Apache, lihat tutorial kami tentang Cara Menginstal stack Linux, Apache, MySQL, PHP (LAMP) di Ubuntu. Anda juga dapat mengamankan situs Anda dengan Let’s Encrypt, yang menyediakan sertifikat gratis dan terpercaya. Pelajari cara melakukannya dengan panduan kami tentang Let’s Encrypt untuk Apache.

Terima kasih telah belajar bersama Komunitas Linux-Console.net.