Caddy vs Apache #

Apache HTTP Server adalah salah satu perangkat lunak open source paling berpengaruh dalam sejarah internet modern. Didirikan pada tahun 1995, Apache mendominasi pangsa pasar server web selama lebih dari satu dekade dan meletakkan fondasi bagi hampir seluruh praktik web hosting modern. Dukungan konfigurasi dinamis berbasis file .htaccess di Apache telah menjadi standar industri untuk shared hosting. Di sisi lain, Caddy membawa pendekatan yang modern, berorientasi cloud-native, serta dirancang untuk meminimalkan kerumitan pengelolaan SSL dan konfigurasi. Memahami perbedaan fundamental antara kedua server web ini sangat penting agar kita dapat membuat keputusan arsitektur yang tepat untuk jangka panjang.


Perbedaan Filosofi #

Perbedaan terbesar antara Apache dan Caddy terletak pada fokus prioritas operasional yang ingin mereka selesaikan.

Apache didesain pada era di mana fleksibilitas sistem adalah segala-galanya. Arsitektur Apache dibuat agar sangat modular: modul-modul fungsionalitas dapat dimuat (load) dan dibongkar (unload) secara dinamis sesuai kebutuhan. Pengguna juga diberikan kontrol penuh untuk menimpa (override) konfigurasi server global di tingkat direktori lokal menggunakan file .htaccess. Apache dapat bertindak sebagai alat serba bisa (Swiss Army Knife) untuk segala skenario web server, namun hal ini menuntut pemahaman mendalam tentang direktif konfigurasi agar tidak menimbulkan masalah performa atau celah keamanan.

Sebaliknya, Caddy berfokus pada efisiensi operasional developer dengan menyediakan pengaturan default terbaik (sane defaults). Caddy mengambil alih tugas-tugas berulang yang membosankan seperti pengurusan enkripsi HTTPS, optimasi TLS cipher, kompresi respons (Brotli/Gzip), dan logging terstruktur. Dengan memindahkan kompleksitas tersebut ke level internal server, Caddy memungkinkan developer membuat konfigurasi web server yang sangat ringkas dan bebas dari kesalahan manusia.


Arsitektur Concurrency: Goroutine vs MPM #

Perbedaan teknis yang paling mendasar antara Caddy dan Apache terletak pada cara masing-masing menangani koneksi konkuren (simultaneous connections) di tingkat sistem operasi.

1. Apache: Multi-Processing Modules (MPM) #

Apache menangani request menggunakan salah satu dari tiga model concurrency yang disebut Multi-Processing Modules (MPM).

MPM Prefork: Model tertua dan paling stabil. Master process Apache akan membuat (fork) sejumlah worker process di awal. Setiap request koneksi dari pengguna akan ditangani secara eksklusif oleh satu worker process tunggal.

flowchart TD
    Master["Master Process Apache"] --> W1["Worker Process 1 (Request A)"]
    Master --> W2["Worker Process 2 (Request B)"]
    Master --> W3["Worker Process 3 (Request C)"]
    Master --> W4["Worker Process 4 (Idle / Menunggu)"]

    style Master stroke:#0288d1,stroke-width:2px
    style W1 stroke:#ffb300,stroke-width:1px
    style W2 stroke:#ffb300,stroke-width:1px
    style W3 stroke:#ffb300,stroke-width:1px
  • Kelebihan: Sangat stabil karena jika terjadi crash (seperti segfault) pada salah satu kode php atau modul, proses tersebut akan mati tanpa mengganggu worker process lainnya. Sangat kompatibel dengan modul PHP tradisional non-thread-safe (mod_php).
  • Kekurangan: Sangat boros memori RAM (setiap proses memakan sekitar 30MB-50MB RAM). Sistem operasi harus melakukan context switching proses secara berat yang membatasi kapasitas konkurensi server.

MPM Worker: Menggunakan kombinasi proses dan thread. Setiap worker process akan memicu (spawn) beberapa thread internal. Setiap request koneksi akan dilayani oleh satu thread individual.

flowchart TD
    Master["Master Process Apache"] --> WP1["Worker Process 1"]
    Master --> WP2["Worker Process 2"]
    
    WP1 --> T1["Thread 1 (Request A)"]
    WP1 --> T2["Thread 2 (Request B)"]
    WP1 --> T3["Thread 3 (Request C)"]
    
    WP2 --> T4["Thread 4 (Request D)"]
    WP2 --> T5["Thread 5 (Idle / Menunggu)"]

    style Master stroke:#0288d1,stroke-width:2px
  • Kelebihan: Jauh lebih hemat memori dibanding Prefork karena thread berbagi ruang memori yang sama dalam satu proses.
  • Kekurangan: Tidak kompatibel dengan pustaka lama non-thread-safe. Jika satu thread mengalami crash fatal, seluruh worker process beserta thread lain di dalamnya akan ikut mati.

