Hoe ik mijn PHP-apps naar productie breng met Docker, php-fpm en Nginx
Door Jim van Duijsen
20 juli 2025
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:
- nginx: een webserver die inkomende HTTP-verzoeken afhandelt
- 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:
- Werkdirectory:
/var/www - Installatie van dependencies via
composer install - Kopiëren van de rest van de applicatiecode
- Werkdirectory:
NGINX Service
- Basis image:
nginx:1.24-alpine - Configuratie: aangepaste
nginx.conf - Statische bestanden:
publicdirectory 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;
}
}