#!/bin/bash # 把长轮询从 15 秒拉到 60 秒,实测能不能穿过隧道。 # # 为什么这是核心优化: # 隧道每次请求额外加 1~2 秒(连接建立 + CF 内部路由)。 # 15 秒一循环 -> 一天 5760 次/端,每次都要吃那 1~2 秒。 # 60 秒一循环 -> 一天 1440 次/端,开销直接摊薄 4 倍。 # # 而且**命令延迟不会变差**:长轮询是"有数据立刻返回", # 不是"等满 60 秒才返回"。拉长只是减少空转次数。 # # Cloudflare 对单请求有 100 秒上限(超了 524),60 秒留 40 秒余量。 set -u BASE=https://relay.xxmxxs.top LOCAL=http://127.0.0.1:8080 UA='LanRemote/1.8.0' SVC=/etc/systemd/system/lanremote-relay.service BACKUP=/root/lanremote-relay.service.bak.$(date +%s) echo "════════ 1. 备份并改成 60 秒 ════════" cp -a "$SVC" "$BACKUP" echo " 备份: $BACKUP" sed -i 's/^Environment=RELAY_POLL=.*/Environment=RELAY_POLL=60/' "$SVC" grep 'RELAY_POLL' "$SVC" | sed 's/^/ /' systemctl daemon-reload systemctl restart lanremote-relay sleep 8 echo " 中转: $(systemctl is-active lanremote-relay)" curl -s --max-time 10 "$LOCAL/v1/health" | head -c 90 echo echo " 等隧道重新连上…" for i in $(seq 1 15); do c=$(curl -s -o /dev/null -w '%{http_code}' --max-time 12 -H "User-Agent: $UA" "$BASE/v1/health") printf " 第 %d 次: %s\n" "$i" "$c" [ "$c" = "200" ] && break sleep 3 done echo echo "════════ 2. 本机直连(基准,应该约 60 秒)════════" DEV="probe60-$(date +%s)" REG=$(curl -s --max-time 30 -X POST "$LOCAL/v1/agent/register" \ -H 'Content-Type: application/json' \ -d "{\"deviceId\":\"$DEV\",\"code\":\"888888\",\"name\":\"probe60\",\"version\":\"1.8.0\"}") TOKEN=$(echo "$REG" | python3 -c "import sys,json; print(json.load(sys.stdin).get('token',''))" 2>/dev/null) echo " token ${#TOKEN} 字符" for i in 1 2; do out=$(curl -s -o /dev/null -w '%{http_code} %{time_total}' --max-time 120 \ -X POST "$LOCAL/v1/agent/poll" -H "X-Token: $TOKEN") echo " 第 $i 次: $(echo "$out" | awk '{printf "码 %s 耗时 %.1fs", $1, $2}')" done echo echo "════════ 3. 走公网(关键)════════" ok=0 for i in 1 2 3 4; do out=$(curl -s -o /dev/null -w '%{http_code} %{time_total}' --max-time 130 \ -X POST "$BASE/v1/agent/poll" -H "X-Token: $TOKEN" -H "User-Agent: $UA") code=$(echo "$out" | awk '{print $1}') secs=$(echo "$out" | awk '{printf "%.1f", $2}') printf " 第 %d 次: 码 %-4s 耗时 %ss" "$i" "$code" "$secs" if [ "$code" = "200" ]; then echo " ✓" ok=$((ok + 1)) elif [ "$code" = "524" ]; then echo " **Cloudflare 100 秒上限挡了**" else echo " ✗" fi sleep 1 done echo " 成功 $ok/4" echo echo "════════ 4. 顺便测「有数据时立刻返回」有没有退化 ════════" echo " (往队列里塞点东西,看 poll 是不是马上就回来)" # 用 client 侧塞:先建会话太麻烦,改成直接看日志时间戳 echo " 跳过(需要完整会话,后面用真机验证)" echo echo "════════ 5. 结论 ════════" if [ "$ok" -ge 3 ]; then echo " ✓ 60 秒长轮询能在隧道上跑通,可以改成这个值" else echo " ✗ 60 秒撑不住,回滚到 15 秒" cp -a "$BACKUP" "$SVC" systemctl daemon-reload systemctl restart lanremote-relay echo " 已回滚" fi echo echo " 服务端设定现在是: $(grep -o 'RELAY_POLL=[0-9]*' "$SVC")" echo " 日志: $(tail -30 /root/lanremote-relay/relay.log | grep '长轮询' | tail -1)" echo echo "════════ 6. 清掉临时设备 ════════" KEY=$(cat /root/lanremote-relay/data/admin_key.txt 2>/dev/null) curl -s --max-time 20 -X POST "$LOCAL/v1/admin/delete" -H "X-Admin: $KEY" \ -H 'Content-Type: application/json' -d "{\"deviceId\":\"$DEV\"}" | head -c 80 echo