Belajar RoadRunner - TLS/HTTPS & Reverse Proxy Setup
Episode 15 of 26

Belajar RoadRunner - TLS/HTTPS & Reverse Proxy Setup

Menyiapkan HTTPS di RoadRunner: mengaktifkan http.ssl dengan sertifikat langsung, atau menempatkan Nginx dan Caddy sebagai reverse proxy di depan RoadRunner, plus praktik deployment TLS production yang aman dan benar.

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

Setelah di episode 14 kita memastikan worker-safe, pada episode kali ini kita mengamankan jalur masuk: TLS/HTTPS dan reverse proxy. Di production, kalian punya dua pilihan — RoadRunner menangani TLS langsung, atau ditaruh di belakang Nginx/Caddy yang menangani TLS.

Mengapa episode ini penting? Karena TLS bukan sekadar "aktifkan sertifikat". Ada keputusan arsitektur: siapa yang menghentikan TLS, bagaimana header diteruskan ke PHP, dan bagaimana reverse proxy berinteraksi dengan pool. Salah konfigurasi sering menghasilkan mixed content, loop redirect, atau header salah yang membuat aplikasi (dan user) menderita.

Opsi Arsitektur

100%
OpsiKelebihanKekurangan
RR langsung TLSSederhana, satu prosesSertifikat diurus sendiri
Reverse proxyTLS, rate limit, WAF, static di proxySatu komponen tambahan

Kedua opsi valid; pemilihan bergantung tim: kalau kalian sudah punya Nginx/Caddy, taruh di depan. Kalau mau minimalis, aktifkan TLS di RoadRunner.

Opsi 1: TLS Langsung di RoadRunner

Aktifkan http.ssl dengan path sertifikat dan key:

TLS langsung di RoadRunner
http:
  address: 0.0.0.0:8080
  ssl:
    cert: /etc/ssl/domain.crt
    key: /etc/ssl/domain.key
  middleware: ["gzip"]

Perhatikan: ssl.cert dan ssl.key menunjuk file di server — RoadRunner membaca keduanya saat start. Untuk sertifikat dari Let's Encrypt, pastikan path menunjuk ke file yang diperbarui certbot (atau atur reload). Contoh dengan chain penuh (leaf + intermediate):

Kombinasi sertifikat dan chain
cat /etc/letsencrypt/live/domain/fullchain.pem > /etc/ssl/domain.crt
cp /etc/letsencrypt/live/domain/privkey.pem /etc/ssl/domain.key

Warning

Jangan pernah memakai self-signed certificate di production tanpa alasan kuat — browser akan memblokir, dan traffic yang "aman" dengan cert yang ditolak browser tetap bisa di-man-in-the-middle. Untuk produksi, gunakan Let's Encrypt (free) atau CA komersial.

Opsi 2: Reverse Proxy Nginx

Nginx menangani TLS dan meneruskan HTTP ke RoadRunner. Blok server kunci:

nginx.conf - reverse proxy
server {
    listen 443 ssl;
    server_name domain.com;
 
    ssl_certificate     /etc/letsencrypt/live/domain/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/domain/privkey.pem;
 
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
 
    # Static: biarkan Nginx yang melayani
    location /assets/ {
        alias /var/www/app/public/assets/;
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
}

Poin penting:

  • proxy_pass menunjuk ke http.address RoadRunner.
  • Header Host, X-Real-IP, X-Forwarded-For, dan X-Forwarded-Proto wajib diteruskan agar aplikasi tahu identitas client yang sebenarnya (bukan IP Nginx).
  • proxy_set_header Connection ""; penting untuk mempertahankan koneksi HTTP/1.1 antara Nginx dan RoadRunner (mengurangi overhead handshake).
  • Static assets bisa dilayani Nginx langsung — dua lapis optimasi (Nginx + sendfile di level OS).

Header Forwarded dan Aplikasi PHP

Saat memakai reverse proxy, aplikasi PHP menerima request yang sudah "diteruskan". Framework membaca header forwarded untuk membangun URL yang benar:

Baca scheme dari header forwarded
$scheme = $request->getHeaderLine('X-Forwarded-Proto') ?: 'http';
$fullUrl = $scheme . '://' . $request->getHeaderLine('Host') . $request->getUri()->getPath();

Di Laravel, set trusted proxies (seperti di config) supaya url() dan redirect menghormati X-Forwarded-Proto — jika tidak, aplikasi akan memaksa redirect HTTPS selamanya (loop redirect) karena mengira request masih HTTP.

Danger

Hanya percaya header X-Forwarded-* bila request memang datang dari proxy yang kalian kendalikan. Jika RoadRunner bisa diakses langsung dari publik tanpa proxy, attacker bisa memalsukan X-Forwarded-For untuk mem-bypass rate limit atau IP-based logic. Di RoadRunner, plugin reverse-proxy (trusted proxy) membatasi ini — kita bahas di episode 17.

HTTP/2 dan HTTP/3

RoadRunner mendukung HTTP/2 dan (bila TLS aktif dan didukung binary) HTTP/3. Keuntungan utama: multiplexing request pada satu koneksi dan header compression — sangat membantu aplikasi dengan banyak aset. Pastikan klien dan proxy di depan tidak memblokir protokol ini; di Caddy/Nginx sisi proxy, aktifkan HTTP/2 dengan satu baris listen ... http2.

Verifikasi protokol yang dipakai:

Cek protokol HTTP
curl -sI --http2 https://domain.com/ | head -5

Checklist Deployment TLS

ItemStatus yang benar
Sertifikat valid dan belum kedaluwarsaopenssl s_client -connect domain:443 -servername domain
Redirect HTTP → HTTPSServer block return 301 https://$host$request_uri;
Header forwarded diteruskanProxy mengirim X-Forwarded-Proto
Aplikasi memakai X-Forwarded-ProtoLaravel trusted proxies aktif
Tidak ada mixed contentSemua aset dilayani HTTPS
Port RPC tidak ter-exposeRPC hanya 127.0.0.1

Penutup

Pada episode 15 ini, kalian telah menyiapkan HTTPS dengan dua arsitektur.

Inti yang harus dibawa pulang:

  • Opsi 1: http.ssl dengan cert/key untuk TLS langsung.
  • Opsi 2: Nginx/Caddy sebagai reverse proxy — lebih umum di production.
  • Header X-Forwarded-* wajib diteruskan dan hanya dipercaya dari proxy kalian.
  • Laravel perlu trusted proxies agar redirect tidak loop.
  • Verify dengan curl -I dan openssl s_client.

Di episode 16 selanjutnya, kita belajar gRPC plugin — mendefinisikan service lewat file .proto, menjalankan gRPC server PHP dengan package roadrunner-grpc, dan menguji dengan client gRPC. Sampai jumpa di episode 16!

Belajar RoadRunner - TLS/HTTPS & Reverse Proxy Setup | Belajar RoadRunner