Default Configurations

serversideup/php is configured for real-world deployments right out of the box. This saves you many hours so you can launch faster than ever.

Production-ready and optimized for Laravel & WordPress

All values are defaulted to improve security and performance. We also spent the time to carefully review official documentation and include packages that are required specifically for Laravel and WordPress.

Unprivileged by Default

All images default to running as the OS-native www-data user.

Since these images are not privileged, that means they are not running on ports less than 1024:

VariationDefault Ports
fpm-nginxHTTP: 8080, HTTPS: 8443
fpm-apacheHTTP: 8080, HTTPS: 8443
unitHTTP: 8080, HTTPS: 8443

How do I run these services on ports 80 and/or 443?

Almost everyone will want to run these services on ports 80 and 443. If you have an advanced setup, you can use a reverse proxy like Caddy or Traefik to handle the SSL termination and forward the traffic to the container on the non-privileged port.

Or you can simply use Docker's port mapping feature to map the container port to the host port. For example, to run the fpm-nginx variation on port 80 and 443, you can run the following command:

Run FPM NGINX on port 80 and 443

docker run -p 80:8080 -p 443:8443 serversideup/php:8.3-fpm-nginx

Default Environment Variables

We allow the ability to customize the behavior of PHP with environment variables. Be sure to review our production-ready default values on our environment variable specification page.

Default PHP INI Settings

We provide a default PHP ini that come with the suggested and hardened settings for running PHP in production. This file is located at /usr/local/etc/php/conf.d/serversideup-docker-php.ini.

To customize the PHP ini settings, read our Changing Common PHP Settings guide.

Default PHP Extensions

The following extensions are installed by default:

ExtensionDescriptionWhy we included it
opcacheThe Zend OPcache provides faster PHP execution through opcode caching and optimization.This is a must-have for PHP performance.

⚠️ OPcache is disabled by default but can easily be enabled with PHP_OPCACHE_ENABLE=1.
mysqliThe "MySQL Improved" extension is an older extension for connecting to MySQL 4.1 and above.Enabled for fpm-apache only. This is a legacy MySQL connector required for WordPress.
pcntlProcess Control support in PHP implements the Unix style of process creation, program execution, signal handling and process termination.This is required for Laravel queues and Laravel Horizon
pdo_mysqlThe MySQL PDO extension allows you to connect to MySQL databases.MySQL and MariaDB databases are very popular.
pdo_pgsqlThe PostgreSQL PDO extension allows you to connect to PostgreSQL databases.PostgreSQL databases are very popular.
redisThe Redis extension allows you to connect to Redis databases.Redis is very popular for caching and it's also required for Laravel Horizon. Our tests concluded adding this package only added 2MB to the image size.
zipThe Zip extension allows you to create and extract zip files.We included this for the popularity of apps working with ZIP files. This package is also required if you're working with attachments on Laravel Dusk.

The official PHP images are already providing the following extensions:

  • ctype
  • curl
  • dom
  • fileinfo
  • filter
  • hash
  • mbstring
  • openssl
  • pcre
  • session
  • tokenizer
  • xml

Default Operating System Packages

The following packages are installed by default:

PackageDescriptionImage variationsWhy we included it
FastCGI is a protocol for interfacing interactive programs with a web server.*-fpm
This is required for the webserver to interface with PHP-FPM and the php-fpm-healthcheck project.
gettext-base (Debian)
gettext (Alpine)
GNU gettext is a framework for translating user interfaces.*-fpm-nginx
This is required for the envsubst command. We use this command to process templates on container initialization.
shadowShadow is required for the usermod command.*-alpineThis is required to change the UID and GID of the www-data user in docker-php-serversideup-set-id.

Health Checks

By default, all health checks for web servers (Apache, Unit, NGINX, etc.) are located at /healthcheck. You should receive an OK response if the container is healthy.

For our fpm variation, we use the php-fpm-healthcheck script to verify the health of PHP-FPM. This script is located at /usr/local/bin/php-fpm-healthcheck.

The cli variation does not have a health check because it doesn't really make sense to have one. Would love to discuss more if you feel different.

Default Entrypoint Scripts

We created an entrypoint script that scans the entrypoint.d directory for other shell scripts to execute before the main container process starts. All scripts are executed in alphabetical order so you can have full control over what script execution order.

We also provide a few default scripts to help you get started.

Script NameDescriptionImage variations
0-container-info.shShows basic execution information, such as Docker User, UID, GID, etc.all
1-debug-mode.shSets PHP to debug mode if LOG_OUTPUT_LEVEL = "debug"all
10-init-unit.shProcesses Unit templates, configures SSL (if enabled), and prepares NGINX Unit for launchunit
10-init-webserver-config.shProcesses web server configuration templates, configures SSL (if enabled), and prepares web server for launch*-nginx
50-laravel-automations.shIf AUTORUN_ENABLED is set to true, and a Laravel installation is detected, the following commands will automatically execute on container start:
- php artisan config:cache
- php artisan route:cache
- php artisan view:cache
- php artisan event:cache
- php artisan migrate --force

Disabling Default Entrypoint Scripts

If you want full control to customize your image, all default entrypoint scripts can be disabled by setting DISABLE_DEFAULT_CONFIG to true.