door op enter te drukken ga je akkoord met onze Privacy Policy

Blog
← Terug naar alle blogs

Hoe ik mijn PHP-apps naar productie breng met Docker, php-fpm en Nginx

Door Jim van Duijsen

20 juli 2025

phpdockernginxproduction

Mijn PHP-setup voor productie

Zo draai ik een PHP-applicatie in productie met behulp van Docker Compose om de images te bouwen, NGINX en PHP-FPM. Dit werkt goed voor platforms waarmee je apps kunt deployen met Docker Compose (zoals Coolify). Omdat de code in de image is ingebakken, kun je eenvoudig terugdraaien.

Je kunt de configuratie vinden op mijn GitHub of hieronder kopiëren.

Overzicht

Deze configuratie zet een klassieke PHP-webapplicatie-omgeving op met twee services:

  1. nginx: een webserver die inkomende HTTP-verzoeken afhandelt
  2. app: een PHP-FPM-service die de PHP-code uitvoert

De NGINX-service is verantwoordelijk voor het direct serveren van statische bestanden (zoals afbeeldingen en CSS) en het doorsturen van PHP-verzoeken naar de app-service.

Service-specifieke details

App Service (PHP)

  • Basis image: php:8.2.0-fpm

  • Systeemafhankelijkheden: zlib1g-dev, libzip-dev, unzip

  • PHP-extensies: zip

  • Composer: gekopieerd vanuit de officiële Composer image

  • Applicatiecode:

    1. Werkdirectory: /var/www
    2. Installatie van dependencies via composer install
    3. Kopiëren van de rest van de applicatiecode

NGINX Service

  • Basis image: nginx:1.24-alpine
  • Configuratie: aangepaste nginx.conf
  • Statische bestanden: public directory wordt direct geserveerd

Hoe ze samenwerken

  • Statische bestanden worden direct door NGINX geserveerd
  • PHP-bestanden worden via FastCGI doorgestuurd naar de PHP-FPM service

Docker Compose

services:
  app:
    build:
      context: ./
      dockerfile: Dockerfile-php
    container_name: php-fpm
    restart: always
    working_dir: /var/www/

  nginx:
    build:
      context: ./
      dockerfile: Dockerfile-nginx
    container_name: nginx
    restart: always
    # ports: # alleen voor development
    #   - 8000:80

Dockerfile (PHP)

FROM php:8.2.0-fpm

RUN apt-get update && apt-get install -y \
    zlib1g-dev \
    libzip-dev \
    unzip

RUN rm -rf /var/lib/apt/lists/*

RUN docker-php-ext-install zip

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

RUN composer self-update

WORKDIR /var/www

COPY composer.json composer.lock ./

RUN composer install

COPY ./ ./

Dockerfile (NGINX)

FROM nginx:1.24-alpine

COPY ./nginx/nginx.conf /etc/nginx/conf.d/default.conf
COPY ./public /var/www/public

NGINX configuratie

Bestand: nginx/nginx.conf

server {
    listen 80;
    index index.php;

    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    error_page 404 /index.php;
    root /var/www/public;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
}