Skip to content

树莓派4B自建网页服务器指南(7):阿里云 ECS 反向代理——隐端口、保备案的生产方案(上)(主线终章)

一、引言

1.1 专栏进度回顾

篇章核心内容状态
1-2家宽 IPv6 前置确认 + 树莓派离线烧录 / Golden Image
3-4NetworkManager / WiFi 防飘 / SSH 主机名 / Nginx 静态页
5域名 + ddns-go 动态解析(阿里云 DNS AAAA → 树莓派 IPv6)
6acme.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公网IPv4600主站入口:接收 jiejinx.cn 的 HTTP/HTTPS 流量。
AwwwECS公网IPv4600主站入口:接收 www.jiejinx.cn 的流量,通常做 301 跳转。
ApiECS公网IPv4600反代frp入口:指向 ECS,Nginx 将在此处监听并转发至树莓派。
Api-rawECS公网IPv4600反代直连入口:指向 ECS,Nginx 将在此处监听并转发至树莓派。

验证命令:在本地电脑执行,确保解析正确指向 ECS 的 IPv4 地址。

powershell
ping jiejinx.cn ping pi.jiejinx.cn

3.2.2 ECS 安全组配置

登录阿里云 ECS 控制台,进入实例详情页 -> 【安全组】 -> 【配置规则】。需要开放 80/443 供用户访问,开放 7000 供 frp 隧道控制连接,开放 22 供 SSH 管理。

优先级协议类型端口范围授权对象描述
1TCP80, 4430.0.0.0/0Web 服务:允许全球访问主站。
2TCP70000.0.0.0/0Frp 控制端口:允许树莓派 frpc 连接 ECS 上的 frps(token + allowPorts 防护)
3TCP22你的本地IP/32SSH 管理:限制只有你能登录服务器。

3.3 基础环境准备

在 ECS 上执行:

bash
sudo apt update && sudo apt upgrade -y
sudo apt install nginx -y

3.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 创建主站配置

bash
# 创建主站配置文件
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; }
}
EOF

3.4.3 创建兜底配置(IP 直访)

bash
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 准备主站页面(含备案号)

bash
# 创建网站目录
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 验证配置并重载

bash
# 测试配置语法
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 上单独申请一份泛域名证书,与树莓派侧独立管理,互不同步。

安装申请证书:

bash
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 目录:

bash
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)

bash
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

验证并重载

bash
sudo nginx -t && sudo systemctl reload nginx

3.5.2 树莓派侧证书(回源 SSL)

  • 主轨 frp:回源走隧道内 HTTP,不涉及证书验证,树莓派侧证书仅用于 frpc → Nginx 的本机回环连接(::1:9133HTTPS),acme.sh 自动续期即可,无需额外操作。
  • 备轨 ddns-go 直连:回源走公网 IPv6 HTTPS,树莓派侧证书同样由 acme.sh 自动续期。

💡 为什么 ECS 和树莓派各持一份证书:两份都是 *.jiejinx.cn泛域名,互不冲突。ECS 侧证书用于用户端 HTTPS,树莓派侧证书用于回源(备轨)或本机 frpc 访问(主轨)。各自 cron 续期,互不依赖。

未完待续 点击跳转 !