Getting Started

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.

The www-data UID/GID is different between Debian (33:33) and Alpine (82:82). We left these values alone to make these images as native as possible. If you switch between Debian and Alpine, you may need to adjust file permissions in your Docker image and volume mounts.

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

VariationDefault Ports
cli(none)
fpm9000
fpm-nginxHTTP: 8080, HTTPS: 8443
fpm-apacheHTTP: 8080, HTTPS: 8443
unitHTTP: 8080, HTTPS: 8443
frankenphpHTTP: 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:

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

Default Environment Variables

Environment variables give you a ton of flexibility to customize your container without the complexity of mounting custom configuration files. By default, these images are set to production-ready values. You can read more about the available environment variables below.

Learn more about environment variables

Default PHP INI Settings

PHP INI fileDescription
Image Default

/usr/local/etc/php/conf.d/serversideup-docker-php.ini
This is our production-ready PHP ini file that accepts environment variables. You can review it in greater detail on GitHub.
Adding your own PHP INI file

/usr/local/etc/php/conf.d/*.ini
If you want to use our defaults, you can simple create a .ini file in the /usr/local/etc/php/conf.d/ directory and it will be loaded automatically. This will be loaded after our default ini file, so whatever you set in your own ini file will override the default values.
Learn more about changing common PHP settings

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

If you need to install additional extensions, you can use the guide below to learn more.

Learn more about installing additional PHP extensions

Default Operating System Packages

The following packages are installed by default:

PackageDescriptionImage variationsWhy we included it
libfcgi-bin
(Debian)
fcgi
(Alpine)
FastCGI is a protocol for interfacing interactive programs with a web server.*-fpm
*-fpm-nginx
*-fpm-apache
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
*-fpm-apache
This is required for the envsubst command. We use this command to process templates on container initialization.
libstdc++6
(Debian)
libstdc++ (Alpine)
The GNU Standard C++ Library is a C++ standard library.*-frankenphpThis is required for the watcher to run with FrankenPHP.
procpsThe procps package contains programs for monitoring your system and its processes.* (only Debian images)This is required for pgrep so we can use that for our native health checks.
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.
Learn which operating systems are available

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.

Learn more about health checks

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-log-output-level.shSets PHP log output level to match LOG_OUTPUT_LEVELall
5-generate-ssl.shGenerates a self-signed SSL certificate and key for the container.fpm-nginx, fpm-apache, frankenphp
5-fpm-pool-user.shSets the user and group of the PHP-FPM child processes to the values of PHP_FPM_CHILD_PROCESS_USER and PHP_FPM_CHILD_PROCESS_GROUP if the container is running as root.fpm
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
*-apache
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
all

If you want to add your own entrypoint scripts, use the guide below to learn more.

Learn more about adding your own start up scripts

Disabling Default Entrypoint Scripts

We get it. Sometimes you just want our stuff to get out of the way. If you want full control to customize your image, all default entrypoint scripts can be disabled by setting DISABLE_DEFAULT_CONFIG to true.