Files
ykxmz/_build/optimize_network.sh
T
xmz7891 566d9e384f 阶段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
2026-10-06 23:53:19 +08:00

122 lines
4.7 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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} 秒"