MPM Event: Model paling modern di Apache. Menggunakan event loop berbasis pustaka apr (Apache Portable Runtime) untuk memantau koneksi yang sedang dalam status Keep-Alive secara asinkron, dan hanya menugaskan thread dari thread pool ketika request aktif sedang dikirim atau diproses.

flowchart TD
    Master["Master Process Apache"] --> EM["Event Manager (Keep-Alive Listener)"]
    EM -->|"Request Masuk"| TP["Thread Pool"]
    TP --> T1["Thread 1 (Memproses Request A)"]
    TP --> T2["Thread 2 (Memproses Request B)"]
    
    style Master stroke:#0288d1,stroke-width:2px
    style TP stroke:#43a047,stroke-width:2px
  • Kelebihan: Sangat efisien dalam mengelola ribuan koneksi Keep-Alive jangka panjang tanpa membuang alokasi thread.
  • Kekurangan: Membutuhkan konfigurasi parameter buffer yang cukup rumit agar optimal di beban kerja tinggi.

2. Caddy: Go Goroutines #

Caddy membuang model thread sistem operasi tradisional dan menggunakan model concurrency berbasis Goroutines yang disediakan oleh bahasa Go secara native.

flowchart TD
    GoRuntime["Go Runtime Scheduler"] --> GoroutinePool["Goroutine Pool (Skala Dinamis)"]
    GoroutinePool --> G1["Goroutine 1 (Request A)"]
    GoroutinePool --> G2["Goroutine 2 (Request B)"]
    GoroutinePool --> G3["Goroutine 3 (Request C)"]
    GoroutinePool --> GN["Goroutine N (Request N)"]

    style GoRuntime stroke:#43a047,stroke-width:2px

Di balik layar, Caddy menggunakan Go Netpoller yang merupakan abstraksi asinkron berperforma tinggi di atas interface kernel OS (seperti epoll di Linux atau kqueue di macOS). Ketika koneksi TCP baru masuk, Caddy meluncurkan sebuah Goroutine baru.

Satu Goroutine Go hanya membutuhkan memori awal sebesar 2KB (sangat jauh dibanding thread OS Apache yang membutuhkan alokasi memori minimal 2MB per thread). Runtime Go secara otomatis mendistribusikan Goroutines ini di atas thread OS riil menggunakan teknik work-stealing. Hasilnya, Caddy dapat melayani ratusan ribu koneksi konkuren secara asinkron tanpa takut kehabisan memori RAM.


.htaccess dan Konfigurasi Lokal: Implikasi Performa & Keamanan #

File .htaccess adalah fitur unik yang menjadi alasan utama popularitas Apache pada masa lalu. Caddy tidak mendukung fitur ini demi alasan performa dan keamanan.

1. Dampak Performa .htaccess pada Apache #

File .htaccess memungkinkan konfigurasi diletakkan langsung di dalam direktori web tertentu. Ketika Apache menerima request untuk mengakses sebuah file di direktori /var/www/html/blog/public/, server harus memindai secara rekursif keberadaan file .htaccess di sepanjang jalur direktori tersebut:

/var/www/
  ├── .htaccess              (System Call: stat() - Cek modifikasi)
  └── html/
        ├── .htaccess        (System Call: stat() - Cek modifikasi)
        └── blog/
              └── public/
                    ├── .htaccess (System Call: stat() - Cek modifikasi)
                    └── index.php

Mekanisme ini memaksa Apache melakukan beberapa operasi pembacaan file sistem (system call stat()) pada disk untuk setiap request HTTP yang masuk. Jika kita menggunakan network-attached storage (seperti NFS atau GlusterFS) di lingkungan cloud, overhead latensi I/O disk ini akan menurun drastis.

2. Risiko Keamanan .htaccess #

Meskipun mempermudah shared hosting, .htaccess membuka celah keamanan kritis. Karena konfigurasi web server dapat ditulis oleh pengguna non-admin (misalnya melalui file manager cPanel), pengguna dapat menimpa aturan keamanan global. Sebagai contoh, pengguna dapat menulis opsi Options +FollowSymLinks yang dapat dieksploitasi untuk melakukan serangan direktori traversal (mengakses berkas sistem di luar folder root situs web).

3. Pendekatan Caddy: Konfigurasi Terpusat yang Aman #

