PHP-FPM, Nginx, Kubernetes, and Docker

This is a guide to running Nginx and PHP-FPM on Kubernetes. You’ll get an overview of each component in the environment, plus complete source code for running an application using PHP-FPM and Nginx on Kubernetes.

Overview

PHP-FPM

PHP is a scripting language used for web development. CGI scripts are a way to run a script on the server when that server receives a HTTP request. Fast-CGI is an improvement on CGI which is—yep—faster.

PHP-FPM is an implementation of Fast-CGI for PHP with improved capabilities around process management, logging, and high traffic situations.

Nginx

Nginx is a web server and reverse proxy that’s widely used for high traffic applications. When run in combination with PHP-FPM, Nginx is configured to send requests for .php routes to PHP-FPM to serve the page.

Kubernetes and Docker

Kubernetes and Docker run our Nginx and PHP-FPM processes in a Kubernetes cluster. We’ll create a Docker image that includes our application code, and configure a pod to run containers from that image in Kubernetes.

Together

In combination, Nginx serves web pages, passing requests for .php files to PHP-FPM. PHP-FPM takes the request from Nginx, handles dynamic processing of PHP, and gives the result back. Docker packages up our application, and Kubernetes makes sure it’s running.

Solution

PHP-FPM and Nginx need to have access to the same files on the filesystem. In Kubernetes, this means they need to be running on the same pod, and we’ll use a volume to share files between the two containers.

Code

Step 1: the PHP app

Create your PHP application. In this article, we’ll use a simple hello world example. Create this file and call it hello.php.

Step 2: the Dockerfile

Now create a Dockerfile based off the FPM variant of PHP, which is php:7.2-fpm for us. Copy your PHP source code into a directory in that Docker image.

Step 3: the ConfigMap

Let’s get into Kubernetes-land.

We’re going to have two containers running in the pod. One runs PHP-FPM to handle dynamic PHP processing, and the other runs nginx to act as a web server. Both containers read from a shared volume.

We need to set up our configuration settings for the nginx container we’ll create.

Here, we tell nginx to send any request for a *.php file to our PHP-FPM application via localhost:9000.

Step 4: the Pod

Finally, we can create the Kubernetes pod that runs our application container and the nginx web server sidecar.

Be sure to read through the comments in the gist.

Meet the Author

Matthew Palmer is a software developer and author. He’s created popular desktop apps, scaled SaaS web services, and taught Computer Science students at the University of New South Wales.

Contact

Email: [email protected]

Email List: Sign Up

Twitter: @_matthewpalmer

Github: matthewpalmer