You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

五、启动与验证

  1. 确保当前目录下存在nginx.conf、docker-compose.yml,且ssl目录包含有效证书文件
  2. 启动容器:
docker-compose up -d
  1. 验证转发效果:
    • 访问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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:55:56