nginx as ingress for Docker compose
In June I wrote about how to use Docker & nginx to deliver statically rendered brotli files for your web (frontend) application. It improves delivery quite a bid, but left me wonder: isn't there too much static WebServer involved?
Double hop to deliver static files
A typical web application using micro/mini/midi services looks like this:
It is common, easy and concerns quite separated. However it comes with a set of challenges:
- nginx doesn't do http/2 on
proxy_pass
, so you miss the ability to serve static files directly with http/2 - For static file we have two nginx involved
- Each service needs to be exposed to the host at some port
- The service architecture leaks to the host based nginx. SO any change in service needs an update to the
docker-compose.yml
AND the host based nginx configuration - the containers depend on that, external to them, configuration
So I tried to design a better way to handle this without going all K-in:
This looed like a more promising approach:
- Services could be addressed with their internal network name
- Only Ports 80 and 443 of one container need exposure on the host
- The nginx configuration inside the container is immutable and can't accidentially be reconfigured in production (your image comes from a pipeline isn't it)
Challenges
- When trying to configure certbot, I initially tried using the
--nginx
parameter with an http challenge and shared data mounts. None of the attempts worked satisfactory, so at the end I settled on aDNS-01 using CloudFlare. - Since I wanted the nginx configuration to be inside the container image (and not on a data mount), a good understandig of nginx's configuration is necessary. The only persisted information was
/etc/letsencrypt
for the certificate and a secret for CloudFlare credentials - When the nginx configuration is statically configured for TLS, on initial load it will fail since the certs don't exist yet. Auntie Google suggested a manual run of certbot, but I favour
docker compose up
to handle everything - I ended up creating my own docker images, which was an epiphany: it absolutely makes sense to build a container image for single use instead of trying hard to make it configurable and vulnerable to mis-configuration
Read more
Posted by Stephan H Wissel on 15 November 2023 | Comments (0) | categories: Docker nginx WebDevelopment