Skip to content
Advertisement

how to setup a single nginx server with multiple php-fpm docker containers

Nginx is running on my server (not a docker image) to proxy the subdomain requests to my docker containers.

Having an additional nginx container for each image works well as follows:

docker-compose.yml

version: '2'

services:
    nginx:
        image: nginx:latest
        ports:
            - "8080:80"
        volumes:
            - .:/app
            - ./site.conf:/etc/nginx/conf.d/default.conf
        networks:
            - code-network
    php:
        image: php:fpm
        volumes:
            - .:/app
        networks:
            - code-network

networks:
    code-network:
        driver: bridge

site.conf

server {
    listen 80;
    index index.php index.html;
    server_name localhost;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /app;

    location ~ .php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

/etc/nginx/sites-available/dev.domain.co.uk

server {
    listen 80;
    listen [::]:80;
    server_name dev.domain.co.uk;
    location / {
        proxy_pass http://localhost:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

But seems wasteful to have an additional instance of nginx for each php site.

How can I route the server instance of nginx directly to each php:fpm container?

note: the docker ‘code-network’ gets renamed appname-code-network upon docker-compose up -d

Advertisement

Answer

Figured this out.

In the nginx server conf, the root is the location to the code on the server host i.e. /home/user/CODE/site

the fastcgi_param is the location of the code on the Docker container, (/app) as defined in docker-compose.yml

fastcgi_param SCRIPT_FILENAME /app$fastcgi_script_name;

You also need to pass to the docker container host ip:

fastcgi_pass 172.21.0.2:9000;

As discovered by hostname -I, when using bash on the container.

I’m yet to discover how to use the container hostname instead

User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement