Unraid利用Acme.sh与NginxProxyManager搭建自动化HTTPS内网穿透服务
1. 为什么要在Unraid上搭建HTTPS内网穿透服务
最近几年,越来越多的家庭用户开始搭建自己的NAS系统。Unraid凭借其出色的Docker支持和灵活的存储方案,成为了很多技术爱好者的首选。但随之而来的问题是:如何安全地在外网访问家里的这些服务?
我自己的Unraid服务器上跑了十多个服务,从密码管理、电子书库到家庭相册。最开始我用简单的端口映射,但很快就发现两个痛点:一是每次访问都要记不同的端口号,二是HTTP明文传输太不安全。后来尝试过各种方案,最终发现Acme.sh + Nginx Proxy Manager的组合是最优雅的解决方案。
这个方案的核心价值在于:
- 全自动证书管理:Let's Encrypt证书每90天自动续期,完全不用人工干预
- 统一访问入口:所有服务通过同一个HTTPS端口暴露,只需记住不同子域名
- 内网穿透兼容:无论是否有公网IP,都能通过内网穿透工具实现安全访问
- 配置可视化:Nginx Proxy Manager提供了友好的Web界面,告别手动编辑nginx.conf
2. 基础环境准备
2.1 硬件与网络要求
在开始之前,建议先检查你的硬件配置是否满足需求。我的Unraid主机配置如下:
- CPU:Intel i5-10400(6核12线程)
- 内存:32GB DDR4
- 存储:2TB SSD缓存 + 4x4TB HDD阵列
- 网络:千兆有线连接
虽然这个配置看起来有些过剩,但实际使用中发现当同时运行多个Docker容器时,足够的内存和CPU资源确实能带来更流畅的体验。特别是当Nginx Proxy Manager需要处理大量并发请求时。
网络方面需要特别注意:
- 确保路由器支持端口转发(如果需要从公网访问)
- 建议为Unraid主机分配静态IP地址
- 准备一个域名(可以是免费二级域名如freenom提供的.tk/.ml等)
2.2 必须的Docker应用安装
在Unraid的CA(Community Applications)应用中搜索并安装以下组件:
-
Nginx Proxy Manager
- 选择官方镜像jc21/nginx-proxy-manager
- 端口映射建议:81:81(管理界面)、80:80(HTTP)、443:443(HTTPS)
- 需要挂载/data和/letsencrypt目录到本地存储
-
Acme.sh
- 使用neilpang/acme.sh镜像
- 需要挂载一个持久化卷用于存储证书文件
- 根据你的DNS提供商设置对应的API密钥环境变量
-
User Scripts插件
- 用于设置自动续期任务
- 在Unraid的插件市场中搜索安装
安装完成后,建议先不要立即配置,我们会在后续步骤中详细说明每个组件的设置方法。
3. 使用Acme.sh申请SSL证书
3.1 配置DNS API密钥
以阿里云域名为例,首先需要在阿里云控制台获取API密钥:
- 登录阿里云控制台 → 鼠标悬停在右上角头像 → 选择"AccessKey管理"
- 创建新的AccessKey并妥善保存
然后在Unraid的终端中执行以下命令创建Acme.sh容器:
docker run --rm -itd \
-v /mnt/user/appdata/acme.sh:/acme.sh \
-e Ali_Key="你的阿里云Key" \
-e Ali_Secret="你的阿里云Secret" \
--net=host \
--name=acme.sh \
neilpang/acme.sh
重要提示:不同DNS提供商的环境变量名称不同。比如Cloudflare需要设置CF_Key和CF_Email,DNSPod需要DP_Id和DP_Key等。
3.2 申请通配符证书
执行以下命令申请证书(以example.com为例):
docker exec acme.sh --set-default-ca --server letsencrypt
docker exec acme.sh --issue --dns dns_ali -d example.com -d *.example.com
这里有几个实用技巧:
--force参数可以强制更新证书(即使未到期)- 如果遇到报错,可以添加
--debug 2参数查看详细日志 - 通配符证书(*.example.com)可以覆盖所有子域名
3.3 安装证书到指定位置
证书申请成功后,需要将其安装到Nginx Proxy Manager能访问的位置:
docker exec acme.sh --install-cert -d example.com \
--key-file /acme.sh/privkey.pem \
--fullchain-file /acme.sh/fullchain.pem
这样就会在挂载目录/mnt/user/appdata/acme.sh下生成privkey.pem和fullchain.pem两个关键文件。
4. 配置Nginx Proxy Manager
4.1 初始设置与登录
安装完成后,通过http://你的UnraidIP:81访问管理界面。首次登录使用默认凭证:
- 邮箱:admin@example.com
- 密码:changeme
登录后系统会强制要求修改密码,建议使用密码管理器生成并保存强密码。
4.2 导入SSL证书
在管理界面左侧菜单选择"SSL Certificates" → "Add SSL Certificate":
- 证书名称填写你的域名(如example.com)
- 证书类型选择"Custom"
- 私钥(KEY)选择之前生成的privkey.pem文件
- 证书链(CERTIFICATE)选择fullchain.pem文件
导入成功后,证书会出现在列表中并显示有效期信息。
4.3 配置反向代理规则
现在可以为你的服务添加反向代理了。以Vaultwarden密码管理器为例:
- 点击"Proxy Hosts" → "Add Proxy Host"
- 在"Details"标签页:
- 域名填写vault.example.com
- Scheme选择http
- Forward Hostname/IP填写Unraid内网IP
- Forward Port填写Vaultwarden的容器端口(默认80)
- 在"SSL"标签页:
- 选择之前导入的SSL证书
- 开启"Force SSL"和"HTTP/2 Support"
- 点击保存
实测经验:如果遇到502错误,检查以下几点:
- 确保后端服务确实在指定端口运行
- 尝试关闭"Block Common Exploits"选项
- 检查Nginx Proxy Manager日志获取详细错误信息
5. 实现内网穿透与自动化
5.1 内网穿透方案选择
根据你的网络环境,可以选择不同的穿透方案:
有公网IP的情况:
- 在路由器设置端口转发,将443端口映射到Unraid的443端口
- 配置DDNS服务动态更新域名解析
无公网IP的情况:
- 使用frp等穿透工具
- 配置云服务器作为中转
- 将域名解析指向云服务器IP
5.2 证书自动续期设置
通过User Scripts插件设置自动任务:
- 在Unraid界面进入"User Scripts"
- 创建新脚本,粘贴以下内容(根据实际情况修改路径和域名):
#!/bin/bash
# 续期证书
docker exec acme.sh --renew -d example.com --force
# 复制证书到NPM目录
cp /mnt/user/appdata/acme.sh/{privkey,fullchain}.pem /mnt/user/appdata/NginxProxyManager/custom_ssl/npm-1/
# 重启NPM使新证书生效
docker restart NginxProxyManager
- 设置定时任务,建议每月执行一次:
- Cron表达式:
0 0 1 * *
- Cron表达式:
5.3 常见问题排查
证书申请失败:
- 检查DNS解析是否生效(可用dig或nslookup工具)
- 确认API密钥权限足够
- 尝试使用acme.sh的--debug模式查看详细日志
NPM无法启动:
- 检查端口是否被占用(netstat -tulnp)
- 查看容器日志(docker logs NginxProxyManager)
- 确保挂载目录有正确权限
HTTPS访问异常:
- 检查浏览器控制台报错信息
- 使用openssl s_client -connect命令测试证书链
- 确认系统时间正确(证书验证依赖准确时间)
6. 安全加固与性能优化
6.1 安全最佳实践
-
防火墙规则:
- 只开放必要的端口(通常只需443)
- 建议屏蔽来自海外的访问(如果服务仅国内使用)
-
NPM安全设置:
- 启用"Access Lists"限制管理界面访问IP
- 定期检查"Audit Log"中的异常登录
-
证书管理:
- 为不同子域名使用独立证书(减少单点风险)
- 监控证书到期提醒(可配置Telegram机器人通知)
6.2 性能调优技巧
-
Nginx参数优化:
- 在"Advanced"标签页添加以下配置:
client_max_body_size 100m; keepalive_timeout 75s; gzip on;
- 在"Advanced"标签页添加以下配置:
-
资源限制:
- 为NPM容器分配固定内存(如512MB)
- 设置CPU优先级避免资源争抢
-
缓存策略:
- 对静态资源启用浏览器缓存
- 考虑添加Redis缓存层
这套方案在我自己的Unraid服务器上稳定运行了两年多,期间经历了多次证书自动续期和Nginx版本升级,从未出现过服务中断。最大的收获是再也不用为各种服务的端口号和HTTP安全问题头疼了,现在所有家庭成员都能通过简单的域名访问需要的服务,而且安全性得到了充分保障。
更多推荐


所有评论(0)