Docker环境下Nginx反向代理配置:指向Web容器及HTTPS跳转
解决Docker中Nginx反向代理指向Web容器的问题
你的核心问题是依赖了Docker容器的固定IP(172.19.0.3),这个IP在容器重启后会变化,而且如果Nginx和Flarum容器不在同一个Docker网络中,也会导致访问失败。下面是具体的解决方案:
1. 创建共享Docker网络
首先创建一个自定义的Docker网络,让Nginx、Certbot和Flarum/MariaDB容器都加入这个网络,这样它们之间可以通过服务名(容器名)进行DNS解析通信:
docker network create web-network
2. 更新Nginx+Certbot的docker-compose配置
修改你的Nginx compose文件,加入共享网络:
version: '3' services: nginx: image: nginx:1.15-alpine ports: - "80:80" - "443:443" volumes: - ./Volumes/nginx:/etc/nginx/conf.d - ./Volumes/certbot/conf:/etc/letsencrypt - ./Volumes/certbot/www:/var/www/certbot networks: - web-network # 加入共享网络 certbot: image: certbot/certbot volumes: - ./Volumes/certbot/conf:/etc/letsencrypt - ./Volumes/certbot/www:/var/www/certbot networks: - web-network # 加入共享网络 networks: web-network: external: true # 指定使用已创建的外部网络
3. 更新Flarum的docker-compose配置
同样给Flarum和MariaDB容器加入同一个共享网络:
version: '3' services: flarum: image: mondedie/docker-flarum:0.1.0-beta.8.1-stable container_name: flarum env_file: - ./flarum.env volumes: - ./Volumes/assets:/flarum/app/public/assets - ./Volumes/extensions:/flarum/app/extensions - ./Volumes/nginx:/etc/nginx/conf.d depends_on: - mariadb networks: - web-network # 加入共享网络 mariadb: image: mariadb:10.2 container_name: mariadb environment: - MYSQL_ROOT_PASSWORD=password - MYSQL_DATABASE=flarum - MYSQL_USER=flarum - MYSQL_PASSWORD=password volumes: - ./Volumes/mysql/db:/var/lib/mysql networks: - web-network # 加入共享网络 networks: web-network: external: true # 指定使用已创建的外部网络
4. 修改Nginx的反向代理配置
更新app.conf,把固定IP替换成Flarum的容器服务名flarum,同时添加必要的反向代理请求头(让Flarum能识别真实的用户请求信息):
server { listen 80; server_name forums.example.com; location /.well-known/acme-challenge/ { root /var/www/certbot; } location / { return 301 https://$host$request_uri; } } server { listen 443 ssl; server_name forums.example.com; ssl_certificate /etc/letsencrypt/live/forums.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/forums.example.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; location / { # 用容器服务名替代固定IP,Docker会自动解析 proxy_pass http://flarum:8888/; # 添加反向代理请求头,确保后端应用获取正确的请求信息 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; } }
5. 重启容器验证
执行以下命令重启所有相关容器:
# 重启Nginx和Certbot cd <nginx-compose目录> docker-compose up -d # 重启Flarum和MariaDB cd <flarum-compose目录> docker-compose up -d
之后你可以:
- 访问
http://forums.example.com,应该会自动重定向到https://forums.example.com并正常加载Flarum应用 - 如果遇到问题,进入Nginx容器测试网络连通性:
docker exec -it <nginx容器名> ping flarum,能ping通则网络没问题,再查看Nginx日志排查:docker logs <nginx容器名>
为什么这样有效?
- Docker自定义网络提供自动DNS解析,服务名(如
flarum)会直接映射到对应容器的当前IP,避免了固定IP的不稳定问题 - 共享网络确保Nginx容器和Flarum容器处于同一个网络环境,能够互相访问
- 添加的反向代理头让Flarum知道用户是通过HTTPS访问的,并且能获取真实IP,避免功能异常
内容的提问来源于stack exchange,提问作者TrevorKS
相关产品推荐
相关产品推荐

