konfigurasi nginx phpfpm mysql laravel docker | java php laravel linux mysql sql bootstrap html css query java php laravel linux mysql sql bootstrap html css query: konfigurasi nginx phpfpm mysql laravel docker

Tuesday, May 19, 2026

konfigurasi nginx phpfpm mysql laravel docker

📦 Seri: Docker from Zero to Zorro — Artikel 7 dari 10

Konfigurasi Nginx + PHP-FPM + MySQL
untuk Laravel di Docker Compose

Gabungkan tiga layanan sekaligus — web server, runtime PHP, dan database — dalam satu orkestra Docker Compose yang rapi, ringan, dan siap produksi.

#Nginx #PHPFPM #MySQL #Laravel #DockerCompose
⏱️
Estimasi Baca
12 Menit
🎯
Level
Pemula–Menengah
📅
Tahun
2026

Pernah nggak kamu merasa pusing karena harus install Nginx, PHP-FPM, dan MySQL satu per satu di server — lalu ternyata versinya bentrok, konfigurasinya nyasar, dan Laravel-mu tiba-tiba 500 Internal Server Error? Kalau pernah, selamat datang di klub yang salah. 😅 Tapi kabar baiknya: dengan Nginx PHP-FPM MySQL Laravel Docker, semua kerumitan itu bisa kamu rangkum dalam satu file docker-compose.yml yang elegan.

Di artikel ke-7 dari seri Docker from Zero to Zorro ini, kita akan belajar cara mengorkestrasi tiga container sekaligus — Nginx sebagai gerbang, PHP-FPM sebagai otak, dan MySQL sebagai memori. Bukan sekadar "berhasil jalan", tapi benar-benar paham apa yang terjadi di balik layar.

💎 Konsep Utama
Apa Itu PHP-FPM dan Kenapa Bukan PHP Biasa?

PHP-FPM (FastCGI Process Manager) adalah varian PHP yang dirancang untuk performa tinggi. Berbeda dari PHP mod_php yang "nempel" ke Apache, PHP-FPM berjalan sebagai proses terpisah dan berkomunikasi dengan Nginx via socket FastCGI. Ini berarti: Nginx mengurus request HTTP, lalu melempar file PHP ke PHP-FPM untuk dieksekusi. Hasilnya? Server lebih efisien, lebih stabil, dan mudah di-scale.

🏗️ Arsitektur Tiga Container: Nginx, PHP-FPM, dan MySQL untuk Laravel

Bayangkan kamu buka restoran. Nginx adalah resepsionis yang menerima tamu (request HTTP) dan mengarahkan mereka ke dapur yang tepat. PHP-FPM adalah chef yang memasak makanan (mengeksekusi kode Laravel). Sedangkan MySQL adalah gudang bahan baku (database) yang selalu siap dipanggil si chef kapanpun dibutuhkan.

Dalam Docker Compose, ketiganya hidup di container terpisah tapi terhubung dalam satu network. Keindahannya: jika salah satu "dapur" bermasalah, yang lain tidak ikut tumbang.

  Browser / Client
         │
         ▼
  ┌─────────────┐       port 80/443
  │   Nginx      │ ◄────────────── Host Machine
  │  (web server)│
  └──────┬──────┘
         │ FastCGI (port 9000)
         ▼
  ┌─────────────┐
  │  PHP-FPM    │  ← menjalankan kode Laravel
  │  (runtime)  │
  └──────┬──────┘
         │ TCP (port 3306)
         ▼
  ┌─────────────┐
  │   MySQL     │  ← menyimpan data aplikasi
  │  (database) │
  └─────────────┘
💡 TIPS

Dalam Docker Compose, container bisa saling berkomunikasi menggunakan nama service sebagai hostname. Jadi dari PHP-FPM, kamu cukup pakai mysql (bukan IP) sebagai DB_HOST di file .env Laravel.

Komponen Image Docker Port Internal Tugas Utama
🟢 Nginx nginx:alpine 80 Web server, reverse proxy ke PHP-FPM
🟡 PHP-FPM php:8.2-fpm 9000 Menjalankan kode PHP / Laravel
🔴 MySQL mysql:8.0 3306 Database relasional untuk Laravel

⚙️ Langkah-Langkah Konfigurasi Nginx PHP-FPM MySQL Laravel Docker

