Masalah Reverse Proxy Nginx + Laravel Octane di Docker: Port Hilang / URL Salah

đź§© Masalah

Saat menjalankan Laravel Octane (misalnya pakai Swoole) di balik Nginx reverse proxy di dalam Docker, kadang URL yang di-render di browser tidak sesuai port mapping Docker Compose. Contoh:

Akses localhost:8013 tapi resource (seperti gambar) muncul sebagai http://localhost/images/logo.svg (port-nya hilang).

âť— Padahal aplikasi bisa diakses, cuma navigasi atau asset jadi error/miss karena base URL salah.

🔍 Penyebab

Konfigurasi proxy_set_header Host $host; di Nginx tidak mengikutkan port. Laravel/Octane kemudian hanya mendeteksi hostname (tanpa port), sehingga saat url()->to() atau asset() digunakan, port hilang dari hasil render.

Lebih lanjut lagi:

Kalau di dalam file Nginx:

listen 80;

Maka Laravel akan anggap port request adalah 80 bukan port yang di-mapping oleh Docker (misal 8013:80), tapi langsung 80 (hilang karena default http).

âś… Solusi

âś… 1. Pastikan proxy_set_header Host mencantumkan port:

proxy_set_header Host $host:$server_port;

âś… 2. Samakan semua port:

  • Port yang digunakan di docker-compose.yml (port mapping)
  • Port di konfigurasi nginx.conf (listen)
  • Port saat akses via browser

Contoh:

services:
  nginx:
    ports:
      - "8013:8013"
server {
    listen 8013;
    ...
    proxy_pass <http://app:8000>;
    proxy_set_header Host $host:$server_port;
}

Kalau salah satu beda, Laravel akan tetap gunakan port dari Nginx listen sebagai referensi, bukan dari mapping Docker.

⚡ Kesimpulan

Saat pakai Laravel Octane + Docker + Nginx:

  • Gunakan proxy_set_header Host $host:$server_port;
  • Samakan semua port antara listen, Docker ports, dan URL akses
  • Jangan hanya andalkan APP_URL, karena Laravel akan override berdasarkan Host dari header request
Tri Wicaksono
Tri Wicaksono

With 15+ years in tech, I’ve worked in various engineering leadership roles including VP of Engineering, helping companies solve complex technical challenges and mentoring thousands of students.