Ubuntu 18.04 Server: instal dan konfigurasi Nginx, PHP, dan MariaDB

Untuk menggunakan Nginx, PHP-FPM, dan MariaDB bersama-sama di Ubuntu 18.04, Anda perlu menginstal setiap paket, mengarahkan permintaan PHP Nginx ke socket PHP-FPM, dan kemudian menyiapkan database dengan akun terpisah. Contoh di bawah ini adalah latihan lokal saja yang tidak mengubah situs yang ada, dan tidak menggunakan akun root database untuk aplikasi web.

Ruang Lingkup Latihan dan Persiapan

Dukungan keamanan umum untuk Ubuntu 18.04 telah berakhir. Periksa apakah Extended Security Maintenance (ESM) dari Ubuntu Pro diterapkan dan jangkauan dukungan untuk setiap paket di Jadwal Pemeliharaan Keamanan Ubuntu, dan disarankan untuk membangun lingkungan operasi baru dengan versi yang didukung. Artikel ini menggunakan PHP 7.2 dari repositori default sebagai contoh untuk memahami server 18.04 yang ada.

Siapkan server uji terpisah dengan hak administrator dan akses ke repositori. Nginx menangani permintaan web, PHP-FPM (FastCGI Process Manager) mengeksekusi kode PHP, dan MariaDB menyimpan data. Contoh hanya diterima di 127.0.0.1:8080, jadi Anda tidak dapat mengaksesnya langsung dari luar server. Untuk akses internet publik, diperlukan firewall terpisah, domain, sertifikat TLS, dan tinjauan keamanan.

Pada server dengan layanan atau data yang sudah ada, siapkan prosedur cadangan dan pemulihan sebelum melakukan perubahan. Jika jalur praktik, akun, nama basis data, atau port 8080 yang disebutkan di bawah sudah digunakan, jangan lanjutkan seperti adanya; gunakan lingkungan pengujian terpisah. Anda dapat memeriksa penggunaan port dengan perintah berikut. Jika tidak ada keluaran, tidak ada listener TCP untuk port tersebut.

sudo ss -lntp | grep ':8080 '

Instalasi paket dan verifikasi layanan

Instalasi paket dapat otomatis memulai situs bawaan Nginx yang dapat mendengarkan pada port 80. Membatasi situs latihan ke port lokal 8080 tidak membatasi situs bawaan tersebut. Isolasi server uji dengan kontrol jaringan dan firewall sebelum instalasi serta periksa dampaknya terhadap layanan yang ada.

Setelah memperbarui daftar paket, instal Nginx, PHP 7.2 FPM dengan driver MySQL, server MariaDB, dan curl untuk verifikasi. Jika paket tidak dapat digunakan karena masalah repositori atau dukungan, selesaikan kesalahan tersebut sebelum melanjutkan.

sudo apt update
sudo apt install nginx php7.2-fpm php7.2-mysql mariadb-server curl

Setelah instalasi, periksa status layanan dan soket PHP-FPM menggunakan perintah berikut. Jika layanan tidak berjalan, identifikasi penyebabnya dan mulai layanan. Jika jalur soket berbeda, sesuaikan konfigurasi Nginx di bawah ini agar sesuai dengan jalur yang sebenarnya.

systemctl is-active nginx php7.2-fpm mariadb
ls -l /run/php/

Periksa apakah masing-masing dari tiga layanan adalah active. Jika php7.2-fpm.sock tidak ada, periksa penyebabnya di systemctl status php7.2-fpm dan log layanan. Ketika versi PHP berbeda, Anda harus mengubah paket dan jalur soket secara bersamaan.

Koneksi Nginx dan PHP-FPM

Buat direktori praktik baru dan file konfigurasi. Jangan menimpa /var/www/lnmp-demo, /etc/nginx/sites-available/lnmp-demo, atau /etc/nginx/sites-enabled/lnmp-demo jika mereka sudah ada. Jalankan perintah pengeditan di bawah ini setelah memastikan tidak ada jalur yang ada pada server yang bersih.