Oke, mari kita mulai dari nol. Pastikan kamu sudah punya project Laravel (kalau belum, cek Artikel 6). Berikut struktur direktori yang akan kita bangun:

📁 Struktur Direktori
my-laravel-app/
├── docker/
│   ├── nginx/
│   │   └── default.conf
│   └── php/
│       └── Dockerfile
├── src/             ← kode Laravel kamu di sini
├── docker-compose.yml
└── .env
1

Buat Dockerfile untuk PHP-FPM

Image resmi php:8.2-fpm sudah bagus, tapi kita perlu tambahkan ekstensi yang wajib ada untuk Laravel seperti pdo_mysql, mbstring, dan Composer.

📄 docker/php/Dockerfile
FROM php:8.2-fpm

RUN apt-get update && apt-get install -y \
    libpng-dev \
    libjpeg-dev \
    libzip-dev \
    unzip \
    git \
    && docker-php-ext-install \
    pdo_mysql \
    mbstring \
    zip \
    gd \
    && rm -rf /var/lib/apt/lists/*

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html
2

Konfigurasi Nginx Virtual Host

File ini memberitahu Nginx bagaimana menangani request — file statis (CSS, JS, gambar) dilayani langsung, sedangkan file .php dioper ke PHP-FPM.

📄 docker/nginx/default.conf
server {
    listen 80;
    server_name localhost;
    root /var/www/html/public;
    index index.php index.html;

    # Semua request → Laravel
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # Oper .php ke PHP-FPM
    location ~ \.php$ {
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME
                       $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    # Sembunyikan .htaccess
    location ~ /\.ht {
        deny all;
    }
}
⚡ INSIGHT PENTING

Perhatikan fastcgi_pass php:9000 — di sini php adalah nama service yang kita definisikan di docker-compose.yml. Docker secara otomatis me-resolve nama service ini ke IP container yang berjalan. Inilah keajaiban Docker networking!

3

Tulis docker-compose.yml

Ini adalah file utama yang menyatukan semua service. Perhatikan bagian volumes, networks, dan variabel environment untuk MySQL.

📄 docker-compose.yml
version: '3.8'

services:

  # ── 1. Nginx ──────────────────────
  nginx:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - ./src:/var/www/html
      - ./docker/nginx/default.conf
          :/etc/nginx/conf.d/default.conf
    depends_on:
      - php
    networks:
      - laravel-net

  # ── 2. PHP-FPM ────────────────────
  php:
    build:
      context: ./docker/php
    volumes:
      - ./src:/var/www/html
    networks:
      - laravel-net

  # ── 3. MySQL ──────────────────────
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_DATABASE: laravel_db
      MYSQL_USER: laraveluser
      MYSQL_PASSWORD: secret123
      MYSQL_ROOT_PASSWORD: rootsecret
    volumes:
      - mysql-data:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - laravel-net

# ── Volumes & Networks ───────────
volumes:
  mysql-data:

networks:
  laravel-net:
    driver: bridge
4

Konfigurasi .env Laravel

Sesuaikan file .env di dalam folder src/ agar Laravel bisa terhubung ke container MySQL yang sudah kita buat.

📄 src/.env
APP_NAME=LaravelApp
APP_ENV=local
APP_DEBUG=true
APP_URL=http://localhost:8080

DB_CONNECTION=mysql
DB_HOST=mysql       # nama service di compose!
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=laraveluser
DB_PASSWORD=secret123
5

Jalankan dan Verifikasi

Saatnya nyalakan mesin! Jalankan dari direktori root project kamu:

# Build dan jalankan semua container
$ docker compose up -d --build

# Cek status container
$ docker compose ps

# Cek log jika ada error
$ docker compose logs nginx
$ docker compose logs php

Kalau semua berjalan lancar, buka browser dan akses http://localhost:8080 — kamu harusnya melihat halaman welcome Laravel. 🎉

⚠️ PERHATIAN

Jangan lupa set permission folder storage dan bootstrap/cache Laravel agar bisa ditulis oleh PHP-FPM. Jalankan perintah ini: docker compose exec php chmod -R 775 storage bootstrap/cache

🔧 Troubleshooting Umum Nginx PHP-FPM MySQL di Docker

Jujur aja — error itu bagian dari belajar. Berikut beberapa masalah yang sering muncul saat mengkonfigurasi Nginx PHP-FPM MySQL Laravel Docker beserta solusinya:

🔍 Analisis Error Umum
502 Bad Gateway

Penyebab: Nginx tidak bisa reach container PHP-FPM. Solusi: Pastikan nama service di fastcgi_pass sama persis dengan nama service di docker-compose.yml (case-sensitive!).

SQLSTATE[HY000] [2002] Connection refused

Penyebab: Laravel mencoba konek ke 127.0.0.1 bukan ke container MySQL. Solusi: Pastikan DB_HOST=mysql (nama service) di file .env.

Permission denied (storage/logs)

Penyebab: User di dalam container PHP-FPM tidak punya akses tulis ke folder storage. Solusi: Jalankan chmod -R 775 storage di dalam container.

🔥 FAKTA MENARIK

Nginx Alpine image hanya berukuran sekitar 7 MB — bandingkan dengan Apache yang bisa mencapai 60+ MB. Dalam konteks container, ukuran image yang kecil = startup yang lebih cepat dan lebih hemat resource server produksi kamu.

🚀 Best Practices Konfigurasi Docker untuk Laravel Production-Ready

Kalau kamu serius ingin menggunakan setup Nginx PHP-FPM MySQL Laravel Docker ini di production, ada beberapa hal yang perlu kamu perhatikan tambahan:

🔐 Gunakan .env untuk secrets, jangan hardcode

Pindahkan semua variabel environment MySQL (password, nama database) ke file .env di root project dan load dengan env_file di docker-compose.yml.

💾 Selalu pakai named volume untuk MySQL

Named volume (mysql-data) memastikan data database kamu tidak hilang saat container di-recreate. Jangan pernah simpan data penting di container layer!

🏥 Tambahkan healthcheck untuk MySQL

MySQL butuh beberapa detik untuk siap menerima koneksi. Tambahkan healthcheck dan depends_on: condition: service_healthy agar PHP-FPM tidak mencoba koneksi sebelum MySQL benar-benar siap.

💡 TIPS PRO

Tambahkan alias dc untuk docker compose di shell kamu (alias dc='docker compose') — ini menghemat waktu pengetikan yang sangat signifikan saat kamu sering masuk-keluar container selama development.

✅ Kesimpulan

Kamu Sudah Punya Stack Lengkap Laravel di Docker!

Di artikel ini, kita telah membangun setup Nginx PHP-FPM MySQL Laravel Docker dari nol — mulai dari memahami arsitektur tiga container, menulis Dockerfile PHP-FPM custom, mengkonfigurasi virtual host Nginx, hingga mengorkestrasi semuanya dengan docker-compose.yml. Stack ini bukan hanya untuk development lokal — dengan sedikit penyesuaian (HTTPS, env secrets, healthcheck), ini sudah sangat layak untuk production.

🟢 Nginx Alpine — web server ringan, reverse proxy ke PHP-FPM
🟡 PHP-FPM 8.2 — runtime PHP dengan ekstensi Laravel lengkap
🔴 MySQL 8.0 — database persisten dengan named volume
🔵 Docker Compose — orkestrator yang menyatukan semua service

Artikel ini adalah bagian dari seri 10 Artikel Belajar Docker: Docker from Zero to Zorro. Kalau artikel ini membantu kamu, share ke teman developer lain yang masih bingung setup environment! Dan jangan lupa drop komentar di bawah — share pengalaman kamu, atau tanya jika ada yang macet. 👇

🏷️ Tags Artikel
#BelajarDocker #ZeroToZorro #NginxPHPFPMMySQLLaravelDocker #DockerCompose #Laravel #WebDevelopment
📚 Artikel Utama Seri
🐳
Seri Belajar Docker: Docker from Zero to Zorro

Panduan lengkap 10 artikel belajar Docker dari nol hingga bisa deploy aplikasi Laravel production-ready. Cocok untuk pemula yang ingin paham Docker secara menyeluruh.

Lihat Daftar Isi →

No comments:

Post a Comment

saifiahmada.com adalah blog belajar programming Indonesia, membahas lengkap materi bahasa pemrograman: code HTML, CSS, Bootstrap, Desain, PHP, MySQL, coding Java, Query, SQL, dan dunia linux