在Docker环境中使用Nginx作为反向代理来服务多个应用站点是一种常见的部署方式。以下是详细的实现方法:
假设你有两个应用: - 一个Node.js应用(监听3000端口) - 一个Python Flask应用(监听5000端口)
为每个应用创建Docker容器,可以通过docker-compose.yml
来管理:
version: '3'
services:
node-app:
image: your-node-app-image
ports:
- "3000:3000"
networks:
- app-network
flask-app:
image: your-flask-app-image
ports:
- "5000:5000"
networks:
- app-network
nginx-proxy:
image: nginx:latest
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./certs:/etc/nginx/certs
depends_on:
- node-app
- flask-app
networks:
- app-network
networks:
app-network:
driver: bridge
创建nginx.conf
文件,配置多个站点的代理:
events {
worker_connections 1024;
}
http {
upstream node-app {
server node-app:3000;
}
upstream flask-app {
server flask-app:5000;
}
server {
listen 80;
server_name nodeapp.example.com;
location / {
proxy_pass http://node-app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
server_name flaskapp.example.com;
location / {
proxy_pass http://flask-app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
如果你想通过路径而不是子域名来区分应用:
server {
listen 80;
server_name example.com;
location /nodeapp/ {
proxy_pass http://node-app/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /flaskapp/ {
proxy_pass http://flask-app/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
使用Let's Encrypt证书:
server {
listen 443 ssl;
server_name nodeapp.example.com;
ssl_certificate /etc/nginx/certs/nodeapp.example.com/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/nodeapp.example.com/privkey.pem;
location / {
proxy_pass http://node-app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
server_name nodeapp.example.com;
return 301 https://$host$request_uri;
}
docker-compose up -d
如果你不想手动配置Nginx,可以使用jwilder/nginx-proxy自动生成配置:
version: '3'
services:
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./certs:/etc/nginx/certs
node-app:
image: your-node-app-image
environment:
- VIRTUAL_HOST=nodeapp.example.com
networks:
- app-network
flask-app:
image: your-flask-app-image
environment:
- VIRTUAL_HOST=flaskapp.example.com
networks:
- app-network
networks:
app-network:
driver: bridge
这种方法会自动检测新容器并根据VIRTUAL_HOST环境变量生成Nginx配置。
希望这个指南能帮助你在Docker环境中使用Nginx代理多个应用站点!