Ubuntu 22.04 Server / Cara Menginstal Apache, PHP, dan MariaDB
Di Ubuntu 22.04 Server, instal Apache, modul PHP untuk Apache, MariaDB, dan ekstensi basis data PHP untuk menyiapkan lingkungan Web dasar. Setelah itu, pisahkan akun administrator MariaDB dari akun aplikasi Web dan pastikan PHP dapat membaca nilai dari basis data.
Lingkup instalasi dan paket
Panduan ini menjalankan Apache dan MariaDB pada satu server baru dengan repositori bawaan Ubuntu 22.04. Anda memerlukan hak sudo dan koneksi Internet untuk mengunduh paket. Pada server yang sudah digunakan, cadangkan konfigurasi Web dan basis data terlebih dahulu, lalu periksa apakah nama berkas, akun, dan basis data contoh sudah dipakai. Jika sudah menggunakan PHP-FPM, jangan campurkan konfigurasi modul Apache ini ke dalam konfigurasi tersebut.
- Perbarui indeks paket dan instal komponennya.
libapache2-mod-phpmenangani PHP di Apache, sedangkanphp-mysqlmenyediakan ekstensi untuk mengakses MariaDB. Instal jugaphp-cliuntuk pemeriksaan melalui terminal. Lihat panduan instalasi PHP Ubuntu untuk konfigurasi ini.
sudo apt update
sudo apt install apache2 mariadb-server php php-cli libapache2-mod-php php-mysql
- Jalankan layanan dan aktifkan agar otomatis berjalan saat boot. Pastikan pemeriksaan konfigurasi Apache menampilkan
Syntax OK, lalu mulai ulang Apache untuk memuat modul PHP.
sudo systemctl enable --now apache2 mariadb
sudo apache2ctl configtest
sudo systemctl restart apache2
systemctl is-active apache2 mariadb
Perintah terakhir menampilkan active untuk setiap layanan yang sedang berjalan. Periksa versi terpasang dengan apache2 -v, php -v, dan mariadb --version. Repositori tambahan dapat menyediakan versi PHP yang berbeda dari repositori bawaan.
Memeriksa autentikasi administrator MariaDB
Paket MariaDB bawaan Ubuntu biasanya menggunakan autentikasi soket Unix untuk administrasi lokal. Cara ini memeriksa identitas pengguna sistem operasi; bukan berarti siapa saja dapat masuk dengan kata sandi root kosong. Buka sesi administrator berikut untuk memeriksa akun dan konfigurasi saat ini.
sudo mariadb --protocol=socket
SELECT VERSION(), CURRENT_USER();
SHOW CREATE USER 'root'@'localhost';
EXIT;
Autentikasi root dapat berbeda pada konfigurasi yang sudah ada. Contoh ini mempertahankan autentikasi soket dan membuat akun aplikasi terpisah, sesuai penjelasan autentikasi MariaDB sejak versi 10.4. Jangan langsung melakukan UPDATE pada nilai plugin di mysql.user atau menggunakan root di aplikasi Web.
Gunakan alat berikut untuk meninjau pengaturan keamanan awal. Teks dan urutan pertanyaan bergantung pada versi serta konfigurasi, jadi jangan otomatis menjawab Y untuk semuanya.
sudo mariadb-secure-installation
- Jika administrasi sudah memakai autentikasi soket, Anda dapat mempertahankannya. Dokumentasi resmi alat MariaDB menjelaskan bahwa kata sandi root baru biasanya tidak diperlukan pada konfigurasi ini.
- Pada server baru, sebaiknya hapus pengguna anonim dan basis data test yang tidak dibutuhkan serta batasi login root dari jarak jauh. Jika ada layanan yang sudah berjalan, periksa penggunaannya sebelum memutuskan. Terapkan perubahan ketika diminta memuat ulang tabel hak akses.
Membuat basis data dan akun khusus aplikasi
Hubungkan kembali dengan sudo mariadb --protocol=socket dan jalankan SQL berikut. lampdemo dan lamp_app adalah nama baru untuk latihan ini. Jika sudah ada, gunakan nama lain secara konsisten pada seluruh contoh berikutnya; jangan menimpa atau menghapus objek yang sudah ada. Ganti penanda kata sandi dengan kata sandi panjang dan unik, lalu gunakan nilai yang sama dalam konfigurasi PHP. Jika mengandung tanda petik tunggal, ikuti aturan escape string SQL dan PHP masing-masing.
CREATE DATABASE lampdemo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'lamp_app'@'localhost' IDENTIFIED BY 'REPLACE_WITH_A_LONG_UNIQUE_PASSWORD';
GRANT SELECT, INSERT, UPDATE, DELETE ON lampdemo.* TO 'lamp_app'@'localhost';
CREATE TABLE lampdemo.health_check (
id INT PRIMARY KEY,
message VARCHAR(100) NOT NULL
);
INSERT INTO lampdemo.health_check (id, message) VALUES (1, 'database-ok');
EXIT;
Administrator membuat tabel, sedangkan aplikasi hanya memperoleh izin membaca, menambah, memperbarui, dan menghapus data pada basis data ini. Jika pemasang aplikasi membutuhkan izin membuat tabel, tinjau kebutuhan itu secara terpisah. Setelah pemberian hak dengan GRANT, tidak perlu menjalankan FLUSH PRIVILEGES tambahan.
Jalankan kueri melalui terminal dengan akun aplikasi dan periksa apakah database-ok muncul. Jangan menuliskan kata sandi setelah -p; masukkan saat diminta.
mariadb --protocol=socket -u lamp_app -p lampdemo -e "SELECT message FROM health_check WHERE id=1;"
Membuat berkas contoh integrasi PHP
Direktori dokumen Web untuk situs Apache bawaan Ubuntu biasanya /var/www/html. Untuk virtual host yang sudah ada, periksa sudo apache2ctl -S serta pengaturan DocumentRoot situs dan sesuaikan lokasi berkas Web contoh. Gunakan nama lain jika berkas di bawah sudah ada. Simpan konfigurasi yang mengandung kata sandi di luar direktori Web.
- Buat direktori konfigurasi dan buka editor. Izin berikut mengasumsikan Apache berjalan sebagai pengguna dan grup bawaan Ubuntu,
www-data.
sudo install -d -o root -g www-data -m 0750 /etc/lamp-demo
sudoedit /etc/lamp-demo/database.php
Simpan seluruh isi berikut ke /etc/lamp-demo/database.php. Ganti nilai password dengan kata sandi aplikasi yang dibuat sebelumnya. Seperti dijelaskan dalam dokumentasi koneksi PDO_MYSQL PHP, host=localhost memakai soket di Unix. Mengubahnya menjadi 127.0.0.1 memilih TCP dan dapat mengubah pencocokan akun serta persyaratan koneksi.
<?php
return [
'dsn' => 'mysql:host=localhost;dbname=lampdemo;charset=utf8mb4',
'user' => 'lamp_app',
'password' => 'REPLACE_WITH_A_LONG_UNIQUE_PASSWORD',
];
- Pertahankan root sebagai pemilik konfigurasi dan izinkan pembacaan hanya untuk pemilik serta grup Apache. Selanjutnya, buka berkas pemeriksaan Web.
sudo chown root:www-data /etc/lamp-demo/database.php
sudo chmod 0640 /etc/lamp-demo/database.php
sudoedit /var/www/html/lamp-check.php
Simpan seluruh isi berikut ke /var/www/html/lamp-check.php. PDO (PHP Data Objects) adalah antarmuka untuk mengakses basis data dari PHP. Kode ini memeriksa nilai tabel yang sebenarnya sebelum menampilkan pesan berhasil. Jika gagal, responsnya berupa HTTP 500 dan pesan umum, sedangkan penyebab terperinci dicatat pada log server.
<?php
declare(strict_types=1);
header('Content-Type: text/plain; charset=UTF-8');
try {
$config = require '/etc/lamp-demo/database.php';
$pdo = new PDO($config['dsn'], $config['user'], $config['password'], [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$message = $pdo->query('SELECT message FROM health_check WHERE id = 1')->fetchColumn();
if ($message !== 'database-ok') {
throw new RuntimeException('Unexpected database result');
}
echo "PHP OK\nDatabase OK\n";
} catch (Throwable $e) {
http_response_code(500);
error_log('lamp-check failed: ' . $e->getMessage());
echo "Check failed; review server logs.\n";
}
- Berikan izin baca pada berkas pemeriksaan Web dan periksa sintaks PHP kedua berkas.
No syntax errors detectedhanya menyatakan sintaks valid, bukan keberhasilan koneksi basis data.
sudo chown root:root /var/www/html/lamp-check.php
sudo chmod 0644 /var/www/html/lamp-check.php
sudo php -l /etc/lamp-demo/database.php
php -l /var/www/html/lamp-check.php
Pengguna biasa mungkin tidak dapat membaca konfigurasi, sehingga pemeriksaan sintaks berkas itu memakai sudo. Tidak perlu memberi izin tulis pada seluruh direktori Web atau menerapkan chmod 777.
Memeriksa respons HTTP dan koneksi basis data
Akses URL berikut dari server itu sendiri. Jika curl belum ada, instal dengan sudo apt install curl. Status HTTP 200 beserta dua baris berikut pada isi respons berarti Apache menjalankan PHP dan PHP membaca baris contoh di MariaDB.
curl -i http://127.0.0.1/lamp-check.php
PHP OK
Database OK
Dari komputer lain, buka http://SERVER-IP/lamp-check.php di peramban. Untuk virtual host, gunakan nama host yang dikonfigurasi. Melihat halaman sambutan bawaan saja atau menjalankan php -v belum memverifikasi integrasi ini.
Jika akses lokal berhasil tetapi komputer lain gagal terhubung, periksa sudo ufw status verbose, grup keamanan cloud, dan perutean. Dalam jaringan privat untuk latihan dengan UFW yang sudah aktif, aturan berikut mengizinkan HTTP port 80 hanya dari subnet tujuan. Ganti contoh 192.168.10.0/24 dengan subnet tepercaya Anda. Jangan mematikan firewall atau mengaktifkannya untuk pertama kali tanpa mengizinkan SSH jarak jauh demi pengujian ini.
sudo ufw allow from 192.168.10.0/24 to any port 80 proto tcp
PHP dan MariaDB berkomunikasi melalui soket pada server yang sama, jadi port 3306 tidak perlu dibuka ke luar. Lakukan latihan HTTP di lingkungan tepercaya. Sebelum mengirim informasi login atau data lain dalam produksi, siapkan domain, virtual host, dan sertifikat HTTPS secara terpisah.
Memecahkan masalah dan membersihkan pengujian
Untuk mempersempit kegagalan koneksi, periksa status layanan, modul PHP, akun, dan izin berkas secara berurutan. Perintah berikut menunjukkan konfigurasi serta modul Apache dan log terbaru kedua layanan. Log dapat mengandung informasi operasional; jangan memublikasikannya tanpa diperiksa.
sudo apache2ctl configtest
sudo apache2ctl -M
sudo tail -n 50 /var/log/apache2/error.log
sudo journalctl -u apache2 -u mariadb -n 50 --no-pager
- Sumber PHP ditampilkan atau diunduh: hentikan akses publik dan periksa apakah modul PHP Apache aktif serta Apache sudah dimulai ulang. Jika instalasi
libapache2-mod-phpbelum menyelesaikannya, tinjau juga konfigurasi PHP-FPM dan virtual host yang sudah ada. - could not find driver: pastikan ekstensi
php-mysqluntuk versi PHP yang dipakai Apache sudah terpasang dan aktif, kemudian mulai ulang Apache. PHP terminal dan PHP Apache dapat memakai konfigurasi berbeda. - Access denied: periksa kata sandi aplikasi, akun
'lamp_app'@'localhost', dan hak aksesnya. Jangan mengubah autentikasi root atau memberikan hak global untuk mengatasi masalah. Jika soket tidak ditemukan, bandingkan hasilSHOW VARIABLES LIKE 'socket';di MariaDB dengan pengaturan soket PHP. - Permission denied atau 404: periksa apakah pengguna Apache dapat membaca konfigurasi dan apakah berkas Web berada di DocumentRoot situs yang diminta. Periksa juga izin akses direktori
/etc/lamp-demo.
Setelah selesai, hapus hanya berkas Web pengujian yang dibuat dalam panduan ini dengan perintah berikut, lalu pastikan URL yang sama tidak lagi menghasilkan pesan berhasil. Jangan tinggalkan berkas pengungkap lingkungan seperti phpinfo.php yang sudah ada. Jika aplikasi sebenarnya memakai konfigurasi tersebut, pertahankan di luar direktori Web dengan izin terbatas.
sudo rm -- /var/www/html/lamp-check.php
Untuk menghapus data latihan juga, pastikan tidak ada layanan lain yang menggunakannya lalu jalankan SQL berikut melalui sesi administrator. Penghapusan basis data tidak dapat dibatalkan; cadangkan data yang diperlukan terlebih dahulu. Terapkan hanya pada nama yang baru dibuat untuk latihan ini.
DROP DATABASE lampdemo;
DROP USER 'lamp_app'@'localhost';
Pada konfigurasi satu server, pertahankan pengaturan binding lokal MariaDB. Jika akses basis data jarak jauh diperlukan secara terpisah, jangan langsung menghapus bind-address; rencanakan alamat dengar, sumber yang diizinkan, akun khusus, dan koneksi terenkripsi secara bersama.



