
Dockerizing Microservices with NGINX Load Balancing for Zero-Downtime Deployments
Zero-downtime rolling updates ensure that user sessions are never severed during active code pushes or configuration changes.
In this guide, I share the multi-stage Docker configurations and NGINX upstream proxy architectures we deployed across our SaaS backends.
Multi-Stage Dockerfile for Node.js Services
# Stage 1: Build & Prune
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
RUN npm prune --production
# Stage 2: Minimal Production Image
FROM node:20-alpine
WORKDIR /app
USER node
COPY /app/dist ./dist
COPY /app/node_modules ./node_modules
COPY /app/package.json ./package.json
EXPOSE 3000
CMD ["node", "dist/main.js"]NGINX Upstream Configuration
upstream node_cluster {
least_conn;
server 127.0.0.1:3001 max_fails=3 fail_timeout=10s;
server 127.0.0.1:3002 max_fails=3 fail_timeout=10s;
keepalive 32;
}
server {
listen 80;
server_name api.platform.com;
location / {
proxy_pass http://node_cluster;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Comments