nginx è un web server molto popolare, spesso utilizzato anche come reverse proxy per instradare il traffico verso altri container o servizi. In questo articolo vedremo come configurare Nginx in un container Docker per fare da reverse proxy a un'applicazione web.
1. Struttura del progetto
Organizziamo il progetto con la seguente struttura:
.
├── docker-compose.yml
├── nginx
│ └── nginx.conf
└── app
└── Dockerfile
2. Creazione di un'applicazione di esempio
Per testare il reverse proxy, creiamo una semplice applicazione Node.js o Python. Ecco un esempio con Python e Flask:
# app/Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY . /app
RUN pip install flask
CMD ["python", "app.py"]
# app/app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello from Flask app behind Nginx reverse proxy"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
3. Configurazione di Nginx
Creiamo il file nginx.conf
per configurare Nginx come reverse proxy verso il container dell'applicazione:
# nginx/nginx.conf
events {}
http {
server {
listen 80;
location / {
proxy_pass http://app:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
4. File docker-compose.yml
Infine, usiamo Docker Compose per mettere insieme i container dell'applicazione e di Nginx:
# docker-compose.yml
services:
app:
build: ./app
container_name: app
expose:
- 5000
nginx:
image: nginx:alpine
container_name: nginx
ports:
- "80:80"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- app
5. Avvio del progetto
Per avviare tutto il progetto, esegui:
docker-compose up --build
Ora, accedendo a http://localhost
, dovresti vedere la risposta dell'app Flask, servita attraverso Nginx come reverse proxy.
Conclusione
In questo tutorial abbiamo visto come configurare Nginx in Docker per fungere da reverse proxy verso un'applicazione backend. Questa architettura è molto comune in ambienti di produzione e può essere estesa facilmente per supportare HTTPS, bilanciamento del carico, o routing verso più servizi.