Ubuntu 24 + Docker 部署反向代理完整指南

前言

在部署 Nextcloud 等容器化服务时,反向代理是一个至关重要的组件。它不仅能简化访问方式,还能提供 HTTPS 自动化和多服务统一入口等强大功能。本文将详细介绍在 Ubuntu 24 系统上使用 Docker 部署反向代理的完整流程。

🧭 什么是反向代理?

反向代理是客户端与后端服务器之间的”中间人”,负责将客户端请求转发到内部服务。

简化理解

1
2
浏览器 -> 反向代理 (Nginx / Caddy / Traefik)
-> 内部服务 (Nextcloud Docker 容器)

实际示例:

  • 你访问 https://cloud.ncy.cn
  • 反向代理(Nginx/Traefik)将请求转发到 http://172.17.0.1:8080(Nextcloud 容器内部端口)
  • 外部无法直接访问容器 IP(172.18.x.x),但代理可以访问

🔍 反向代理 vs /etc/hosts 对比

功能 /etc/hosts 反向代理
本地域名解析 ✅ 仅在本机有效 ✅ 通常配合 DNS 使用
自动 HTTPS ❌ 手动配置麻烦 ✅ 自动申请 Let’s Encrypt
多服务端口复用 ❌ 一个端口只能绑一个服务 ✅ 支持虚拟主机与路径转发
外部访问 ❌ 仅限本地 ✅ 可被公网访问
容器网络 ❌ 不能跨容器解析 ✅ Docker 网络内自动识别

🧠 核心优势:反向代理比 /etc/hosts 灵活得多,特别适合 Nextcloud AIO、Rocket.Chat、Portainer 等多容器应用场景。


🚀 部署方案选择

在 Ubuntu 24 中,我们推荐两种主流部署方式:

✅ 方案 A:Nginx Proxy Manager(最推荐)

  • 可视化 Web 管理界面
  • 自动申请和管理 HTTPS 证书(Let’s Encrypt)
  • 容器内即可代理多个服务
  • 适合初学者和中级用户

✅ 方案 B:Traefik(专业方案)

  • 自动发现 Docker 容器并配置代理
  • 自动管理 SSL 证书与子域名
  • 配置相对复杂但功能更强大
  • 适合有经验的用户

下面重点介绍 方案 A:Nginx Proxy Manager 的完整部署流程。


🧩 部署步骤详解

第 1 步:创建专用 Docker 网络

创建独立的 Docker 网络,让反向代理和所有服务在同一个网络中通信:

1
docker network create proxy

验证网络创建成功:

1
docker network ls | grep proxy

第 2 步:部署 Nginx Proxy Manager

创建项目目录和必要的子目录:

1
2
mkdir -p ~/nginx-proxy-manager/{data,letsencrypt}
cd ~/nginx-proxy-manager

创建 docker-compose.yml 文件:

1
nano docker-compose.yml

写入以下配置内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
container_name: nginx-proxy-manager
restart: always
ports:
- '80:80' # HTTP 端口
- '81:81' # 管理界面端口
- '443:443' # HTTPS 端口
environment:
DB_SQLITE_FILE: "/data/database.sqlite"
# 可选的性能优化设置
DISABLE_IPV6: 'true'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
networks:
- proxy
healthcheck:
test: ["CMD", "/bin/check-health"]
interval: 30s
timeout: 10s
retries: 3

networks:
proxy:
external: true

启动 Nginx Proxy Manager:

1
docker compose up -d

检查服务状态:

1
docker ps | grep nginx-proxy-manager

第 3 步:访问并配置管理界面

打开浏览器访问管理界面:

1
http://服务器IP:81

默认登录信息:

  • 邮箱:admin@example.com
  • 密码:changeme

首次登录后,系统会强制要求修改密码和邮箱,请务必设置强密码。

第 4 步:部署 Nextcloud AIO 并加入代理网络

修改原有的 Nextcloud AIO 部署命令,加入代理网络:

1
2
3
4
5
6
7
8
9
sudo docker run \
--sig-proxy=false \
--name nextcloud-aio-mastercontainer \
--restart always \
--network proxy \
-e APACHE_PORT=11000 \
-e APACHE_IP_BINDING=0.0.0.0 \
-v nextcloud_aio_mastercontainer:/mnt/docker-aio-config \
nextcloud/all-in-one:latest

