← Semua pembelajaran / Laravel Nol → Enterprise
Fase 8 · FrankenPHP & RoadRunner

RoadRunner untuk Laravel

Laravel punya integrasi resmi ke RoadRunner lewat Octane. Ada juga paket komunitas yang menjangkau lebih dalam — dan pilihan di antara keduanya menentukan seberapa banyak RoadRunner yang benar-benar kamu pakai.

Intisari

  • Jalur resmi: Laravel Octane dengan --server=roadrunner.
  • Jalur kedua: Laravel Bridge dari komunitas, yang membuka plugin Jobs, gRPC, dan Temporal.
  • Butuh dua paket Composer tambahan: spiral/roadrunner-cli dan spiral/roadrunner-http.
  • vendor/bin/rr get-binary mengunduh biner yang cocok untuk platformmu.
  • TLS dan berkas statis diserahkan ke lapisan di depannya — di AWS, itu ALB dan CloudFront.

Jalur 1 — lewat Octane

composer require laravel/octane spiral/roadrunner-cli spiral/roadrunner-http

php artisan octane:install --server=roadrunner
./vendor/bin/rr get-binary

php artisan octane:start --server=roadrunner --host=0.0.0.0 --port=8000 --rpc-port=6001
# .rr.yaml yang dihasilkan Octane, disesuaikan untuk produksi
version: "3"

server:
  command: "php ./vendor/bin/roadrunner-worker"
  relay: pipes

http:
  address: 0.0.0.0:8000
  max_request_size: 32
  middleware: ["static", "gzip"]

  static:
    dir: "public"
    forbid: [".php", ".htaccess", ".env"]

  pool:
    num_workers: 8
    max_jobs: 500                 # restart worker setelah 500 permintaan
    supervisor:
      max_worker_memory: 256      # MB — restart kalau melewati ini
      exec_ttl: 60s               # batas keras durasi satu permintaan

logs:
  mode: production
  level: info
  encoding: json                  # penting untuk CloudWatch

metrics:
  address: 127.0.0.1:2112

status:
  address: 127.0.0.1:2114         # untuk health check

relay: pipes lebih cepat daripada soket. Dokumentasi produksi RoadRunner menyebutkan bahwa pipa sedikit lebih cepat daripada soket Unix. Selain itu, jangan biarkan layanan RPC mendengarkan di 0.0.0.0 kecuali kamu memang perlu menjangkaunya dari kontainer lain — RPC adalah pintu kendali ke server.

Jalur 2 — Laravel Bridge

Dokumentasi resmi RoadRunner menunjuk ke paket komunitas Laravel Bridge sebagai alternatif yang menjangkau lebih dalam: ia menjaga kompatibilitas dengan pengelolaan state ala Octane, sekaligus membuka akses ke plugin penuh RoadRunner — Jobs, gRPC, dan Temporal.

OctaneLaravel Bridge
DukunganResmi LaravelKomunitas
HTTP workerYaYa
Plugin Jobs (antrean RoadRunner)TidakYa
gRPC, TemporalTidakYa
Bisa ganti server nantiYa — satu opsiTerikat RoadRunner
Pilih kalauKamu ingin worker mode sajaKamu memang mau ekosistem RoadRunner

Rekomendasi yang jujur untuk sebagian besar tim: mulai dari Octane. Ia resmi, terdokumentasi bersama Laravel, dan membiarkanmu berpindah server dengan mengganti satu opsi. Laravel Bridge masuk akal kalau kamu memang berencana memakai antrean RoadRunner, gRPC, atau Temporal — bukan sekadar ingin worker mode.

Di belakang Nginx

upstream roadrunner { server 127.0.0.1:8000; }

server {
    listen 443 ssl http2;
    server_name portal.test;

    root /app/public;

    location /build/ { expires 1y; add_header Cache-Control "public, immutable"; }

    location / {
        try_files $uri @rr;
    }

    location @rr {
        proxy_pass http://roadrunner;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Di AWS, lapisan ini sering tidak perlu. ALB sudah menangani TLS, dan CloudFront sudah menangani aset statis. Menambahkan Nginx di dalam kontainer berarti dua proses yang harus diawasi dalam satu task — pola yang sebaiknya dihindari. Biarkan RoadRunner mendengarkan langsung, dan serahkan sisanya ke lapisan AWS.

Yang harus disesuaikan di kode Laravel

HalTindakan
State di singletonSama persis seperti materi jebakan state — ubah jadi scoped
IP dan skema HTTPSTrusted proxy wajib dikonfigurasi
Ukuran unggahanhttp.max_request_size di .rr.yaml dan upload_max_filesize di PHP
LogLOG_CHANNEL=stderr dan encoding: json
OPcacheopcache.enable_cli=1 — worker berjalan lewat CLI
Deploy./rr reset atau ganti kontainer

opcache.enable_cli=1 mudah terlewat dan mahal akibatnya. Karena worker RoadRunner adalah proses PHP CLI, OPcache versi web tidak berlaku bagi mereka. Tanpa setelan ini, seluruh keuntungan worker mode berkurang drastis — dan gejalanya cuma "kok tidak secepat yang dijanjikan".

Health check

status:
  address: 127.0.0.1:2114
curl http://127.0.0.1:2114/health?plugin=http
curl http://127.0.0.1:2114/ready?plugin=http

/health menjawab apakah plugin-nya hidup; /ready menjawab apakah ada worker yang siap menerima permintaan. Untuk ALB, yang kamu inginkan adalah endpoint yang membedakan keduanya — kontainer yang hidup tapi belum punya worker siap seharusnya belum menerima lalu lintas.

Latihan: jalankan Laravel dengan octane:start --server=roadrunner, buka ./rr workers -i, dan kirim seratus permintaan. Amati distribusi permintaan antar worker dan pemakaian memorinya. Lalu setel max_jobs: 20 dan lihat worker di-restart secara berkala.

Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.