树莓派4B自建网页服务器指南(7):阿里云 ECS 反向代理——隐端口、保备案的生产方案(上)(主线终章)
一、引言
1.1 专栏进度回顾
| 篇章 | 核心内容 | 状态 |
|---|---|---|
| 1-2 | 家宽 IPv6 前置确认 + 树莓派离线烧录 / Golden Image | ✅ |
| 3-4 | NetworkManager / WiFi 防飘 / SSH 主机名 / Nginx 静态页 | ✅ |
| 5 | 域名 + ddns-go 动态解析(阿里云 DNS AAAA → 树莓派 IPv6) | ✅ |
| 6 | acme.sh 泛域名 HTTPS(9133)+ 公网 IPv6 直连验证 | ✅ |
至此树莓派已具备完整 HTTPS 公网访问能力,但第六篇方案仍存在三个明显短板:
- 端口号暴露:访问必须加 :9133,不符合常规浏览习惯
- 备案缺失:家宽 IP 无法备案,域名直接解析到家宽有合规风险
- 家宽入站依赖:光猫/路由器 IPv6 防火墙必须处于“低”档位,防护全开则直连中断
本篇目标:用一台廉价阿里云 ECS 将公网入口收口到备案侧,同时提供两条可选的技术链路,分别应对不同的网络条件和安全诉求。
1.2 双轨方案概览
| 维度 | 主轨:ECS + frp 隧道(推荐) | 备轨:ECS + ddns-go 直连 |
|---|---|---|
| 公网入口 | pi.jiejinx.cn(A → ECS) | pi-raw.jiejinx.cn(A → ECS) |
| 回源方式 | frp 隧道(树莓派主动出网) | Nginx 重定向到 pi-ddns:9133 |
| 备案 | ✅ ECS 国内 IP,可备案 | ✅ ECS 国内 IP,可备案 |
| 家宽入站依赖 | ✅ frp 隧道可绕过 | ⚠️ 无法绕过(需光猫低+路由器低) |
| 光猫/路由器防护 | ✅ 可全开 | ⚠️ 必须低档位 |
| 带宽上限 | ECS 带宽(1-3Mbps) | 家宽上传(30-50Mbps) |
| 成本 | ECS 99/年 + 树莓派电费 | ECS 99/年 + 树莓派电费 |
| 推荐场景 | 专栏主页、API、小流量服务 | 网盘、大文件传输、视频流 |
💡 主轨是本篇的首推方案。它从根本上绕开了家宽 IPv6 入站依赖,光猫和路由器的防护可以全部开到最高,安全性由 ECS 兜底。
⚠️ 备轨保留了家宽上传的带宽优势,但需要接受第六篇的防火墙设定,适合对带宽有较高要求的自用场景。
二、方案原理
2.1 主轨:ECS + frp 隧道
用户浏览器
↓ HTTPS :443(无端口号)
DNS 解析 pi.jiejinx.cn → A 记录 → ECS 公网 IPv4
ECS Nginx (:443, SSL 终止)
↓ proxy_pass http://127.0.0.1:7000(frp 服务端本地端口)
frp 隧道(ECS frps ← 树莓派 frpc,树莓派主动出网建立)
↓
树莓派 Nginx (:9133, HTTPS, acme.sh 泛域名)关键机制:frpc 从树莓派侧主动出网连接 ECS 的 frps,隧道建立后,ECS 上的 Nginx 将请求转发到本机 127.0.0.1:7000,frps 再将数据通过已建立的隧道送回树莓派。
整个过程不依赖任何入站端口,光猫和路由器的 IPv6 防火墙可以全部开到最高。
2.2 备轨:ECS 302 跳转 + 浏览器直连
用户浏览器
↓ HTTPS :443(无端口号)
DNS 解析 pi-raw.jiejinx.cn → A 记录 → ECS 公网 IPv4
ECS Nginx (:443, SSL 终止)
↓ 返回 302 重定向
浏览器自动跳转
↓ HTTPS :9133(带端口号)
DNS 解析 pi-ddns.jiejinx.cn → AAAA 记录 → 树莓派公网 IPv6
树莓派 :9133(IPv6 直连,SSL 终止在树莓派)关键机制:ECS 仅作为导航入口,收到用户请求后返回 302 重定向,浏览器自动跳转到 https://pi-ddns.jiejinx.cn:9133,后续流量直接由浏览器与树莓派 IPv6 直连,不经过 ECS 带宽。
此链路依赖家宽 IPv6 入站通畅,即光猫和路由器需处于第六篇所述的“低”档位。
三、阿里云 ECS 选购与基础配置
3.1 实例规格
- 类型: 阿里云 ECS 突发性能 t6 / 共享型 n4(1C1G 起步,反代够用)
- 带宽: 1-3Mbps 固定带宽(99 计划常见档位)
- 系统: Ubuntu 24.04 LTS 64位(阿里云镜像市场提供,长期支持5年)
- 架构: x86_64(ECS 均为 x86,与树莓派 ARM64 不同,但 frp 和 Nginx 均有对应 amd64 版本)
- 地域: 离你最近的国内节点(华东1/华南1,备案通用)
- 99计划: 阿里云目前推出99元/每年的活动,持续到2029年,具体可参考专栏7.3篇
3.2 DNS 解析配置 与 安全组配置
在架构中,ECS 充当主站 Web 服务器和 frp 服务端,树莓派通过 frp 将 pi.jiejinx.cn反代出来。为了让链路通畅,需要同时配置域名解析(DNS)和阿里云安全组。
3.2.1 域名解析设置(DNS)
登录阿里云控制台,进入【域名解析 DNS】,为你的主域名 (jiejinx.cn)添加以下记录。
此步骤的目的是将公网流量引导至 ECS,同时将 pi子域的流量预留给后续 frp 隧道。
| 记录类型 | 主机记录 | 记录值 | TTL | 用途说明 |
|---|---|---|---|---|
| A | @(留空) | ECS公网IPv4 | 600 | 主站入口:接收 jiejinx.cn 的 HTTP/HTTPS 流量。 |
| A | www | ECS公网IPv4 | 600 | 主站入口:接收 www.jiejinx.cn 的流量,通常做 301 跳转。 |
| A | pi | ECS公网IPv4 | 600 | 反代frp入口:指向 ECS,Nginx 将在此处监听并转发至树莓派。 |
| A | pi-raw | ECS公网IPv4 | 600 | 反代直连入口:指向 ECS,Nginx 将在此处监听并转发至树莓派。 |
验证命令:在本地电脑执行,确保解析正确指向 ECS 的 IPv4 地址。
ping jiejinx.cn ping pi.jiejinx.cn3.2.2 ECS 安全组配置
登录阿里云 ECS 控制台,进入实例详情页 -> 【安全组】 -> 【配置规则】。需要开放 80/443 供用户访问,开放 7000 供 frp 隧道控制连接,开放 22 供 SSH 管理。
| 优先级 | 协议类型 | 端口范围 | 授权对象 | 描述 |
|---|---|---|---|---|
| 1 | TCP | 80, 443 | 0.0.0.0/0 | Web 服务:允许全球访问主站。 |
| 2 | TCP | 7000 | 0.0.0.0/0 | Frp 控制端口:允许树莓派 frpc 连接 ECS 上的 frps(token + allowPorts 防护) |
| 3 | TCP | 22 | 你的本地IP/32 | SSH 管理:限制只有你能登录服务器。 |
3.3 基础环境准备
在 ECS 上执行:
sudo apt update && sudo apt upgrade -y
sudo apt install nginx -y3.4 主站 Nginx 配置与备案页
3.4.1 配置结构说明
Ubuntu 下 Nginx 的站点配置有两种管理方式,本文采用 conf.d按域名拆分的方式(与 sites-available+ sites-enabled软链接方式等价,二选一即可):
/etc/nginx/
├── nginx.conf # 主配置文件(包含 conf.d/*.conf)
└── conf.d/
├── jiejinx.cn.conf # 你的主站域名配置
└── default.conf # 兜底配置(IP 直访)3.4.2 创建主站配置
# 创建主站配置文件
sudo tee /etc/nginx/conf.d/jiejinx.cn.conf > /dev/null << 'EOF'
server {
listen 80;
listen [::]:80;
server_name jiejinx.cn www.jiejinx.cn;
charset utf-8;
root /var/www/html;
index index.html;
# 预留 ACME HTTP-01 验证路径(后续申请 SSL 证书用)
location /.well-known/acme-challenge/ { allow all; }
}
EOF3.4.3 创建兜底配置(IP 直访)
sudo tee /etc/nginx/conf.d/default.conf > /dev/null << 'EOF'
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
charset utf-8;
root /var/www/html;
index index.html;
}
EOF💡 兜底配置的作用:当用户通过 IP 地址直接访问 ECS 时,Nginx 会匹配 server_name _这个默认块,同样显示你的主站页面。同时它也作为安全网——如果某个域名配置写错了,IP 直访仍然能访问到站点,方便排错。
3.4.4 准备主站页面(含备案号)
# 创建网站目录
sudo mkdir -p /var/www/html
# 写入主站页面(替换为你的备案号)
sudo tee /var/www/html/index.html > /dev/null << 'HTMLCONTENT'
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>学习笔记</title>
<style>
body { max-width: 720px; margin: 40px auto; padding: 0 20px; font: 16px/1.8 sans-serif; color: #333; }
h1 { color: #0366d6; }
footer { margin-top: 60px; padding-top: 20px; border-top: 1px solid #eee; font-size: 14px; text-align: center; color: #999; }
footer a { color: #666; text-decoration: none; }
footer a:hover { text-decoration: underline; }
</style>
</head>
<body>
<h1>技术分享站</h1>
<p>经验分享 · 树莓派搭建 · 私有云架构实践</p>
<p>更多内容正在建设中,敬请期待。</p>
<footer>
<a href="https://beian.miit.gov.cn" target="_blank">新ICP备19000265号-1</a>
|
<a href="https://beian.mps.gov.cn/#/query/webSearch?code=65290002000113" target="_blank">新公网安备65290002000113号</a>
</footer>
</body>
</html>
HTMLCONTENT⚠️ 请将上述 ICP 备案号和网安备案号替换为你自己的。备案号格式参考:
ICP 备案号:新ICP备19000265号-1→ 你的 省份ICP备xxxxxx号-x
网安备案号:新公网安备65290002000113号→ 你的 省份公网安备xxxxxxxx号
3.4.5 验证配置并重载
# 测试配置语法
sudo nginx -t
# 重载使配置生效
sudo systemctl reload nginx
# 验证页面可访问
curl -s http://127.0.0.1:80 | head -5
如果输出包含 <title>学习笔记</title>,说明配置成功。3.4.6 配置要点说明
| 配置项 | 说明 |
|---|---|
| charset utf-8 | 强制响应头声明 UTF-8 编码,避免浏览器乱码 |
| listen [::]:80 | 同时监听 IPv6,为后续双栈访问做准备 |
| location /.well-known/acme-challenge/ | Let's Encrypt 证书验证路径,预留在配置中,后续申请 SSL 时无需修改 |
| server_name _ | 兜底配置,匹配所有未指定的域名或 IP 直访 |
3.5 主站证书处理
3.5.1 ECS 侧 SSL 证书(用户端 → ECS)
jiejinx.cn的证书放在 ECS 上,推荐在 ECS 上单独申请一份泛域名证书,与树莓派侧独立管理,互不同步。
安装申请证书:
cd /tmp
# ECS 在线上安装 acme.sh
curl https://get.acme.sh | sh
# 在线安装可能超时, 推荐下面的本地下载操作
# ecs下载慢,可能还限制代理链接
# 可以本地电脑使用代理下载后上传ecs
#windows powershell:
curl.exe -LO https://gh.llkk.cc/https://github.com/acmesh-official/acme.sh/archive/master.tar.gz
#上传命令:ecs_user 为你的ecs登陆用户,ECS_IP 为你的云主机ip地址
scp master.tar.gz ecs_user@ECS_IP:/tmp
#上传后ECS端:
tar -xzf master.tar.gz
cd acme.sh-master
./acme.sh --install -m standalone
#安装完刷新环境变量:
source ~/.bashrc
# 配置阿里云 DNS API(与第五篇 6.5 节相同)
nano ~/.acme.sh/account.conf
#找到ACCOUNT_EMAIL='standalone' 改为你的邮箱
ACCOUNT_EMAIL='your_email@example.com'
#添加如下配置
Ali_Key='你的阿里云 AccessKey ID'
Ali_Secret='你的阿里云 AccessKey Secret'
#保存退出(Ctrl+O→ Enter→ Ctrl+X)
# 签发泛域名证书(默认 ZeroSSL ,阿里云ecs 连接申请更顺)
acme.sh --issue --dns dns_ali -d jiejinx.cn -d *.jiejinx.cn代理下载链接,若代理超时 代理站点可进行替换,通过代理查询站查询可用节点地址替换。
例如:https://gh.llkk.cc/https://github.com/....
替换为:https://777.z321.cc.cd/https://github.com/....代理查询站:https://github.akams.cn/
将证书复制到 Nginx 目录:
sudo mkdir -p /etc/nginx/ssl/jiejinx.cn
sudo cp ~/.acme.sh/jiejinx.cn_ecc/fullchain.cer /etc/nginx/ssl/jiejinx.cn/fullchain.pem
sudo cp ~/.acme.sh/jiejinx.cn_ecc/jiejinx.cn.key /etc/nginx/ssl/jiejinx.cn/privkey.pem
sudo chmod 600 /etc/nginx/ssl/jiejinx.cn/privkey.pem修改 conf.d/jiejinx.cn.conf(追加 443 + 80 改 301)
sudo tee /etc/nginx/conf.d/jiejinx.cn.conf > /dev/null << 'EOF'
server {
listen 80;
listen [::]:80;
server_name jiejinx.cn www.jiejinx.cn;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name jiejinx.cn www.jiejinx.cn;
ssl_certificate /etc/nginx/ssl/jiejinx.cn/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/jiejinx.cn/privkey.pem;
charset utf-8;
root /var/www/html;
index index.html;
}
EOF验证并重载
sudo nginx -t && sudo systemctl reload nginx3.5.2 树莓派侧证书(回源 SSL)
- 主轨 frp:回源走隧道内 HTTP,不涉及证书验证,树莓派侧证书仅用于 frpc → Nginx 的本机回环连接(::1:9133HTTPS),acme.sh 自动续期即可,无需额外操作。
- 备轨 ddns-go 直连:回源走公网 IPv6 HTTPS,树莓派侧证书同样由 acme.sh 自动续期。
💡 为什么 ECS 和树莓派各持一份证书:两份都是 *.jiejinx.cn泛域名,互不冲突。ECS 侧证书用于用户端 HTTPS,树莓派侧证书用于回源(备轨)或本机 frpc 访问(主轨)。各自 cron 续期,互不依赖。