Caddy sengaja tidak mendukung pemindaian konfigurasi lokal berbasis direktori seperti .htaccess. Aturan routing harus dideklarasikan secara terpusat di dalam Caddyfile utama:

# ANTI-PATTERN: Tidak ada mekanisme pemindaian file konfigurasi lokal di Caddy.

# BENAR: Deklarasikan semua aturan routing aplikasi secara eksplisit di Caddyfile utama.
example.com {
    root * /var/www/laravel/public
    
    # URL rewriting untuk Laravel — dideklarasikan terpusat di Caddyfile
    @notFile {
        not file
        not path /wp-admin/* /wp-includes/*
    }
    rewrite @notFile /index.php
    
    php_fastcgi unix//run/php/php8.2-fpm.sock
    file_server
}

[!WARNING] Jika kita sedang mengoperasikan platform shared hosting di mana customer membutuhkan akses mandiri untuk mengubah konfigurasi routing direktori mereka sendiri, atau jika kita memiliki aplikasi legacy WordPress/Laravel yang sangat bergantung pada aturan .htaccess bawaan, migrasi ke Caddy akan membutuhkan pemetaan ulang konfigurasi yang cukup rumit. Pada skenario ini, Apache tetap merupakan pilihan yang lebih aman.


Integrasi PHP: mod_php vs PHP-FPM #

Secara historis, Apache dikenal karena kemampuannya mengintegrasikan interpreter PHP secara langsung ke dalam proses servernya menggunakan modul mod_php.

1. Apache dengan mod_php #

Pada model ini, PHP berjalan di dalam ruang memori yang sama dengan proses worker Apache. Ketika Apache menerima request file .php, ia langsung mengeksekusinya tanpa perlu meneruskan request tersebut ke service eksternal.

  • Kelebihan: Proses setup awal sangat sederhana (cukup instal modul dan server langsung siap).
  • Kekurangan: Sangat tidak aman karena jika terjadi celah keamanan pada kode PHP, penyerang bisa mendapatkan akses penuh ke proses Apache. Selain itu, model ini memaksa Apache menggunakan MPM Prefork yang boros RAM.

2. Caddy dengan PHP-FPM #

Caddy mengadopsi pendekatan modern yang memisahkan web server dengan interpreter aplikasi menggunakan protokol FastCGI via PHP-FPM (FastCGI Process Manager).

flowchart LR
    Klien["Klien (Browser)"] --> Caddy["Caddy Web Server"]
    Caddy -->|"FastCGI Protocol<br/>(Unix Socket / TCP Port)"| FPM["PHP-FPM Process Manager"]
    FPM --> W1["PHP Worker 1"]
    FPM --> W2["PHP Worker 2"]

    style Caddy stroke:#0288d1,stroke-width:2px
    style FPM stroke:#43a047,stroke-width:2px

Caddy bertindak murni sebagai reverse proxy berkecepatan tinggi yang menerima trafik HTTP, sementara eksekusi kode PHP diserahkan sepenuhnya ke proses PHP-FPM yang terisolasi. Hal ini memberikan beberapa keuntungan:

  • Isolasi Keamanan: Proses PHP-FPM dapat dikonfigurasi untuk berjalan di bawah user system yang berbeda dengan Caddy, membatasi hak akses file jika terjadi eksploitasi kode.
  • Manajemen Sumber Daya: PHP-FPM memiliki mekanisme canggih untuk membatasi jumlah proses PHP (process spawning & throttling) agar tidak membebani memori server.

3. Keunggulan Shorthand php_fastcgi di Caddyfile #

Pada web server lain seperti Nginx atau Apache (menggunakan modul mod_proxy_fcgi), kita harus menulis aturan penanganan rewrite file FastCGI secara panjang lebar untuk memastikan request non-file diarahkan ke index.php.

Di Caddy, seluruh logika rumit tersebut diringkas dalam satu directive shorthand php_fastcgi:

example.com {
    root * /var/www/html
    
    # Cukup arahkan ke socket Unix PHP-FPM
    php_fastcgi unix//run/php/php8.2-fpm.sock
    
    file_server
}

Shorthand php_fastcgi ini secara otomatis menerjemahkan parameter lingkungan FastCGI standar (seperti SCRIPT_FILENAME, REQUEST_METHOD, QUERY_STRING) ke socket PHP-FPM secara presisi di balik layar.


Perbandingan Sintaks Laravel: Apache vs Caddy #

Mari kita bandingkan perbedaan penulisan konfigurasi untuk menjalankan aplikasi Laravel dengan HTTPS aktif.

Menggunakan Apache (VirtualHost + .htaccess WordPress/Laravel):

Di Apache, konfigurasi terbagi antara konfigurasi port 443 di server dan file .htaccess di dalam folder public Laravel:

# Konfigurasi Apache VirtualHost (VirtualHost.conf)
<VirtualHost *:443>
    ServerName laravel.example.com
    DocumentRoot /var/www/laravel/public

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/laravel.example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/laravel.example.com/privkey.pem

    <Directory /var/www/laravel/public>
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

Dan aturan URL rewriting Laravel harus diletakkan pada file /var/www/laravel/public/.htaccess:

<IfModule mod_rewrite.c>
    Options -MultiViews -Indexes
    RewriteEngine On

    # Redirect Trailing Slashes
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Arahkan semua request ke index.php jika file fisik tidak ditemukan
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

Menggunakan Caddyfile Terpusat:

Di Caddy, seluruh aturan tersebut diringkas menjadi beberapa baris di satu file tunggal:

laravel.example.com {
    # Tentukan path folder public Laravel
    root * /var/www/laravel/public
    
    # Hubungkan ke PHP-FPM socket
    php_fastcgi unix//run/php/php8.2-fpm.sock
    
    # Aktifkan kompresi gzip dan file server statis
    encode gzip
    file_server
}

Analisis Performa Pengujian Beban Kerja #

Berikut adalah rangkuman performa relatif antara Apache (menggunakan MPM Event) dan Caddy pada berbagai jenis beban kerja umum:

Skenario Pengujian BebanPerforma Apache (MPM Event)Performa CaddyCatatan Analisis
Static File Serving (Throughput)Sangat BaikSangat BaikKeduanya memiliki performa sebanding untuk menyajikan aset statis.
PHP Application ResponseSebandingSebandingPerforma dibatasi oleh kecepatan eksekusi kode PHP di PHP-FPM.
Beban Koneksi Konkuren Tinggi (10k+)Cukup BaikSangat BaikModel Goroutine Go pada Caddy mengonsumsi RAM jauh lebih sedikit dibanding model thread Apache.
Kemudahan Konfigurasi SSLRumitSangat MudahCaddy menghemat waktu setup sertifikat karena terintegrasi penuh.

Kapan Memilih Caddy atau Apache? #

Untuk membantu menentukan server web mana yang paling cocok untuk proyek kita, gunakan panduan perbandingan skenario berikut:

Tetap gunakan Caddy jika:
  ✓ Kita membangun infrastruktur cloud modern yang tidak memiliki dependensi legacy.
  ✓ Kita menginginkan setup HTTPS otomatis tanpa pusing memikirkan Certbot dan cron job.
  ✓ Kita membutuhkan API untuk mengubah konfigurasi server secara dinamis tanpa restart.
  ✓ Kita mengutamakan kemudahan pembacaan file konfigurasi server.

Pertimbangkan Apache jika:
  ✗ Proyek kita berjalan di lingkungan shared hosting tradisional.
  ✗ Aplikasi web kita sangat bergantung pada file aturan rewrite di file `.htaccess`.
  ✗ Tim operasional kita sudah memiliki keahlian dan skrip otomatisasi Apache yang sangat matang.
  ✗ Kita membutuhkan integrasi interpreter PHP langsung via `mod_php` untuk alasan kompabilitas legacy.

Ringkasan #

  • Perbedaan Arsitektur Concurrency — Apache menggunakan model Multi-Processing Modules (MPM), sementara Caddy menggunakan model Goroutines Go yang jauh lebih ringan dan hemat memori pada koneksi konkuren tinggi.
  • Ketiadaan .htaccess di Caddy — Caddy tidak mendukung pembacaan konfigurasi lokal per direktori demi alasan performa dan keamanan. Semua aturan harus dikonfigurasi secara terpusat di Caddyfile.
  • Integrasi PHP Modern — Berbeda dengan model mod_php Apache yang tightly coupled, Caddy menggunakan protokol FastCGI via PHP-FPM yang lebih terisolasi dan aman secara arsitektural.
  • Efisiensi Sintaks — Shorthand directive seperti php_fastcgi di Caddyfile menggantikan puluhan baris konfigurasi rewrite dan proxy headers pada Apache.
  • Kecocokan Penggunaan — Caddy sangat ideal untuk aplikasi modern cloud-native, sedangkan Apache tetap menjadi pilihan terbaik untuk shared hosting dan aplikasi legacy.

← Sebelumnya: Caddy vs Nginx   Berikutnya: Arsitektur Caddy →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact