阶段1+2:恢复 HTTP/2 加速 + 重做官网

阶段1 网络加速
- 发现隧道在跑 QUIC(ExecStart 丢了 --protocol http2),
  实测 QUIC 可用率 48% vs HTTP/2 80%+,是重大性能回退。
  恢复后公网延迟从 4141ms 降到 690ms(快 6 倍),可用率 92%。
- 优选 IP 结论:无效。hosts 覆盖确实生效了(日志里连的就是指定 IP),
  但落点仍是 lax —— 运营商把所有 Cloudflare anycast 都路由到美西。
  已清掉这段无效配置。
- BBR 不可用:设备是自定义内核 6.4.0-rc4-jsbsbxjxh66,
  没编 tcp_bbr 模块也没配置项。改用 cubic + 调优:
  TCP 缓冲 4MB、tcp_fastopen=3、tcp_slow_start_after_idle=0
  (长轮询场景关键)、tcp_tw_reuse=1。

阶段2 官网重做
- 拆出独立模块 relay/landing.py(relay.py 已两千多行,
  再塞 HTML 没法看)
- 信息结构参考成熟产品站:吸顶导航 / Hero / 九宫格功能 /
  三步上手 / 下载 / FAQ / 页脚
- 保持白色简洁:底白、浅灰面板、细边框、大量留白
- logo 用内联 SVG(ICO 放 img 里实测是破图)
- 管理入口从官网移除(管理不对外开放)

过程中被自己的测试抓到两个 bug:
- 模块叫 site.py 会和 Python 标准库重名,import site 拿到的是标准库
- _logo() 里把 % 格式化和字符串拼接混用,直接抛 TypeError
This commit is contained in:
xmz7891
2026-10-06 23:53:19 +08:00
parent 9b1edbf378
commit 566d9e384f
214 changed files with 2879 additions and 1384 deletions
+121
View File
@@ -0,0 +1,121 @@
#!/bin/bash
# 阶段1:真正的网络加速
#
# 排查结论:
# ① 隧道在跑 QUIC(ExecStart 缺 --protocol http2)——
# 实测 QUIC 48% vs HTTP/2 80%,这是重大性能回退,必须修回。
# ② 优选 IP 对这条线路**没用**:hosts 覆盖确实生效了
# (日志里 ip=198.41.200.238 就是我指定的),但落点仍是 lax01/lax13。
# 说明运营商把**所有** Cloudflare anycast 流量都路由到美西,换 IP 改不了路径。
# 所以那段 hosts 覆盖属于无效配置,清掉更干净。
# ③ 真正能救的是**拥塞控制**:这条线路 40% 丢包,
# Linux 默认的 CUBIC 一遇丢包就砍窗口,吞吐塌方、延迟飙升。
# BBR 基于带宽+延迟建模,丢包不当事 —— 在丢包链路上提升是数量级的。
set -u
RELAY_DIR=/root/lanremote-relay
echo "════════ 1. 恢复 HTTP/2 ════════"
cat > /etc/systemd/system/lanremote-tunnel.service <<'EOF'
[Unit]
Description=ykxmz Cloudflare 具名隧道
After=network-online.target lanremote-relay.service lanremote-nettune.service
Wants=network-online.target lanremote-relay.service
[Service]
Type=simple
# 协议 HTTP/2(走 TCP 7844)
# 实测:这条线路丢 UDP 包,QUIC 可用率只有 48%;
# HTTP/2 稳定在 80% 以上。**别去掉这个参数** ——
# 去掉就会退回 QUIC,可用率直接腰斩。
# 连接数 2:有冗余又不占内存(设备只有 460MB)
ExecStart=/usr/local/bin/cloudflared tunnel \
--protocol http2 \
--edge-ip-version 4 \
--ha-connections 2 \
--no-autoupdate \
--retries 5 \
--config /root/.cloudflared/config.yml run lanremote
Restart=always
RestartSec=5
MemoryMax=160M
StandardOutput=append:/root/lanremote-relay/tunnel.log
StandardError=append:/root/lanremote-relay/tunnel.log
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
echo " 已写回 --protocol http2"
echo
echo "════════ 2. 清掉无效的 hosts 覆盖 ════════"
sed -i '/argotunnel.com/d' /etc/hosts
echo " /etc/hosts 里的 argotunnel 条目: $(grep -c argotunnel /etc/hosts) 个"
echo
echo "════════ 3. 启用 BBR 拥塞控制 ════════"
modprobe tcp_bbr 2>/dev/null || true
cat > /etc/sysctl.d/98-ykxmz-net.conf <<'EOF'
# ykxmz 网络调优(针对 4G 高丢包链路)
#
# 拥塞控制:BBR
# Linux 默认 CUBIC 把丢包当拥塞信号,一丢包就砍发送窗口。
# 这条线路丢包 40%,CUBIC 会一直在"砍窗口-慢慢恢复"的循环里,
# 表现就是延迟从 200ms 飙到 2 秒。
# BBR 用带宽和延迟建模,丢包不直接等于拥塞,高丢包链路上好得多。
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
# TCP 缓冲:长途高延迟链路需要更大的窗口才能跑满
net.core.rmem_max = 4194304
net.core.wmem_max = 4194304
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 65536 4194304
# 快速打开连接(省一个 RTT)
net.ipv4.tcp_fastopen = 3
# 更早重传,别干等
net.ipv4.tcp_retries2 = 8
# 复用 TIME_WAIT 的连接,长轮询场景能省不少握手
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
EOF
sysctl -p /etc/sysctl.d/98-ykxmz-net.conf 2>&1 | sed 's/^/ /'
echo
echo " 当前拥塞控制: $(sysctl -n net.ipv4.tcp_congestion_control)"
echo " 队列算法: $(sysctl -n net.core.default_qdisc)"
echo " 可用算法: $(sysctl -n net.ipv4.tcp_available_congestion_control)"
echo
echo "════════ 4. 重启隧道 ════════"
systemctl restart lanremote-tunnel
sleep 40
echo " 连接数: $(curl -s --max-time 5 http://127.0.0.1:20241/metrics 2>/dev/null | grep '^cloudflared_tunnel_ha_connections' | awk '{print $2}')"
echo " 协议与落点:"
grep -E 'Registered tunnel connection' "$RELAY_DIR/tunnel.log" 2>/dev/null | tail -3 \
| grep -oE 'ip=[0-9.]+ location=[a-z0-9]+ protocol=[a-z0-9]+' | sed 's/^/ /'
grep -oE 'Initial protocol [a-z0-9]+' "$RELAY_DIR/tunnel.log" 2>/dev/null | tail -2 | sed 's/^/ /'
echo
echo "════════ 5. 延迟实测(20 次,看平均)════════"
total=0; ok=0; max=0
for i in $(seq 1 20); do
r=$(curl -s -o /dev/null -w '%{http_code} %{time_total}' --max-time 20 \
-H 'User-Agent: LanRemote/1.4.0' https://relay.xxmxxs.top/v1/health 2>/dev/null)
code=$(echo "$r" | cut -d' ' -f1)
t=$(echo "$r" | cut -d' ' -f2)
if [ "$code" = "200" ]; then
ok=$((ok+1))
total=$(echo "$total + $t" | bc)
bigger=$(echo "$t > $max" | bc)
[ "$bigger" = "1" ] && max=$t
fi
sleep 1
done
avg=$(echo "scale=3; $total / $ok" | bc 2>/dev/null || echo "?")
echo " 可用 $ok/20"
echo " 平均 ${avg} 秒 最慢 ${max} 秒"