sudo mkdir /var/www/lnmp-demo
sudo nano /etc/nginx/sites-available/lnmp-demo

Simpan seluruh blok server berikut di editor. fastcgi_pass harus sesuai dengan soket PHP-FPM yang telah dikonfirmasi sebelumnya. snippets/fastcgi-php.conf adalah potongan konfigurasi dari paket Nginx Ubuntu; jika file tersebut tidak ada, periksa pengaturan FastCGI di distribusi.

server {
    listen 127.0.0.1:8080;
    server_name localhost;
    root /var/www/lnmp-demo;
    index index.php;

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

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

Aktifkan dan periksa file konfigurasi. Hanya muat ulang jika nginx -t berhasil. Jika gagal, periksa dan perbaiki kesalahan, port, dan jalur soket, kemudian periksa kembali. Jika terjadi masalah, hapus hanya tautan simbolik yang dibuat dalam praktik ini, kemudian periksa kembali dan muat ulang untuk mempertahankan konfigurasi situs yang ada.

sudo ln -s /etc/nginx/sites-available/lnmp-demo /etc/nginx/sites-enabled/lnmp-demo
sudo nginx -t
sudo systemctl reload nginx

Koneksi FastCGI Nginx juga dapat diperiksa di Panduan Resmi Nginx.

Periksa Eksekusi PHP

Periksa bahwa tidak ada file di jalur di bawah ini dan buat file baru. Simpan kode di bawah ini di editor Anda.

sudo nano /var/www/lnmp-demo/index.php
<?php
header('Content-Type: text/plain; charset=UTF-8');
echo "PHP is working\n";
echo 'SAPI: ' . PHP_SAPI . "\n";

Jalankan perintah berikut di server yang sama. Jika PHP is working dan SAPI: fpm-fcgi muncul, Nginx telah mengeksekusi kode melalui PHP-FPM. Jika kode PHP ditampilkan apa adanya, konfigurasi belum diterapkan, jadi jangan mengekspos file uji dan periksa pengaturan FastCGI kembali.

curl http://127.0.0.1:8080/

Jika ada kesalahan 502, periksa layanan PHP-FPM, jalur socket, dan izin; jika ada kesalahan 404, periksa direktori dokumen dan jalur file. Jangan mengekspos halaman phpinfo() yang mengungkapkan pengaturan server secara rinci.

Database MariaDB dan Akun Terpisah

Otentikasi administrator MariaDB tergantung pada metode instalasi. Jika otentikasi socket lokal diatur, Anda dapat membuka konsol manajemen dengan perintah berikut. Jika gagal, verifikasi metode otentikasi administrator yang ada. MYSQL_HISTFILE=/dev/null menunjukkan bahwa sesi klien ini tidak boleh meninggalkan file riwayat perintah.

sudo env MYSQL_HISTFILE=/dev/null mysql

Berikut ini adalah SQL untuk membuat database praktik baru dan akun lokal saja. Jika nama yang sama sudah ada, jangan mengubah entri yang ada; gunakan nama yang berbeda. Sebelum eksekusi, ganti CHANGE_ME_STRONG_PASSWORD dengan kata sandi panjang dan unik, dan pastikan bahwa tanda kutip atau backslash dalam string SQL di-escape dengan benar.

CREATE DATABASE lnmp_demo CHARACTER SET utf8mb4;
CREATE USER 'lnmp_demo'@'localhost' IDENTIFIED BY 'CHANGE_ME_STRONG_PASSWORD';
GRANT SELECT ON lnmp_demo.* TO 'lnmp_demo'@'localhost';
EXIT;

Akun contoh ini memiliki izin hanya-baca pada database. Jika aplikasi yang nyata membutuhkan izin menulis atau mengubah skema, berikan hanya izin yang diperlukan secara terpisah. Jangan langsung memodifikasi plugin autentikasi dari akun admin atau memberikan hak istimewa root kepada aplikasi web. Untuk detail lebih lanjut tentang akun dan autentikasi, lihat dokumentasi MariaDB CREATE USER.

Verifikasi bahwa akun baru dapat terhubung secara lokal. Jangan tulis kata sandi langsung di baris perintah; masukkan di prompt. Setelah terhubung, menjalankan SELECT DATABASE(), CURRENT_USER(); akan menampilkan database dan akun yang telah diautentikasi. Keluar dari konsol menggunakan EXIT;.

mysql -u lnmp_demo -p lnmp_demo

Periksa koneksi database di PHP

Berikut adalah metode verifikasi sementara menggunakan akun yang dibuat di atas. Simpan kredensial di luar direktori dokumen web. Jika /etc/lnmp-demo sudah ada, jangan timpa; gunakan lingkungan pengujian terpisah sebagai gantinya. Ini mengasumsikan konfigurasi default di mana PHP-FPM berjalan di bawah grup www-data.

sudo install -d -m 750 -o root -g www-data /etc/lnmp-demo
sudo install -m 640 -o root -g www-data /dev/null /etc/lnmp-demo/db.php
sudo nano /etc/lnmp-demo/db.php

Masukkan konten berikut ke dalam file, dan ganti kata sandi dengan nilai yang ditetapkan untuk akun database. Jika ada tanda kutip atau garis miring terbalik dalam string PHP, lakukan escape dengan benar. Karena aplikasi lain yang berjalan dengan izin www-data yang sama juga dapat membaca file, isolasi terpisah diperlukan di server bersama.

<?php
return array(
    'user' => 'lnmp_demo',
    'password' => 'CHANGE_ME_STRONG_PASSWORD',
);

Pastikan /var/www/lnmp-demo/db-check.php tidak ada dan simpan kode berikut. Hanya tunjukkan keberhasilan atau kegagalan untuk menghindari menampilkan pesan kesalahan atau kata sandi di respons web.

sudo nano /var/www/lnmp-demo/db-check.php
<?php
header('Content-Type: text/plain; charset=UTF-8');
ini_set('display_errors', '0');
$config = require '/etc/lnmp-demo/db.php';
try {
    $db = new PDO('mysql:host=localhost;dbname=lnmp_demo;charset=utf8mb4',
        $config['user'], $config['password'],
        array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    echo "Database connection OK\n";
} catch (PDOException $e) {
    http_response_code(500);
    echo "Database connection failed\n";
}
curl -i http://127.0.0.1:8080/db-check.php

Jika HTTP 200 dan Database connection OK muncul, koneksi PHP ke MariaDB berhasil. Jika gagal, periksa ekstensi PHP MySQL, status layanan, autentikasi socket, dan akun/kata sandi. Setelah verifikasi, hapus dengan aman file PHP sementara dan file kredensial, serta bersihkan akun latihan dan basis data yang tidak lagi diperlukan, memeriksa baik target yang sebenarnya maupun cadangan.

Sebelum diterapkan ke lingkungan produksi

Pengaturan praktik ini untuk verifikasi koneksi lokal. Sebelum membuat layanan sebenarnya publik, migrasikan ke versi OS dan PHP yang didukung, dan konfigurasikan nama server Nginx serta root dokumen, sertifikat HTTPS, firewall, dan aturan jaringan cloud sesuai lingkungan. Anda juga perlu meninjau ruang lingkup unggah/eksekusi file PHP, pemisahan pengguna FPM, serta akses jaringan, cadangan, dan pemulihan MariaDB.

Alat konfigurasi keamanan MariaDB disediakan sebagai mysql_secure_installation atau mariadb-secure-installation tergantung versi yang terpasang. Karena ini dapat memengaruhi layanan yang ada, baca setiap pertanyaan dan pilih sesuai dengan lingkungan Anda. Item rinci dapat ditemukan di Deskripsi Alat Konfigurasi Keamanan MariaDB.