# -*- coding: utf-8 -*- r'''深挖三件事: 1. 那个 `listen 80 default_server; server_name _;` 是谁的配置 2. 下午到底是什么时候断的(监控 / journal 能不能看出) 3. 现在从公网看,服务是不是真的稳定 == 为什么盯着那个 default_server == nginx 里同一个端口**只能有一个 default_server**。如果有一个来路不明的 `server_name _; listen 80 default_server;`: * 用 IP 直接访问(`http://<服务器IP>/`)会落到**它**上面, 而不是我们的站点 —— 这正好能解释"网站不稳定"的错觉 (有时对有时不对,取决于走的是域名还是 IP) * 它也可能是 1Panel 之类装的,占了位置 == 为什么要查监控 == 我们有个 `ykxmz-monitor.timer` 每 60 秒检查一次公网。 如果下午真的断了,它的日志里应该有"探测失败"的记录 —— **那是判断"断了几分钟"最直接的证据**(比事后猜准得多)。 ''' from __future__ import annotations import sys from pathlib import Path ROOT = Path(__file__).resolve().parent.parent sys.path.insert(0, str(ROOT / "_build")) from lssh import run # noqa: E402 REMOTE = r''' echo "==== 1. default_server 是谁配的 ====" sudo grep -rln "default_server" /etc/nginx/ 2>/dev/null | while read f; do echo " 文件: $f" grep -n "default_server" "$f" | sed 's/^/ /' done echo echo " --- 那个文件完整内容(如果是 sites-enabled 里没链的,看 sites-available)---" sudo ls -la /etc/nginx/sites-enabled/ /etc/nginx/conf.d/ 2>/dev/null | sed 's/^/ /' echo echo " --- /etc/nginx/nginx.conf 里的 include ---" sudo grep -nE "include|default_server" /etc/nginx/nginx.conf 2>/dev/null | sed 's/^/ /' echo echo "==== 2. 用 IP 直接访问会到哪 ====" echo " http://127.0.0.1/ (不带 Host):" curl -s -o /dev/null -w " -> %{http_code} %{size_download} 字节\n" --max-time 10 http://127.0.0.1/ || true echo " http://127.0.0.1/ 带 Host: yk.xxmxxs.top:" curl -s -o /dev/null -w " -> %{http_code} %{size_download} 字节\n" --max-time 10 -H "Host: yk.xxmxxs.top" http://127.0.0.1/ || true echo echo "==== 3. 监控日志:下午有没有探测失败 ====" echo " --- 今天的监控日志 ---" sudo journalctl -u ykxmz-monitor --since "today" --no-pager 2>/dev/null | tail -40 | sed 's/^/ /' || echo " (没有日志)" echo echo " --- 报告文件 ---" sudo ls -la /root/ykxmz-rescue* /var/log/ykxmz* 2>/dev/null | sed 's/^/ /' || echo " (没有报告文件)" echo echo "==== 4. 系统有没有重启 / 服务有没有停过 ====" echo " --- 本次开机时间 ---" uptime -s | sed 's/^/ /' echo " --- nginx 进程启动时间 ---" ps -o pid,lstart,etimes -p $(pgrep -f "nginx: master" | head -1) 2>/dev/null | sed 's/^/ /' echo " --- relay 进程启动时间 ---" ps -o pid,lstart,etimes -p 114212 2>/dev/null | sed 's/^/ /' echo " --- journal 里 systemd 记录的重启 ---" sudo journalctl --since "today" --no-pager 2>/dev/null | grep -iE "Started|Stopped|Failed|killed|OOM" \ | grep -iE "nginx|ykxmz" | tail -15 | sed 's/^/ /' || echo " (没有)" echo echo "==== 5. 磁盘 / inode ====" df -h / | sed 's/^/ /' df -i / | sed 's/^/ /' echo echo "==== 6. 公网自测(从服务器上打自己)====" for u in https://yk.xxmxxs.top/ https://yk.xxmxxs.top/v1/health http://<服务器IP>/; do printf ' %-42s ' "$u" curl -s -o /dev/null -w "%{http_code} %{time_total}s\n" --max-time 20 "$u" || echo "失败" done ''' def main() -> int: print("=" * 62) print(" 深挖:default_server / 下午的中断 / 稳定性") print("=" * 62) print() out = run(REMOTE, timeout=300, quiet=True) print(out[1] if isinstance(out, tuple) else out) return 0 if __name__ == "__main__": sys.exit(main())