基于Docker容器配置Nginx反向代理实现HTTP/HTTPS重定向
基于Docker和Nginx实现反向代理配置方案
一、核心逻辑梳理
首先明确容器分工与端口映射关系:
- 业务容器:提供核心服务,内部监听
8081(HTTP)和8082端口(对应HTTPS转发目标) - Nginx代理容器:作为流量入口,外部暴露
4041(HTTP)和4042(HTTPS)端口,负责将请求转发至业务容器对应端口
二、Nginx配置文件编写
创建本地配置文件nginx.conf,内容如下:
user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; # HTTP 转发规则:外部4041端口 → 业务容器8081 server { listen 4041; server_name domain.com; location / { proxy_pass http://backend:8081; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } # HTTPS 转发规则:外部4042端口 → 业务容器8082 server { listen 4042 ssl; server_name domain.com; # SSL 证书挂载路径 ssl_certificate /etc/nginx/ssl/domain.com.crt; ssl_certificate_key /etc/nginx/ssl/domain.com.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; location / { # 若业务容器8082为HTTPS服务,将proxy_pass改为https://backend:8082 proxy_pass http://backend:8082; 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; } } }
三、Docker Compose容器编排(推荐)
使用docker-compose.yml统一管理两个容器,简化部署流程:
version: '3.8' services: backend: # 替换为你的业务服务镜像 image: your-business-service:latest ports: - "8081:8081" - "8082:8082" # 按需添加业务容器的环境变量、挂载卷等配置 environment: - APP_ENV=production networks: - proxy-network nginx-proxy: image: nginx:alpine ports: - "4041:4041" - "4042:4042" volumes: # 挂载本地Nginx配置到容器内 - ./nginx.conf:/etc/nginx/nginx.conf # 挂载SSL证书目录(需提前在本地创建ssl文件夹并放入证书文件) - ./ssl:/etc/nginx/ssl depends_on: - backend networks: - proxy-network networks: proxy-network: driver: bridge
四、Docker环境HTTPS配置优化方案
1. 生产环境:Let's Encrypt自动签发免费证书
如果域名为公网可访问,推荐使用Certbot自动获取并续期SSL证书:
- 临时调整Nginx配置,监听80端口用于证书验证(可在
nginx.conf中添加临时server块) - 运行Certbot命令生成证书:
docker run -it --rm \ -v "./ssl:/etc/letsencrypt" \ -v "./nginx.conf:/etc/nginx/nginx.conf" \ certbot/certbot certonly --webroot -w /var/www/html -d domain.com
- 配置定时任务自动续期证书(可通过Docker容器或系统crontab实现)
2. 测试环境:自签名证书快速生成
测试场景下,可一键生成自签名证书:
mkdir -p ssl openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ssl/domain.com.key -out ssl/domain.com.crt
五、启动与验证
- 确保当前目录下存在
nginx.conf、docker-compose.yml,且ssl目录包含有效证书文件 - 启动容器:
docker-compose up -d
- 验证转发效果:
- 访问
http://domain.com:4041,应看到业务容器8081端口的服务内容 - 访问
https://domain.com:4042,应看到业务容器8082端口的服务内容
- 访问
六、关键注意事项
- 确保服务器防火墙已开放
4041、4042端口 - 同一Docker网络内,使用服务名(如
backend)代替IP地址,避免容器IP变动导致转发失败 - 若业务容器8082为HTTPS服务,需将Nginx的
proxy_pass改为https://backend:8082,测试环境可添加proxy_ssl_verify off;跳过证书验证
内容的提问来源于stack exchange,提问作者Guillaume
相关产品推荐
相关产品推荐

