Apache HTTP Server adalah web server yang paling lama berkuasa dalam sejarah web — proyek yang lahir dari web server pertama dunia dan tetap dipakai oleh jutaan situs. Di Chapter Web Server
kita melihat arsitekturnya yang berbeda dari Nginx: proses atau thread per koneksi, konfigurasi yang boleh tersebar sampai level direktori, dan ekosistem module yang bisa dipasang-lepas. Paket apache2 tidak terpasang di lingkungan latihan, jadi instalasi kita bahas dalam prosa — sementara tiga bagian yang menentukan pekerjaan harian admin Apache: VirtualHost, mekanisme module dengan peralatan a2enmod, dan .htaccess, kita bangun dan bedah sungguhan.
httpd atau apache2: Dua Wajah yang Sama #
Programnya bernama httpd, tetapi setiap keluarga distro menamai dan menatanya berbeda. RHEL dan Fedora memaketkannya sebagai httpd; Debian dan Ubuntu sebagai apache2 — bukan hanya nama paket, seluruh peta direktorinya ikut berbeda:
| Aspek | RHEL/Fedora (httpd) | Debian/Ubuntu (apache2) |
|---|---|---|
| Unit systemd | httpd.service | apache2.service |
| Konfigurasi utama | /etc/httpd/conf/httpd.conf | /etc/apache2/apache2.conf |
| Virtual host | /etc/httpd/conf.d/*.conf | sites-available/ + sites-enabled/ |
| Log | /var/log/httpd/ | /var/log/apache2/ |
| Peralatan bantu | tanpa pembantu khusus | a2enmod, a2dismod, a2ensite, a2dissite |
Chapter ini memakai sisi Debian, karena peta sites-available/sites-enabled-nya memakai pola symlink gudang-etalase yang sudah kita kenal dari Chapter nginx
. Satu perbedaan penting: Debian hanya membaca berkas berakhiran .conf di sites-enabled, jadi nama berkas virtual host kita selalu diakhiri .conf.
VirtualHost untuk Banyak Situs #
Satu situs di Apache berarti satu blok VirtualHost. Perintah sudo apt install apache2 menyertakan situs bawaan 000-default.conf yang menjadi default server — penampung permintaan yang header Host-nya tidak cocok dengan situs mana pun. Kita tulis virtual host untuk latihan.example.com:
mkdir -p apache2/sites-available
cat > apache2/sites-available/latihan.example.com.conf <<'EOF'
<VirtualHost *:80>
ServerName latihan.example.com
ServerAlias www.latihan.example.com
DocumentRoot /var/www/latihan
DirectoryIndex index.html index.php
ErrorLog ${APACHE_LOG_DIR}/latihan-error.log
CustomLog ${APACHE_LOG_DIR}/latihan-access.log combined
</VirtualHost>
EOF
cat apache2/sites-available/latihan.example.com.confOutput yang Dihasilkan:
<VirtualHost *:80>
ServerName latihan.example.com
ServerAlias www.latihan.example.com
DocumentRoot /var/www/latihan
DirectoryIndex index.html index.php
ErrorLog ${APACHE_LOG_DIR}/latihan-error.log
CustomLog ${APACHE_LOG_DIR}/latihan-access.log combined
</VirtualHost>Mari kita bedah baris demi baris:
<VirtualHost *:80>: pembuka blok virtual host. Bagian*berarti semua alamat (konsep binding dari Chapter Server Basics ) dan:80menandakan port yang dijaga.ServerName latihan.example.com: nama utama situs — inilah yang dicocokkan dengan headerHostpada permintaan masuk.ServerAlias www.latihan.example.com: nama-nama tambahan yang dilayani blok yang sama, dijawab tanpa redirect.DocumentRoot /var/www/latihan: akar dokumen — padanan directiverootpada Nginx.DirectoryIndex index.html index.php: daftar berkas yang dicoba berurutan saat klien meminta sebuah direktori — padananindexdi Nginx, tetapi bisa memuat banyak kandidat.ErrorLogdanCustomLog: log khusus untuk situs ini. Variabel${APACHE_LOG_DIR}diisi dari/etc/apache2/envvars, yaitu/var/log/apache2di Debian; formatcombinedadalah format log klasik yang dibaca hampir semua alat analisis.
Mengaktifkan situsnya satu perintah: sudo a2ensite latihan.example.com membuat symlink dari sites-enabled ke berkas di sites-available — persis pola Nginx, hanya saja pekerjaan ln -s sudah dibungkus perintah. Penutup prosedurnya sama: uji dengan apachectl configtest, lalu terapkan dengan sudo systemctl reload apache2.
Module dan Peralatan a2enmod #
Fitur Apache ditambah lewat module: potongan kode yang di-load ke dalam proses server dengan directive LoadModule. Contohnya mod_rewrite untuk menulis ulang URL, mod_ssl untuk HTTPS, dan mod_proxy untuk meneruskan trafik. Debian menyediakan empat perintah kecil untuk mengelolanya: a2enmod mengaktifkan module, a2dismod menonaktifkan, dan pasangan a2ensite/a2dissite untuk situs — semuanya tidak lebih dari pembuat dan penghapus symlink:
mkdir -p apache2/mods-available apache2/mods-enabled
printf 'LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so\n' > apache2/mods-available/rewrite.load
ln -s ../mods-available/rewrite.load apache2/mods-enabled/rewrite.load
tree apache2Output yang Dihasilkan:
apache2
├── mods-available
│ └── rewrite.load
└── mods-enabled
└── rewrite.load -> ../mods-available/rewrite.load
3 directories, 2 filesDua pola berkas dibaca apache2.conf dari mods-enabled: *.load berisi directive LoadModule, dan *.conf berisi konfigurasi tambahannya. Itulah yang barusan kita tiru: symlink rewrite.load menempelkan mod_rewrite ke konfigurasi aktif. Berikut contoh tampilan a2enmod mengerjakan hal yang sama di mesin sungguhan:
Enabling module rewrite.
To activate the new configuration, you need to run:
service apache2 restartSama seperti a2ensite, perintah ini hanya membuat symlink — perubahan baru berlaku setelah konfigurasi dimuat ulang, dan pesan penutupnya mengingatkan persis soal itu.
.htaccess: Konfigurasi per Direktori #
Ciri khas Apache yang tidak dimiliki Nginx: file bernama .htaccess di dalam direktori dokumen, yang isinya dibaca sebagai konfigurasi untuk direktori itu dan seluruh isinya. Pengelola situs tanpa akses ke konfigurasi utama — penghuni shared hosting — mengatur hampir semuanya dari sini. Kita buat satu di akar situs latihan:
mkdir -p www/latihan
cat > www/latihan/.htaccess <<'EOF'
DirectoryIndex beranda.html
RewriteEngine On
RewriteRule ^blog/(.*)$ /artikel/$1 [R=301,L]
EOF
cat www/latihan/.htaccessOutput yang Dihasilkan:
DirectoryIndex beranda.html
RewriteEngine On
RewriteRule ^blog/(.*)$ /artikel/$1 [R=301,L]Mari kita bedah baris demi baris:
DirectoryIndex beranda.html: mengubah halaman indeks hanya untuk direktori ini — menang atas konfigurasi virtual host.RewriteEngine On: menyalakan mesin penulisan ulang URL untuk direktori ini; syaratnyamod_rewritesudah aktif di level server.RewriteRule ^blog/(.*)$ /artikel/$1 [R=301,L]: alamat lama/blog/apa-pundialihkan permanen (kode301, sama seperti yang kita saksikan di Chapter Web Server ) ke/artikel/apa-pun; flagLberhenti memproses aturan berikutnya.
Berkas ini hanya berpengaruh bila diperbolehkan. Directive AllowOverride di konfigurasi utama menentukan mana yang dibaca: AllowOverride None — bawaan Debian — berarti .htaccess diabaikan sama sekali, dan mengubahnya ke AllowOverride All di dalam blok <Directory /var/www/latihan> menyalakannya.
MPM dan PHP: prefork, event, dan php-fpm #
Model satu proses atau thread per koneksi dari tabel perbandingan di Chapter Web Server diatur lewat sesuatu yang disebut MPM (Multi-Processing Module) — dan bisa dipilih:
| MPM | Model | Catatan |
|---|---|---|
prefork | satu proses Apache per koneksi | paling boros; disyaratkan mod_php lama |
worker | beberapa thread per proses | jalan tengah era PHP lama |
event | worker plus thread khusus untuk koneksi menganggur | bawaan Debian modern |
Pilihan MPM menentukan bagaimana PHP dijalankan. Cara lama, mod_php, memuat interpreter PHP ke dalam setiap proses Apache — sehingga MPM harus prefork dan setiap proses membawa interpreter penuh meski hanya melayani berkas statis. Cara modern, PHP-FPM, menjalankan PHP sebagai daemon terpisah dengan pool prosesnya sendiri; Apache berbicara kepadanya lewat socket — pola yang serasi dengan MPM event dan memungkinkan web server dan PHP di-reload terpisah. Menutup prosedur apa pun, apachectl configtest menguji seluruh konfigurasi — berikut contoh tampilannya di instalasi segar:
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OKBaris AH00558 hanyalah keluhan kosmetik karena ServerName global belum diatur — boleh dibiarkan begitu saja; kalimat Syntax OK di baris terakhir itulah yang dicari.
Dengan Nginx dan Apache sudah kita kuasai berdua, web server selesai untuk sementara. Situs yang kita bangun biasanya butuh satu penghuni lagi di baliknya: tempat menyimpan datanya. Kita pasang dan akses dua warganya yang paling populer — PostgreSQL dan MySQL — di Chapter Database Server .
Referensi lanjut: dokumentasi name-based virtual host Apache
untuk mekanisme pencocokan Host, serta panduan .htaccess
untuk seluruh directive yang sah di dalamnya.