1. 为什么需要反向代理?
在局域网环境中,我们经常需要访问各种本地服务,比如NAS管理界面、自建Git服务器、家庭媒体中心等。传统方式是直接输入IP地址加端口号(如192.168.1.100:8080),这种方式存在几个明显问题:
- 记忆困难:不同服务的IP和端口组合难以记忆
- 安全性低:暴露端口号可能带来安全隐患
- 缺乏统一入口:每个服务都需要单独访问
- 无法使用HTTPS:直接IP访问难以配置SSL证书
反向代理(Reverse Proxy)技术正是解决这些痛点的理想方案。它充当客户端和后端服务器之间的中介,对外提供统一的访问入口,对内根据规则将请求转发到不同的服务。
2. Nginx Proxy Manager 简介
Nginx Proxy Manager(简称NPM)是一个基于Nginx的图形化管理工具,相比直接配置Nginx,它具有以下优势:
- 可视化操作:无需编写复杂的nginx.conf文件
- 证书管理:内置Let's Encrypt自动证书申请和续期
- 访问控制:支持基础认证和IP限制
- 性能优异:基于Nginx的高性能代理引擎
2.1 为什么选择Docker部署?
使用Docker部署NPM有三大好处:
- 环境隔离:所有依赖都打包在容器内,不会污染主机环境
- 一键迁移:配置和数据通过卷(volume)持久化,迁移时只需复制几个文件
- 版本控制:可以方便地切换或升级NPM版本
3. 部署准备
3.1 硬件和软件需求
- 一台运行Linux的服务器(物理机或虚拟机)
- 已安装Docker和Docker Compose
- 80、443、81端口未被占用
- 本地网络环境(建议使用有线连接保证稳定性)
提示:检查端口占用可以使用命令
netstat -tuln | grep -E '80|443|81'
3.2 目录结构规划
建议按以下结构组织文件:
code复制~/nginx-proxy-manager/
├── docker-compose.yml
├── data/ # NPM配置数据
└── letsencrypt/ # SSL证书
4. 详细部署步骤
4.1 编写docker-compose.yml
创建docker-compose.yml文件,内容如下:
yaml复制version: '3'
services:
app:
image: jc21/nginx-proxy-manager:latest
container_name: npm
restart: unless-stopped
ports:
- "80:80" # HTTP流量
- "443:443" # HTTPS流量
- "81:81" # 管理界面
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
environment:
DB_SQLITE_FILE: "/data/database.sqlite"
DISABLE_IPV6: "true"
关键参数说明:
restart: unless-stopped:确保容器意外退出后自动重启- volume映射:将配置和证书持久化到主机
DISABLE_IPV6:如果不需要IPv6可以禁用
4.2 启动容器
执行以下命令启动服务:
bash复制mkdir -p ~/nginx-proxy-manager/{data,letsencrypt}
cd ~/nginx-proxy-manager
docker-compose up -d
启动后可以通过 docker ps 检查容器状态,正常应该看到类似输出:
code复制CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES
a1b2c3d4e5f6 jc21/nginx-proxy-manager:latest "/init" Up 2 hours 0.0.0.0:80-81->80-81/tcp, :::443->443/tcp npm
4.3 初始化访问
- 打开浏览器访问
http://服务器IP:81 - 首次登录使用默认凭证:
- Email:
admin@example.com - Password:
changeme
- Email:
- 登录后立即修改密码
5. 配置反向代理
5.1 添加代理主机
以代理本地Transmission Web界面(假设运行在192.168.1.100:9091)为例:
- 在NPM控制台点击"Hosts" → "Proxy Hosts" → "Add Proxy Host"
- 填写配置:
- Domain Names:
transmission.local(可自定义) - Scheme:
http - Forward Hostname/IP:
192.168.1.100 - Forward Port:
9091
- Domain Names:
- 点击"Save"
5.2 高级配置选项
在"Advanced"标签页可以设置:
- 自定义Nginx配置片段
- 缓存策略
- 访问控制(Basic Auth)
- Websocket支持
对于需要HTTPS的服务:
- 在SSL标签页选择"Request a new SSL Certificate"
- 勾选"Force SSL"和"HTTP/2 Support"
6. OpenWrt路由器配置
6.1 DNS重定向设置
为了让局域网设备通过域名访问服务,需要在路由器上配置DNS重定向:
- 登录OpenWrt管理界面
- 进入"Network" → "DHCP and DNS"
- 在"Hostnames"部分添加:
code复制transmission.local 192.168.1.x # NPM服务器IP - 保存并应用
6.2 防火墙规则(可选)
如果需要从外网访问,需添加端口转发:
- 外部端口80/443 → 内部NPM服务器IP的80/443
7. 实际使用示例
配置完成后,访问流程如下:
- 用户在浏览器输入
http://transmission.local - 本地DNS解析为NPM服务器IP
- NPM收到请求后,根据域名转发到192.168.1.100:9091
- Transmission返回响应,经NPM返回给用户
8. 常见问题排查
8.1 502 Bad Gateway
可能原因:
- 后端服务未运行
- 防火墙阻止了NPM到后端服务的连接
- IP或端口配置错误
解决方法:
- 检查后端服务是否正常运行
- 从NPM容器内测试连接:
docker exec -it npm curl http://后端IP:端口 - 检查NPM日志:
docker logs npm
8.2 SSL证书申请失败
常见原因:
- 80端口被占用或未正确映射
- 域名解析未指向正确IP
- Let's Encrypt速率限制
解决方案:
- 确保能从公网访问80端口(申请证书时)
- 使用临时域名测试(如test.example.com)
- 查看证书申请日志:
docker exec -it npm cat /etc/letsencrypt/logs/letsencrypt.log
8.3 性能优化建议
- 启用HTTP/2:在SSL配置中勾选
- 调整缓存大小:在Advanced中添加:
code复制proxy_cache_path /tmp/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m; - 限制客户端上传大小:
code复制client_max_body_size 100M;
9. 维护与升级
9.1 定期备份
关键数据包括:
data/目录:包含所有NPM配置letsencrypt/目录:SSL证书- docker-compose.yml文件
建议每周执行一次备份:
bash复制tar czvf npm-backup-$(date +%Y%m%d).tar.gz ~/nginx-proxy-manager
9.2 升级版本
升级步骤:
- 停止容器:
docker-compose down - 拉取新镜像:
docker-compose pull - 重新启动:
docker-compose up -d - 检查日志确认无报错
10. 扩展应用场景
10.1 多子域名管理
可以为不同服务分配子域名:
- git.local → Gitea服务
- nas.local → NAS管理界面
- home.local → Home Assistant
10.2 外部服务代理
NPM也可以代理公网服务,实现:
- 统一入口管理内外网服务
- 为没有HTTPS的服务添加SSL加密
- 访问控制(如限制特定IP访问)
10.3 负载均衡
对于高可用服务,可以配置多个后端:
- 在NPM中添加"Upstreams"
- 添加多个后端服务器
- 选择负载均衡算法(轮询/最少连接等)
经过这样一套完整的配置,你的局域网服务访问体验将得到质的提升。不再需要记忆复杂的IP和端口组合,所有服务都能通过简洁的域名访问,并且享受HTTPS加密的安全保障。