Reverse Proxy menggunakan NGINX
Mengelola beberapa aplikasi Laravel dalam satu server menggunakan Nginx dan FrankenPHP memerlukan pemahaman tentang Reverse Proxy. FrankenPHP biasanya berjalan sebagai binary mandiri yang mendengarkan pada port tertentu, sementara Nginx bertugas sebagai gerbang utama yang meneruskan trafik ke port tersebut berdasarkan domain yang diakses.
Berikut adalah panduan lengkap konfigurasi untuk 5 aplikasi Anda.
Instalasi FrankenPHP
Menginstal FrankenPHP di Ubuntu adalah pilihan cerdas untuk performa tinggi karena ia menggabungkan server web (Caddy) dan PHP dalam satu binary yang efisien.
Berikut adalah panduan langkah demi langkah yang dirancang agar mudah diikuti.
Persiapan Sistem : Pastikan Ubuntu Anda sudah dalam kondisi terbaru.
sudo apt update && sudo apt upgrade -y
Serta instal beberapa library pendukung yang sering dibutuhkan oleh PHP:
sudo apt install -y curl unzip libnss3-tools
Cara Cepat: Mengunduh Binary Statis
Cara termudah adalah menggunakan static binary yang sudah dikompilasi. Ini tidak membutuhkan instalasi PHP tradisional (apt install php) karena semua sudah ada di dalamnya.
Cari versi terbaru di halaman rilis GitHub FrankenPHP.
Unduh menggunakan terminal (contoh versi 1.1.0 untuk arsitektur x86_64):
Berikan izin eksekusi:
chmod +x frankenphp
```
4. **Pindahkan ke folder bin** agar bisa diakses dari mana saja:
```bash
sudo mv frankenphp /usr/local/bin/
```
---
## 3. Menjalankan Server Pertama Anda
Sekarang Anda bisa menjalankan server hanya dengan satu perintah. Masuk ke direktori proyek Laravel atau aplikasi PHP Anda, lalu jalankan:
```bash
frankenphp php-server
Secara default, aplikasi akan berjalan di https://localhost (FrankenPHP otomatis mengurus sertifikat SSL lokal).
Jika ingin menggunakan port spesifik (misalnya port 8000) tanpa HTTPS otomatis untuk pengembangan:
frankenphp php-server --listen :8000
Persiapan Port FrankenPHP
Setiap aplikasi Laravel harus berjalan pada port yang berbeda di sisi FrankenPHP. Sebagai contoh, kita akan mengalokasikan port berikut:
| Aplikasi | Domain | Port Internal (FrankenPHP) |
| Utama | ppni.or.id |
8001 |
| App | app.ppni.or.id |
8002 |
| API | api.ppni.or.id |
8003 |
| Dashboard | dashboard.ppni.or.id |
8004 |
| Member | member.ppni.or.id |
8005 |
Pastikan setiap aplikasi dijalankan dengan perintah (contoh untuk ppni.or.id):
./frankenphp php-server --listen :8001
Struktur Konfigurasi Nginx
Agar rapi dan mudah dikelola, kita akan membuat satu file konfigurasi untuk setiap domain di direktori /etc/nginx/sites-available/.
langkah-langkah :
Buat file konfigurasi untuk domain utama (ppni.or.id):
sudo nano /etc/nginx/sites-available/ppni.or.id
Masukkan script berikut:
server {
listen 80;
server_name ppni.or.id;
location / {
proxy_pass http://127.0.0.1:8001; # Arahkan ke port aplikasi 1
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 $scheme;
}
}
```
3. **Ulangi langkah di atas untuk 4 subdomain lainnya.**
Cukup ganti `server_name` dan `proxy_pass` sesuai tabel di atas. Contoh untuk `api.ppni.or.id`:
```nginx
server {
listen 80;
server_name api.ppni.or.id;
location / {
proxy_pass http://127.0.0.1:8003; # Port untuk API
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 $scheme;
}
}
```
---
## 3. Optimasi: Menggunakan Upstream (Opsional tapi Disarankan)
Jika Anda ingin konfigurasi yang lebih profesional, gunakan blok `upstream`. Ini memudahkan jika di masa depan Anda ingin menambah *load balancing*.
Buat satu file master `/etc/nginx/conf.d/laravel_apps.conf`:
```nginx
upstream app_main { server 127.0.0.1:8001; }
upstream app_core { server 127.0.0.1:8002; }
upstream app_api { server 127.0.0.1:8003; }
upstream app_dashboard { server 127.0.0.1:8004; }
upstream app_member { server 127.0.0.1:8005; }
Lalu di file sites-available, Anda cukup memanggil namanya:
location / {
proxy_pass http://app_api;
include proxy_params;
}
Aktivasi dan Pengetesan
Setelah semua file dibuat di sites-available, Anda harus mengaktifkannya dengan membuat symbolic link ke folder sites-enabled.
Aktifkan semua konfigurasi:
sudo ln -s /etc/nginx/sites-available/ppni.or.id /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/app.ppni.or.id /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/api.ppni.or.id /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/dashboard.ppni.or.id /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/member.ppni.or.id /etc/nginx/sites-enabled/
```
2. **Cek apakah ada error penulisan:**
```bash
sudo nginx -t
```
3. **Restart Nginx jika sukses:**
```bash
sudo systemctl restart nginx
```
---
## 5. Tips Tambahan untuk Laravel & FrankenPHP
* **Keamanan (SSL):** Sangat disarankan menggunakan HTTPS. Setelah konfigurasi di atas selesai, Anda bisa menjalankan `sudo certbot --nginx` untuk mendapatkan sertifikat SSL gratis dari Let's Encrypt bagi kelima domain tersebut.
* **Upload Size:** Tambahkan `client_max_body_size 100M;` di dalam blok `http` atau `server` agar user bisa mengunggah file besar.
* **Websocket:** Jika aplikasi menggunakan fitur real-time, pastikan menambahkan header berikut di dalam `location /`:
```nginx
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
```
Dengan setup ini, Nginx akan bertindak sebagai polisi lalu lintas yang efisien di depan FrankenPHP, memastikan setiap request mendarat di aplikasi Laravel yang tepat.