关键变化:

  • 移除端口映射 -p 8080:8080
  • 添加网络配置 --network proxy
  • 服务将通过反向代理访问,不再直接暴露端口

第 5 步:配置代理规则

在 Nginx Proxy Manager 中配置 Nextcloud 代理:

  1. 登录 http://服务器IP:81

  2. 点击 “Proxy Hosts”“Add Proxy Host”

  3. 填写代理配置:

    Details 选项卡:

    • Domain Names: cloud.ncy.cn(你的实际域名)
    • Scheme: http
    • Forward Hostname / IP: nextcloud-aio-mastercontainer
    • Forward Port: 11000
    • Block Common Exploits: ✅ 启用
    • Websockets Support: ✅ 启用(如需实时功能)
    • Cache Assets: ✅ 启用(提升性能)

    SSL 选项卡:

    • 选择 “Request a new SSL Certificate”
    • 勾选 “Force SSL”(强制 HTTPS)
    • 勾选 “HTTP/2 Support”
    • 填写有效的邮箱地址(证书通知用)
    • 勾选 “I agree to the Let’s Encrypt Terms of Service”
  4. 点击 Save 保存配置


🔐 访问你的 Nextcloud 服务

配置完成后,你可以直接访问:

1
https://cloud.ncy.cn

系统将自动:

  • 通过 HTTPS 加密连接
  • 反向代理到 Nextcloud AIO 容器
  • 提供安全的公网访问能力

🧰 进阶功能配置

自定义 Nginx 配置

Advanced 选项卡中添加自定义配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 优化文件上传大小限制
client_max_body_size 10G;

# 优化超时设置
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;

# 保持连接头信息
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;

多服务代理配置

你可以继续添加其他服务的代理规则:

服务 域名 容器名 端口
Rocket.Chat chat.ncy.cn rocketchat 3000
Portainer docker.ncy.cn portainer 9000
Vaultwarden vault.ncy.cn vaultwarden 80

日志查看与故障排查

  • 实时日志:Proxy Manager → Logs
  • 容器日志docker logs nginx-proxy-manager
  • 配置备份:定期备份 ~/nginx-proxy-manager/data 目录

🔄 整合部署方案

如果你希望一键部署所有服务,可以使用以下整合的 docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
version: '3.8'

networks:
proxy:
driver: bridge

services:
# Nginx Proxy Manager
proxy:
image: jc21/nginx-proxy-manager:latest
container_name: nginx-proxy-manager
restart: always
ports:
- "80:80"
- "81:81"
- "443:443"
environment:
DB_SQLITE_FILE: "/data/database.sqlite"
volumes:
- ./npm/data:/data
- ./npm/letsencrypt:/etc/letsencrypt
networks:
- proxy

# Nextcloud AIO
nextcloud:
image: nextcloud/all-in-one:latest
container_name: nextcloud-aio-mastercontainer
restart: always
networks:
- proxy
environment:
- APACHE_PORT=11000
- APACHE_IP_BINDING=0.0.0.0
volumes:
- nextcloud_aio_mastercontainer:/mnt/docker-aio-config

部署命令:

1
2
mkdir -p npm/{data,letsencrypt}
docker compose up -d

🧩 方案对比总结

项目 无反向代理 有反向代理
HTTPS 自动化 ❌ 手动配置 ✅ 自动申请和续期
多服务共存 ❌ 端口冲突 ✅ 基于域名路由
跨容器访问 ❌ 复杂配置 ✅ 网络内自动发现
安全性 一般 高(统一安全策略)
配置复杂度 简单 中等(长期收益大)
维护成本

💡 最佳实践建议

  1. 域名准备:提前准备有效的域名并配置 DNS 解析

  2. 证书管理:定期检查 Let’s Encrypt 证书状态

  3. 备份策略:定期备份 NPM 的 data 目录

  4. 安全加固

    • 修改默认管理端口(81 → 其他端口)
    • 设置强密码和双因素认证
    • 定期更新容器镜像
  5. 性能监控:配置日志监控和性能指标收集


结语

通过本文的详细指导,你可以在 Ubuntu 24 系统上成功部署功能完整的反向代理服务。Nginx Proxy Manager 提供了用户友好的管理界面,让复杂的反向代理配置变得简单直观。无论是个人项目还是生产环境,这套方案都能提供稳定可靠的服务代理能力。

下一步建议:在掌握基础部署后,可以进一步探索负载均衡、缓存优化、安全策略等高级功能,构建更加健壮的服务架构。