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-clidanspiral/roadrunner-http. vendor/bin/rr get-binarymengunduh 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.
| Octane | Laravel Bridge | |
|---|---|---|
| Dukungan | Resmi Laravel | Komunitas |
| HTTP worker | Ya | Ya |
| Plugin Jobs (antrean RoadRunner) | Tidak | Ya |
| gRPC, Temporal | Tidak | Ya |
| Bisa ganti server nanti | Ya — satu opsi | Terikat RoadRunner |
| Pilih kalau | Kamu ingin worker mode saja | Kamu 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
| Hal | Tindakan |
|---|---|
| State di singleton | Sama persis seperti materi jebakan state — ubah jadi scoped |
| IP dan skema HTTPS | Trusted proxy wajib dikonfigurasi |
| Ukuran unggahan | http.max_request_size di .rr.yaml dan upload_max_filesize di PHP |
| Log | LOG_CHANNEL=stderr dan encoding: json |
| OPcache | opcache.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.