[{"data":1,"prerenderedAt":571},["ShallowReactive",2],{"$fSniTyS0T1nKH1njILj9CTufYWO2lcNSjtJ0ynHxXuBU":3,"$fc3Wdf5mibs6awOtfPkoiwVbv1rH8nV0KqeQLWZrtTwI":53},{"title":4,"description":5,"date":6,"category":7,"readTime":8,"tags":9,"content":20,"_excerpt":21,"_faqs":22,"id":50,"_path":51,"_format":52},"海外 VPS 的 CDN 加速与网站防探测架构（Cloudflare + nginx 反代 + WebSocket 后端完整方案）","海外 VPS 部署 WebSocket\u002FAPI 服务后，如何用 Cloudflare CDN 加速并隐藏真实 IP、防止端口扫描与指纹识别？本文给出 nginx 反向代理 + Origin 证书 + WebSocket 转发的完整架构方案，附可直接复用的配置步骤与实测经验，帮你把业务安全地跑在海外服务器上。","2026-06-14","网络工具","10 分钟",[10,11,12,13,14,15,16,17,18,19],"Cloudflare","nginx","反向代理","WebSocket","CDN 加速","网站防探测","VPS 安全","端口扫描","指纹识别","Origin 证书","\u003Ch1>海外 VPS 的 CDN 加速与网站防探测架构（Cloudflare + nginx 反代 + WebSocket 后端完整方案）\u003C\u002Fh1>\n\u003Cblockquote>\n\u003Cp>\u003Cstrong>核心结论\u003C\u002Fstrong>：海外 VPS 一旦暴露真实 IP，会被全球的端口扫描器（Shodan、Censys、ZoomEye）持续探测，443 端口上的服务指纹会被识别收录。\u003Cstrong>正确做法是把所有流量套上 Cloudflare CDN 隐藏真实 IP，再用 nginx 反向代理做&quot;防探测&quot;——外部扫描器看到的是普通博客 \u002F 静态站点，真正的业务服务（WebSocket \u002F API）只跑在 127.0.0.1 上、永远不对外暴露\u003C\u002Fstrong>。本文给出一套从零到一的完整部署方案，\u003Cstrong>适用所有需要保护 VPS 真实 IP 的场景\u003C\u002Fstrong>（个人项目、SaaS、API 服务、实时通信后端等）。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Cstrong>3 分钟摘要\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>VPS 真实 IP 暴露后，会被扫描器 24\u002F7 探测，443 端口指纹泄露\u003C\u002Fli>\n\u003Cli>用 Cloudflare CDN \u003Cstrong>隐藏真实 VPS IP\u003C\u002Fstrong>（免费方案）\u003C\u002Fli>\n\u003Cli>真实 WebSocket \u002F API 服务跑在 \u003Ccode>127.0.0.1\u003C\u002Fcode> 的非标准端口，\u003Cstrong>永不对外暴露\u003C\u002Fstrong>\u003C\u002Fli>\n\u003Cli>nginx 终结 TLS + 转发 WebSocket；非业务路径返回假博客\u003C\u002Fli>\n\u003Cli>外部扫描器看到的是 &quot;一个普通的 HTTPS 博客&quot;，无法识别真实服务\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>实测环境\u003C\u002Fstrong>：RackNerd VPS（Ubuntu 22.04）+ Node.js（\u003Ccode>ws\u003C\u002Fcode> 库） + nginx 1.18 + Cloudflare 免费版\n\u003Cstrong>适用场景\u003C\u002Fstrong>：海外 VPS 上跑 WebSocket 后端 \u002F API 服务 \u002F 实时通信，需要隐藏真实 IP、防止指纹探测\n\u003Cstrong>最终效果\u003C\u002Fstrong>：VPS 真实 IP 永不暴露，对外只有一个 Cloudflare CDN 节点，扫描器看到的 443 端口是普通博客\u003C\u002Fp>\n\u003Chr>\n\u003Ch2>一、问题背景\u003C\u002Fh2>\n\u003Cp>从 RackNerd 买了一台美国 VPS，IP \u003Ccode>104.223.xxx.xxx\u003C\u002Fcode>，准备在上面跑一个 WebSocket 实时通知服务。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>异常表现\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>服务刚上线，端口扫描器（Censys \u002F Shodan）几小时内就把 443 端口的指纹收录了\u003C\u002Fli>\n\u003Cli>收到一堆来源不明的 HTTPS 探测请求，识别出 &quot;非标准 WebSocket 服务&quot;\u003C\u002Fli>\n\u003Cli>真实 IP 直接暴露在 DNS A 记录里 → 任何人都能绕过 CDN 直连 VPS\u003C\u002Fli>\n\u003Cli>VPS 频繁收到自动化探测流量，\u003Cstrong>服务指纹被识别 → 容易被针对性攻击或封禁\u003C\u002Fstrong>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>结论\u003C\u002Fstrong>：VPS 真实 IP + 业务端口一旦直接暴露在全球互联网上，\u003Cstrong>被扫描是必然的、被指纹识别是早晚的\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>正确做法\u003C\u002Fstrong>：\u003Cstrong>让所有流量走 Cloudflare CDN，真实 IP 不再出现在 DNS 里\u003C\u002Fstrong>；\u003Cstrong>业务服务只跑在 127.0.0.1 上\u003C\u002Fstrong>，对外不可见；\u003Cstrong>nginx 在公网 443 终结 TLS、转发到内部服务\u003C\u002Fstrong>，同时给扫描器看一个假博客。\u003C\u002Fp>\n\u003Chr>\n\u003Ch2>二、最终架构\u003C\u002Fh2>\n\u003Cpre>\u003Ccode>┌────────────────────────────────────────┐\n│  客户端（浏览器 \u002F 移动 App）            │\n│   业务域名: app.example.com            │\n│   访问 \u002Fapi 或 \u002Fws 走 WebSocket        │\n└─────────────┬──────────────────────────┘\n              │  TLS 443（看起来是普通 HTTPS）\n              ▼\n┌────────────────────────────────────────┐\n│  Cloudflare Edge（全球 CDN 节点）       │\n│   - 隐藏真实 VPS IP                     │\n│   - 全球边缘加速                        │\n│   - 缓解端口扫描 \u002F 指纹识别             │\n└─────────────┬──────────────────────────┘\n              │  TLS 443（CF 回源）\n              ▼\n┌────────────────────────────────────────┐\n│  VPS nginx (0.0.0.0:443)               │\n│   路径 \u002Fws   → 127.0.0.1:10000 → 后端  │\n│   其他路径  → \u002Fvar\u002Fwww\u002Fsite (假博客)    │\n└─────────────┬──────────────────────────┘\n              │\n              ▼\n┌────────────────────────────────────────┐\n│  Node.js WebSocket 后端                 │\n│   监听 127.0.0.1:10000                  │\n│   永不对外暴露                           │\n└────────────────────────────────────────┘\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>三层防护\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>CF CDN\u003C\u002Fstrong> — 客户端只看到 CF 节点，\u003Cstrong>永远看不到 VPS IP\u003C\u002Fstrong>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>nginx 反代\u003C\u002Fstrong> — 端口扫描器看到的是普通博客，\u003Cstrong>看不到真实业务服务\u003C\u002Fstrong>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>127.0.0.1 监听\u003C\u002Fstrong> — 业务服务只对内网可见，\u003Cstrong>公网完全无法直连\u003C\u002Fstrong>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Chr>\n\u003Ch2>三、前置准备\u003C\u002Fh2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>项目\u003C\u002Fth>\n\u003Cth>说明\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>域名\u003C\u002Ftd>\n\u003Ctd>自己的域名（已在 Cloudflare 接入，能改 NS）\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>VPS\u003C\u002Ftd>\n\u003Ctd>任意海外 VPS（本文用 RackNerd Ubuntu 22.04）\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Node.js 18+\u003C\u002Ftd>\n\u003Ctd>VPS 上已装好（用于跑 WebSocket 后端）\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>nginx\u003C\u002Ftd>\n\u003Ctd>VPS 上已装好（TLS 终结 + 反向代理）\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>\u003Cstrong>本文用到的占位符\u003C\u002Fstrong>（实际配置时替换成自己的）：\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>占位符\u003C\u002Fth>\n\u003Cth>含义\u003C\u002Fth>\n\u003Cth>示例\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>&lt;域名&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>CF 上接入的域名\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>qzz.io\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>app.&lt;域名&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>业务子域\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>app.qzz.io\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>&lt;VPS_IP&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>VPS 真实 IP\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>104.223.xxx.xxx\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>&lt;WS_PORT&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>内部 WebSocket 端口\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>10000\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Chr>\n\u003Ch2>四、VPS 端配置\u003C\u002Fh2>\n\u003Ch3>4.1 部署 WebSocket 后端（监听 127.0.0.1）\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>用一个最简的 Node.js WebSocket echo 服务作为示例\u003C\u002Fstrong>（生产环境换成你的真实业务服务）：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">mkdir -p \u002Fopt\u002Fwsapp &amp;&amp; cd \u002Fopt\u002Fwsapp\ncat &gt; package.json &lt;&lt;&#39;EOF&#39;\n{\n  &quot;name&quot;: &quot;wsapp&quot;,\n  &quot;version&quot;: &quot;1.0.0&quot;,\n  &quot;type&quot;: &quot;module&quot;,\n  &quot;dependencies&quot;: { &quot;ws&quot;: &quot;^8.18.0&quot; }\n}\nEOF\nnpm install\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cpre>\u003Ccode class=\"language-bash\">cat &gt; \u002Fopt\u002Fwsapp\u002Fserver.mjs &lt;&lt;&#39;EOF&#39;\nimport { WebSocketServer } from &#39;ws&#39;\n\n\u002F\u002F 关键:只监听 127.0.0.1,公网完全无法直连\nconst wss = new WebSocketServer({ host: &#39;127.0.0.1&#39;, port: 10000 })\n\nwss.on(&#39;connection&#39;, (ws) =&gt; {\n  console.log(&#39;client connected&#39;)\n  ws.on(&#39;message&#39;, (data) =&gt; {\n    \u002F\u002F 业务逻辑:这里换成你的真实处理\n    ws.send(`echo: ${data.toString()}`)\n  })\n  ws.on(&#39;close&#39;, () =&gt; console.log(&#39;client disconnected&#39;))\n})\n\nconsole.log(&#39;WebSocket server running on ws:\u002F\u002F127.0.0.1:10000&#39;)\nEOF\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>用 systemd 管理\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">cat &gt; \u002Fetc\u002Fsystemd\u002Fsystem\u002Fwsapp.service &lt;&lt;&#39;EOF&#39;\n[Unit]\nDescription=WebSocket Backend\nAfter=network.target\n\n[Service]\nType=simple\nUser=root\nWorkingDirectory=\u002Fopt\u002Fwsapp\nExecStart=\u002Fusr\u002Fbin\u002Fnode \u002Fopt\u002Fwsapp\u002Fserver.mjs\nRestart=always\nRestartSec=3\n\n[Install]\nWantedBy=multi-user.target\nEOF\n\nsystemctl daemon-reload\nsystemctl enable --now wsapp\nsystemctl status wsapp\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>验证\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">ss -tlnp | grep 10000\n# 期望看到:127.0.0.1:10000  (必须是 127.0.0.1,不是 0.0.0.0)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>4.2 生成 Cloudflare Origin Certificate\u003C\u002Fh3>\n\u003Cp>CF 控制台 → \u003Cstrong>SSL\u002FTLS\u003C\u002Fstrong> → \u003Cstrong>Origin Server\u003C\u002Fstrong> → \u003Cstrong>Create Certificate\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Hostname：填 \u003Ccode>app.&lt;域名&gt;\u003C\u002Fcode>（比如 \u003Ccode>app.qzz.io\u003C\u002Fcode>）\u003C\u002Fli>\n\u003Cli>Validity：\u003Ccode>15 years\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>点 \u003Cstrong>Create\u003C\u002Fstrong>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>复制生成的两段内容：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>Certificate\u003C\u002Fcode> 框内容（含 \u003Ccode>-----BEGIN CERTIFICATE-----\u003C\u002Fcode>）→ 存到 VPS \u003Ccode>\u002Fetc\u002Fssl\u002Fcf\u002Fcert.pem\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>Private key\u003C\u002Fcode> 框内容（含 \u003Ccode>-----BEGIN PRIVATE KEY-----\u003C\u002Fcode>）→ 存到 VPS \u003Ccode>\u002Fetc\u002Fssl\u002Fcf\u002Fkey.pem\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>在 VPS 上执行：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">mkdir -p \u002Fetc\u002Fssl\u002Fcf\nnano \u002Fetc\u002Fssl\u002Fcf\u002Fcert.pem    # 粘贴证书内容,Ctrl+O 保存,Ctrl+X 退出\nnano \u002Fetc\u002Fssl\u002Fcf\u002Fkey.pem     # 粘贴私钥内容\nchmod 644 \u002Fetc\u002Fssl\u002Fcf\u002Fcert.pem\nchmod 600 \u002Fetc\u002Fssl\u002Fcf\u002Fkey.pem\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>4.3 配置 Cloudflare 加密模式和 WebSocket\u003C\u002Fh3>\n\u003Cp>CF 控制台：\u003C\u002Fp>\n\u003Cp>\u003Cstrong>SSL\u002FTLS → Overview\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>加密模式选 \u003Cstrong>\u003Ccode>完整 (严格)\u003C\u002Fcode>\u003C\u002Fstrong>（不要选&quot;灵活&quot;，否则 CF 到源站不加密，nginx 收不到 TLS 握手）\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Network\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>WebSockets\u003C\u002Fstrong> → \u003Cstrong>\u003Ccode>On\u003C\u002Fcode>\u003C\u002Fstrong>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>4.4 在 Cloudflare 添加 DNS 记录\u003C\u002Fh3>\n\u003Cp>CF 控制台 → \u003Cstrong>DNS\u003C\u002Fstrong> → \u003Cstrong>Records\u003C\u002Fstrong> → \u003Cstrong>+ Add record\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>字段\u003C\u002Fth>\n\u003Cth>值\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>Type\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>A\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Name\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>app\u003C\u002Fcode>（子域名前缀，最终域名是 \u003Ccode>app.&lt;域名&gt;\u003C\u002Fcode>）\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>IPv4 address\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;VPS_IP&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Proxy status\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>\u003Ccode>Proxied\u003C\u002Fcode>（橙色云朵）\u003C\u002Fstrong> ← 必须选这个\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>TTL\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>Auto\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>保存后验证（Windows PowerShell）：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-powershell\">nslookup app.&lt;域名&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>期望返回 CF 的 IP\u003C\u002Fstrong>（\u003Ccode>104.21.x.x\u003C\u002Fcode> \u002F \u003Ccode>172.67.x.x\u003C\u002Fcode> 等），\u003Cstrong>不是 VPS IP\u003C\u002Fstrong>。如果返回 VPS IP，说明橙色云朵没开。\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>⚠️ \u003Cstrong>这一步是关键\u003C\u002Fstrong>：DNS 显示 CF IP 而不是 VPS IP，意味着端口扫描器通过 DNS 查不到真实 VPS，\u003Cstrong>真实 IP 被有效隐藏\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch3>4.5 验证：先单独测 CF → VPS → 后端链路\u003C\u002Fh3>\n\u003Cp>在写 nginx 之前，先确认 CF → VPS → 10000 端口的链路通：\u003C\u002Fp>\n\u003Cp>\u003Cstrong>临时直接用 nginx listen 10000 转发测试\u003C\u002Fstrong>（如果不想折腾，可以跳过这一步直接到 4.6）：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 用 curl 从 VPS 内部测试 WebSocket 后端\ncurl.exe --include \\\n  --no-buffer \\\n  --header &quot;Connection: Upgrade&quot; \\\n  --header &quot;Upgrade: websocket&quot; \\\n  --header &quot;Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==&quot; \\\n  --header &quot;Sec-WebSocket-Version: 13&quot; \\\n  http:\u002F\u002F127.0.0.1:10000\u002F\n# 期望:HTTP\u002F1.1 101 Switching Protocols\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>4.6 安装 nginx\u003C\u002Fh3>\n\u003Cp>VPS 上（如果还没装）：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">apt update &amp;&amp; apt install -y nginx\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\n\u003Cp>⚠️ 注意是 \u003Ccode>apt install\u003C\u002Fcode> 不是 \u003Ccode>install\u003C\u002Fcode>（常见笔误）。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch3>4.7 写&quot;防探测&quot;展示站\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>关键思路\u003C\u002Fstrong>：让端口扫描器访问你的域名时，看到的是一个\u003Cstrong>普通博客\u003C\u002Fstrong>——而不是 WebSocket 服务。\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">mkdir -p \u002Fvar\u002Fwww\u002Fsite\ncat &gt; \u002Fvar\u002Fwww\u002Fsite\u002Findex.html &lt;&lt;&#39;EOF&#39;\n&lt;!DOCTYPE html&gt;\n&lt;html lang=&quot;en&quot;&gt;\n&lt;head&gt;\n    &lt;meta charset=&quot;UTF-8&quot;&gt;\n    &lt;title&gt;My Notes&lt;\u002Ftitle&gt;\n    &lt;style&gt;\n        body { font-family: -apple-system, sans-serif; max-width: 720px; margin: 40px auto; padding: 0 20px; color: #333; }\n        h1 { border-bottom: 1px solid #eee; padding-bottom: 10px; }\n        .post { margin: 20px 0; }\n        .date { color: #999; font-size: 0.9em; }\n    &lt;\u002Fstyle&gt;\n&lt;\u002Fhead&gt;\n&lt;body&gt;\n    &lt;h1&gt;My Notes&lt;\u002Fh1&gt;\n    &lt;div class=&quot;post&quot;&gt;\n        &lt;h2&gt;Hello, world&lt;\u002Fh2&gt;\n        &lt;p class=&quot;date&quot;&gt;2026-01-15&lt;\u002Fp&gt;\n        &lt;p&gt;Just a personal blog. Nothing to see here.&lt;\u002Fp&gt;\n    &lt;\u002Fdiv&gt;\n    &lt;div class=&quot;post&quot;&gt;\n        &lt;h2&gt;About&lt;\u002Fh2&gt;\n        &lt;p&gt;This is my personal site. Drop me a line if you want to chat.&lt;\u002Fp&gt;\n    &lt;\u002Fdiv&gt;\n&lt;\u002Fbody&gt;\n&lt;\u002Fhtml&gt;\nEOF\n\ncat &gt; \u002Fvar\u002Fwww\u002Fsite\u002Frobots.txt &lt;&lt;&#39;EOF&#39;\nUser-agent: *\nDisallow: \u002Fadmin\u002F\nDisallow: \u002Fprivate\u002F\nAllow: \u002F\nEOF\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>4.8 写 nginx 配置\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">cat &gt; \u002Fetc\u002Fnginx\u002Fconf.d\u002Fapp.conf &lt;&lt;&#39;EOF&#39;\n# 默认 server:处理无 SNI \u002F 端口扫描请求(防止指纹识别)\nserver {\n    listen 443 ssl http2 default_server;\n    server_name _;\n\n    ssl_certificate     \u002Fetc\u002Fssl\u002Fcf\u002Fcert.pem;\n    ssl_certificate_key \u002Fetc\u002Fssl\u002Fcf\u002Fkey.pem;\n    ssl_protocols       TLSv1.2 TLSv1.3;\n\n    root  \u002Fvar\u002Fwww\u002Fsite;\n    index index.html;\n\n    location \u002F {\n        try_files $uri $uri\u002F \u002Findex.html;\n    }\n}\n\n# 真实业务:匹配 app.&lt;域名&gt;\nserver {\n    listen 443 ssl http2;\n    server_name app.&lt;域名&gt;;\n\n    ssl_certificate     \u002Fetc\u002Fssl\u002Fcf\u002Fcert.pem;\n    ssl_certificate_key \u002Fetc\u002Fssl\u002Fcf\u002Fkey.pem;\n    ssl_protocols       TLSv1.2 TLSv1.3;\n    ssl_ciphers         HIGH:!aNULL:!MD5;\n\n    root  \u002Fvar\u002Fwww\u002Fsite;\n    index index.html;\n\n    # WebSocket 路径 → 后端服务\n    location \u002Fws {\n        proxy_pass http:\u002F\u002F127.0.0.1:10000;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection &quot;upgrade&quot;;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_read_timeout 3600s;\n    }\n\n    # 默认:返回防探测展示站\n    location \u002F {\n        try_files $uri $uri\u002F \u002Findex.html;\n    }\n}\n\n# HTTP → HTTPS 重定向\nserver {\n    listen 80;\n    server_name app.&lt;域名&gt;;\n    return 301 https:\u002F\u002F$host$request_uri;\n}\n\n# 80 端口 default_server(防止端口扫描暴露)\nserver {\n    listen 80 default_server;\n    server_name _;\n    root \u002Fvar\u002Fwww\u002Fsite;\n    index index.html;\n    location \u002F {\n        try_files $uri $uri\u002F \u002Findex.html;\n    }\n}\nEOF\n\n# 删掉 nginx 默认站(避免冲突)\nrm -f \u002Fetc\u002Fnginx\u002Fsites-enabled\u002Fdefault\n\n# 检查 + 启动\nnginx -t\nsystemctl enable --now nginx\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>4.9 验证\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 1. 端口监听\nss -tlnp | grep -E &#39;:80|:443|:10000&#39;\n# 期望:\n#   nginx 在 *:80、*:443\n#   wsapp 在 127.0.0.1:10000(必须是 127.0.0.1,不是 0.0.0.0)\n\n# 2. 域名访问展示站\ncurl.exe -sI https:\u002F\u002Fapp.&lt;域名&gt;\u002F\n# 期望:HTTP\u002F2 200\n\n# 3. 看展示站内容\ncurl.exe -s https:\u002F\u002Fapp.&lt;域名&gt;\u002F | findstr &quot;My Notes&quot;\n# 期望:能找到 My Notes 字样\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2>五、客户端连接示例\u003C\u002Fh2>\n\u003Ch3>5.1 浏览器 WebSocket 客户端\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-html\">&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n&lt;body&gt;\n  &lt;script&gt;\n    const ws = new WebSocket(&#39;wss:\u002F\u002Fapp.&lt;域名&gt;\u002Fws&#39;)\n    ws.onopen = () =&gt; {\n      console.log(&#39;connected&#39;)\n      ws.send(&#39;hello from browser&#39;)\n    }\n    ws.onmessage = (e) =&gt; console.log(&#39;received:&#39;, e.data)\n    ws.onerror = (e) =&gt; console.error(&#39;error:&#39;, e)\n  &lt;\u002Fscript&gt;\n&lt;\u002Fbody&gt;\n&lt;\u002Fhtml&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>5.2 Node.js WebSocket 客户端\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-javascript\">import WebSocket from &#39;ws&#39;\n\nconst ws = new WebSocket(&#39;wss:\u002F\u002Fapp.&lt;域名&gt;\u002Fws&#39;)\n\nws.on(&#39;open&#39;, () =&gt; {\n  console.log(&#39;connected&#39;)\n  ws.send(&#39;hello from node&#39;)\n})\n\nws.on(&#39;message&#39;, (data) =&gt; {\n  console.log(&#39;received:&#39;, data.toString())\n})\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>5.3 验证全链路\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 用 websocat 测(推荐)\nnpm install -g websocat\nwebsocat wss:\u002F\u002Fapp.&lt;域名&gt;\u002Fws\n# 试着发:hello world\n# 期望:收到 echo: hello world\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>浏览器访问：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>https:\u002F\u002Fapp.&lt;域名&gt;\u002F\u003C\u002Fcode> → 应该看到展示站\u003C\u002Fli>\n\u003Cli>\u003Ccode>https:\u002F\u002Fapp.&lt;域名&gt;\u002Fws\u003C\u002Fcode> → WebSocket 连接成功\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch2>六、故障排查\u003C\u002Fh2>\n\u003Ch3>6.1 浏览器报 \u003Ccode>HTTP 521\u003C\u002Fcode>\u003C\u002Fh3>\n\u003Cp>CF 连不上 VPS。\u003Cstrong>在 VPS 上\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">ss -tlnp | grep 443\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cul>\n\u003Cli>看不到任何 443 监听 → nginx 没起来 → \u003Ccode>systemctl restart nginx\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>看到其他服务在 443 → 杀掉那个服务后重启 nginx\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>6.2 浏览器报 \u003Ccode>HTTP 502\u003C\u002Fcode>\u003C\u002Fh3>\n\u003Cp>nginx 起来了但连不上后端：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">ss -tlnp | grep 10000\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>看不到 \u003Ccode>127.0.0.1:10000\u003C\u002Fcode> → 后端没在 10000 监听 → \u003Ccode>systemctl status wsapp\u003C\u002Fcode> 看日志\u003C\u002Fp>\n\u003Ch3>6.3 WebSocket 连接显示 Timeout\u003C\u002Fh3>\n\u003Cp>按顺序检查：\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cp>\u003Cstrong>域名解析\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-powershell\">nslookup app.&lt;域名&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>必须是 CF IP，不能是 VPS IP。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>\u003Cstrong>CF SSL 模式\u003C\u002Fstrong>：必须是 \u003Ccode>完整 (严格)\u003C\u002Fcode>，不能是 \u003Ccode>灵活\u003C\u002Fcode>。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>\u003Cstrong>CF WebSockets\u003C\u002Fstrong>：必须是 \u003Ccode>On\u003C\u002Fcode>。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>\u003Cstrong>nginx 配置\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">nginx -t\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>配置语法必须通过。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>\u003Cstrong>路径是否对\u003C\u002Fstrong>：客户端 \u003Ccode>\u002Fws\u003C\u002Fcode> 和 nginx \u003Ccode>location \u002Fws\u003C\u002Fcode> 必须完全一致。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>6.4 nginx 启动报 \u003Ccode>bind() to 0.0.0.0:443 failed (98: Unknown error)\u003C\u002Fcode>\u003C\u002Fh3>\n\u003Cp>443 端口被占。先确认没有其他服务在 443：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">ss -tlnp | grep 443\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>看到其他服务 → 杀掉该服务 → \u003Ccode>systemctl restart nginx\u003C\u002Fcode>\u003C\u002Fp>\n\u003Ch3>6.5 展示站能访问但 \u003Ccode>\u002Fws\u003C\u002Fcode> 报 400\u003C\u002Fh3>\n\u003Cp>nginx 转发到后端的配置出问题：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>路径 \u003Ccode>\u002Fws\u003C\u002Fcode> 必须跟 nginx \u003Ccode>location \u002Fws\u003C\u002Fcode> 完全一致\u003C\u002Fli>\n\u003Cli>nginx 配置里 \u003Ccode>Connection &quot;upgrade&quot;\u003C\u002Fcode> 引号必须是英文双引号\u003C\u002Fli>\n\u003Cli>nginx 转发 HTTP\u002F1.1 给后端，后端必须支持 WebSocket 协议升级\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>6.6 Windows PowerShell \u003Ccode>curl\u003C\u002Fcode> 用不了\u003C\u002Fh3>\n\u003Cp>PowerShell 的 \u003Ccode>curl\u003C\u002Fcode> 是 \u003Ccode>Invoke-WebRequest\u003C\u002Fcode> 的别名，参数不一样。\u003Cstrong>用真 curl\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-powershell\">curl.exe -sI https:\u002F\u002Fapp.&lt;域名&gt;\u002F\ncurl.exe -s https:\u002F\u002Fapp.&lt;域名&gt;\u002F | findstr &quot;My Notes&quot;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>或装 Git for Windows 自带 \u003Ccode>curl.exe\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Ch3>6.7 后端服务意外停止\u003C\u002Fh3>\n\u003Cp>\u003Ccode>systemd\u003C\u002Fcode> 配置了 \u003Ccode>Restart=always\u003C\u002Fcode>，服务崩溃会自动重启。手动重启：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">systemctl restart wsapp\njournalctl -u wsapp -f    # 看实时日志\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2>七、日常维护\u003C\u002Fh2>\n\u003Ch3>7.1 看 WebSocket 流量\u003C\u002Fh3>\n\u003Cp>VPS 上：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">tail -f \u002Fvar\u002Flog\u002Fnginx\u002Faccess.log | findstr \u002Fws\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>持续输出 \u003Ccode>GET \u002Fws HTTP\u002F1.1 101 ...\u003C\u002Fcode> 的日志。\u003Cstrong>\u003Ccode>101\u003C\u002Fcode> = WebSocket 升级成功\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003Ch3>7.2 改展示站内容\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">nano \u002Fvar\u002Fwww\u002Fsite\u002Findex.html\nsystemctl reload nginx\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>7.3 加新 WebSocket 服务\u003C\u002Fh3>\n\u003Col>\n\u003Cli>部署新后端：端口 \u003Ccode>10001\u003C\u002Fcode>，监听 \u003Ccode>127.0.0.1\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>nginx 加新转发：\u003Cpre>\u003Ccode class=\"language-nginx\">location \u002Fws2 {\n    proxy_pass http:\u002F\u002F127.0.0.1:10001;\n    proxy_http_version 1.1;\n    proxy_set_header Upgrade $http_upgrade;\n    proxy_set_header Connection &quot;upgrade&quot;;\n    proxy_set_header Host $host;\n    proxy_set_header X-Real-IP $remote_addr;\n    proxy_read_timeout 3600s;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fli>\n\u003Cli>\u003Ccode>systemctl reload nginx\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>客户端连接 \u003Ccode>wss:\u002F\u002Fapp.&lt;域名&gt;\u002Fws2\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>7.4 重启服务\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">systemctl restart nginx\nsystemctl restart wsapp\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>7.5 防火墙\u003C\u002Fh3>\n\u003Cp>UFW 通常 inactive 即可，需要开：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">ufw allow 443\u002Ftcp\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\n\u003Cp>\u003Cstrong>不需要\u003C\u002Fstrong>开 10000 端口的对外规则——后端只在 127.0.0.1 监听，公网访问会被内核直接拒绝。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Chr>\n\u003Ch2>八、关键点回顾\u003C\u002Fh2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>关键点\u003C\u002Fth>\n\u003Cth>错误做法\u003C\u002Fth>\n\u003Cth>正确做法\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>CF DNS 记录\u003C\u002Ftd>\n\u003Ctd>灰色云朵（DNS only）\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>橙色云朵（Proxied）\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>CF SSL 模式\u003C\u002Ftd>\n\u003Ctd>灵活\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>完整 (严格)\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>后端监听地址\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>0.0.0.0:10000\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>\u003Ccode>127.0.0.1:10000\u003C\u002Fcode>\u003C\u002Fstrong>（永远不对外）\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>CF Origin Cert\u003C\u002Ftd>\n\u003Ctd>用 Let&#39;s Encrypt\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>用 CF Origin Cert（15 年）\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>真实 IP 暴露\u003C\u002Ftd>\n\u003Ctd>DNS A 记录直接指向 VPS\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>必须走 CF Proxied 隐藏 IP\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>nginx 公网代理路径\u003C\u002Ftd>\n\u003Ctd>留空 Path\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>\u003Ccode>\u002Fws\u003C\u002Fcode> 走内部服务，\u003Ccode>\u002F\u003C\u002Fcode> 走展示站\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Windows curl\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>curl -sI URL\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>\u003Ccode>curl.exe -sI URL\u003C\u002Fcode>\u003C\u002Fstrong>（带 .exe 后缀）\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>防火墙\u003C\u002Ftd>\n\u003Ctd>开放 10000 端口\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>不开放 10000，后端只在 127.0.0.1\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Chr>\n\u003Ch2>九、最终目录结构\u003C\u002Fh2>\n\u003Cpre>\u003Ccode>VPS 文件结构:\n\u002Fetc\u002Fssl\u002Fcf\u002F\n├── cert.pem              # CF Origin 证书\n└── key.pem               # CF Origin 私钥\n\u002Fvar\u002Fwww\u002Fsite\u002F\n├── index.html            # 防探测展示站\n└── robots.txt\n\u002Fetc\u002Fnginx\u002Fconf.d\u002F\n└── app.conf              # nginx 反代配置\n\u002Fopt\u002Fwsapp\u002F\n├── package.json          # Node.js 依赖\n└── server.mjs            # WebSocket 后端服务\n\u002Fetc\u002Fsystemd\u002Fsystem\u002F\n└── wsapp.service         # systemd 服务管理\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2>十、写在最后\u003C\u002Fh2>\n\u003Cp>整套方案的核心思路：\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>永远不要直连 VPS IP\u003C\u002Fstrong>（被扫描器收录、指纹识别、被定向攻击是必然的）\u003C\u002Fli>\n\u003Cli>\u003Cstrong>所有公网流量套上 Cloudflare CDN\u003C\u002Fstrong>（隐藏 IP + 全球加速）\u003C\u002Fli>\n\u003Cli>\u003Cstrong>业务服务只跑在 127.0.0.1\u003C\u002Fstrong>（公网完全不可达，攻击者即便知道 VPS IP 也连不到）\u003C\u002Fli>\n\u003Cli>\u003Cstrong>nginx 终结 TLS + 转发到内部\u003C\u002Fstrong>（端口扫描器看到的是静态博客）\u003C\u002Fli>\n\u003Cli>\u003Cstrong>展示站 + 业务服务并行\u003C\u002Fstrong>（同一域名不同路径，让流量看起来&quot;正常&quot;）\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>这样就实现了：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>VPS 真实 IP 永不暴露 ✅\u003C\u002Fli>\n\u003Cli>全球任何地区用户访问都很快（CDN 加速）✅\u003C\u002Fli>\n\u003Cli>端口扫描器看到的 443 端口是普通博客 ✅\u003C\u002Fli>\n\u003Cli>业务服务（WebSocket \u002F API）只在内部运行 ✅\u003C\u002Fli>\n\u003Cli>日常维护只需要改 nginx + 重启后端服务 ✅\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch2>常见问题 FAQ\u003C\u002Fh2>\n\u003Ch3>为什么 VPS 一上线就被扫描？\u003C\u002Fh3>\n\u003Cp>VPS 的 IP 段通常被\u003Cstrong>商业扫描器\u003C\u002Fstrong>（Shodan、Censys、ZoomEye、BinaryEdge）\u003Cstrong>全网段持续扫描\u003C\u002Fstrong>。新分配的 IP 上线后\u003Cstrong>几小时内\u003C\u002Fstrong>就会被收录到这些搜索引擎的数据库。\u003Cstrong>这不是有人针对你，是自动化的全网扫描\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>解决方法\u003C\u002Fstrong>：让真实 IP 不出现在 DNS 里（CF Proxied 模式），扫描器查不到 IP，就无从扫描。\u003C\u002Fp>\n\u003Ch3>Cloudflare 免费版够用吗？\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>够用\u003C\u002Fstrong>。本方案用的就是 CF 免费版：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>DNS 解析：免费\u003C\u002Fli>\n\u003Cli>CDN 加速：免费（全球 300+ 节点）\u003C\u002Fli>\n\u003Cli>Origin Certificate：免费 15 年有效期\u003C\u002Fli>\n\u003Cli>不限流量（公平使用政策）\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>唯一限制：免费版\u003Cstrong>不支持 Spectrum（TCP\u002FUDP 转发）\u003C\u002Fstrong>，但 WebSocket 走 HTTPS 443 端口完全够用。\u003C\u002Fp>\n\u003Ch3>一定要用 RackNerd VPS 吗？其他 VPS 行不行？\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>可以\u003C\u002Fstrong>。本方案对 VPS 厂商没有要求，只要满足：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>系统：Ubuntu 20.04+ \u002F Debian 11+ \u002F CentOS 7+\u003C\u002Fli>\n\u003Cli>能 SSH 登录\u003C\u002Fli>\n\u003Cli>公网带宽 ≥ 1Mbps\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>推荐 VPS 厂商\u003C\u002Fstrong>（按性价比）：RackNerd、CloudCone、BandwagonHost（搬瓦工）、HostDare、Vultr（按小时计费）。\u003C\u002Fp>\n\u003Ch3>nginx &quot;防探测&quot;展示站有什么作用？\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>防指纹识别\u003C\u002Fstrong>。全球端口扫描器会对 Cloudflare CDN 后面的 IP 发起 HTTPS 探测请求：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>如果 443 端口返回的是 \u003Cstrong>WebSocket 服务特征\u003C\u002Fstrong> → 标记为&quot;可疑服务&quot;，被收录到公开数据库\u003C\u002Fli>\n\u003Cli>如果 443 端口返回的是 \u003Cstrong>普通博客 \u002F 静态站\u003C\u002Fstrong> → 当作正常网站，不被关注\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>nginx 展示站就是让&quot;非业务访问者&quot;看到的是博客，业务访问者访问 \u003Ccode>\u002Fws\u003C\u002Fcode> 路径才走内部服务。\u003Cstrong>和正常网站无差别，扫描器无法识别\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003Ch3>业务面板要不要暴露到公网？\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>绝对不要\u003C\u002Fstrong>。任何管理面板（数据库管理、监控、运维工具）必须：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>监听 \u003Ccode>127.0.0.1\u003C\u002Fcode>（仅本机访问）\u003C\u002Fli>\n\u003Cli>端口改非标准（如 \u003Ccode>2053\u003C\u002Fcode>、\u003Ccode>31456\u003C\u002Fcode>）\u003C\u002Fli>\n\u003Cli>设置强密码 + 改默认用户名\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>通过 SSH 端口转发访问：\u003Ccode>ssh -L 2053:127.0.0.1:2053 root@VPS_IP\u003C\u002Fcode>，然后浏览器开 \u003Ccode>http:\u002F\u002F127.0.0.1:2053\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Ch3>这套架构安全吗？\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>对常见威胁（端口扫描、指纹识别、IP 暴露、DDoS 基础防护）非常有效\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>VPS IP 永远不暴露 → 扫描难度极大\u003C\u002Fli>\n\u003Cli>展示站防探测 → 业务指纹不泄露\u003C\u002Fli>\n\u003Cli>Cloudflare CDN 缓冲 → 真实流量被分散到 CF 全球节点\u003C\u002Fli>\n\u003Cli>业务服务 127.0.0.1 监听 → 即便知道 IP 也连不到\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>降低风险的额外建议\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>在 VPS 上做合规业务\u003C\u002Fli>\n\u003Cli>服务不要对外大量分享\u003C\u002Fli>\n\u003Cli>定期轮换 Origin 证书和 WebSocket 路径\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>一个域名能部署多个服务吗？\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>可以\u003C\u002Fstrong>。在 Cloudflare DNS 里加多个 A 记录（如 \u003Ccode>app1\u003C\u002Fcode>、\u003Ccode>app2\u003C\u002Fcode>、\u003Ccode>app3\u003C\u002Fcode>），都指向同一 VPS IP（都走 Proxied）。每个子域配不同 nginx \u003Ccode>server_name\u003C\u002Fcode>，分别反向代理到不同的内部端口：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>app1.&lt;域名&gt;\u003C\u002Fcode> → \u003Ccode>127.0.0.1:10000\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>app2.&lt;域名&gt;\u003C\u002Fcode> → \u003Ccode>127.0.0.1:10001\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>app3.&lt;域名&gt;\u003C\u002Fcode> → \u003Ccode>127.0.0.1:10002\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>每个子域独立管理，互不影响。\u003C\u002Fp>\n\u003Ch3>Origin 证书和 Let&#39;s Encrypt 有什么区别？\u003C\u002Fh3>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>维度\u003C\u002Fth>\n\u003Cth>Let&#39;s Encrypt\u003C\u002Fth>\n\u003Cth>CF Origin Cert\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>签发方\u003C\u002Ftd>\n\u003Ctd>Let&#39;s Encrypt CA\u003C\u002Ftd>\n\u003Ctd>Cloudflare CA\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>有效期\u003C\u002Ftd>\n\u003Ctd>90 天\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>15 年\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>自动续签\u003C\u002Ftd>\n\u003Ctd>✅\u003C\u002Ftd>\n\u003Ctd>❌（但 15 年几乎等于永久）\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>验证方式\u003C\u002Ftd>\n\u003Ctd>公网验证\u003C\u002Ftd>\n\u003Ctd>Cloudflare 内部验证\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>浏览器访问\u003C\u002Ftd>\n\u003Ctd>✅\u003C\u002Ftd>\n\u003Ctd>❌（仅 CF 回源用）\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>\u003Cstrong>本场景必须用 CF Origin Cert\u003C\u002Fstrong>：浏览器访问经过 CF CF，CF 验证 Origin 证书即可，不需要公网信任的 CA 证书。\u003C\u002Fp>\n\u003Ch3>如何监控整个架构的健康度？\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 1. 看 CF → VPS 链路\nsystemctl status nginx\n\n# 2. 看后端服务\nsystemctl status wsapp\njournalctl -u wsapp --since &quot;1 hour ago&quot;\n\n# 3. 看 WebSocket 流量\ntail -f \u002Fvar\u002Flog\u002Fnginx\u002Faccess.log | findstr \u002Fws\n\n# 4. 看 443 端口\nss -tlnp | grep 443\n\n# 5. 看后端端口\nss -tlnp | grep 10000\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>进阶可以用 Prometheus + Grafana 做监控大盘，但小项目上面这些命令够用。\u003C\u002Fp>\n\u003Chr>\n\u003Cblockquote>\n\u003Cp>本文只做技术方案分享，所有配置均为公开的 Cloudflare + nginx 标准用法。请在合法范围内使用，部署合规业务。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n","3 分钟摘要： VPS 真实 IP 暴露后，会被扫描器 24\u002F7 探测，443 端口指纹泄露 用 Cloudflare CDN 隐藏真实 VPS IP（免费方案） 真实 WebSocket \u002F API 服务跑在 127.0.0.1 的非标准端口，永不对外暴露 nginx 终结 TLS + 转发 We",[23,26,29,32,35,38,41,44,47],{"question":24,"answer":25},"为什么 VPS 一上线就被扫描？","VPS 的 IP 段通常被商业扫描器（Shodan、Censys、ZoomEye、BinaryEdge）全网段持续扫描。新分配的 IP 上线后几小时内就会被收录到这些搜索引擎的数据库。这不是有人针对你，是自动化的全网扫描。\n解决方法：让真实 IP 不出现在 DNS 里（CF Proxied 模式），扫描器查不到 IP，就无从扫描。",{"question":27,"answer":28},"Cloudflare 免费版够用吗？","够用。本方案用的就是 CF 免费版：\nDNS 解析：免费\nCDN 加速：免费（全球 300+ 节点）\nOrigin Certificate：免费 15 年有效期\n不限流量（公平使用政策）\n唯一限制：免费版不支持 Spectrum（TCP\u002FUDP 转发），但 WebSocket 走 HTTPS 443 端口完全够用。",{"question":30,"answer":31},"一定要用 RackNerd VPS 吗？其他 VPS 行不行？","可以。本方案对 VPS 厂商没有要求，只要满足：\n系统：Ubuntu 20.04+ \u002F Debian 11+ \u002F CentOS 7+\n能 SSH 登录\n公网带宽 ≥ 1Mbps\n推荐 VPS 厂商（按性价比）：RackNerd、CloudCone、BandwagonHost（搬瓦工）、HostDare、Vultr（按小时计费）。",{"question":33,"answer":34},"nginx \"防探测\"展示站有什么作用？","防指纹识别。全球端口扫描器会对 Cloudflare CDN 后面的 IP 发起 HTTPS 探测请求：\n如果 443 端口返回的是 WebSocket 服务特征 → 标记为\"可疑服务\"，被收录到公开数据库\n如果 443 端口返回的是 普通博客 \u002F 静态站 → 当作正常网站，不被关注\nnginx 展示站就是让\"非业务访问者\"看到的是博客，业务访问者访问 \u002Fws 路径才走内部服务。和正常网站无差别，扫描器无法识别。",{"question":36,"answer":37},"业务面板要不要暴露到公网？","绝对不要。任何管理面板（数据库管理、监控、运维工具）必须：\n监听 127.0.0.1（仅本机访问）\n端口改非标准（如 2053、31456）\n设置强密码 + 改默认用户名\n通过 SSH 端口转发访问：ssh -L 2053:127.0.0.1:2053 root@VPS_IP，然后浏览器开 http:\u002F\u002F127.0.0.1:2053。",{"question":39,"answer":40},"这套架构安全吗？","对常见威胁（端口扫描、指纹识别、IP 暴露、DDoS 基础防护）非常有效：\nVPS IP 永远不暴露 → 扫描难度极大\n展示站防探测 → 业务指纹不泄露\nCloudflare CDN 缓冲 → 真实流量被分散到 CF 全球节点\n业务服务 127.0.0.1 监听 → 即便知道 IP 也连不到\n降低风险的额外建议：\n在 VPS 上做合规业务\n服务不要对外大量分享\n定期轮换 Origin 证书和 WebSocket 路径",{"question":42,"answer":43},"一个域名能部署多个服务吗？","可以。在 Cloudflare DNS 里加多个 A 记录（如 app1、app2、app3），都指向同一 VPS IP（都走 Proxied）。每个子域配不同 nginx server_name，分别反向代理到不同的内部端口：\napp1.\u003C域名> → 127.0.0.1:10000\napp2.\u003C域名> → 127.0.0.1:10001\napp3.\u003C域名> → 127.0.0.1:10002\n每个子域独立管理，互不影响。",{"question":45,"answer":46},"Origin 证书和 Let's Encrypt 有什么区别？","| 维度 | Let's Encrypt | CF Origin Cert |\n|---|---|---|\n| 签发方 | Let's Encrypt CA | Cloudflare CA |\n| 有效期 | 90 天 | 15 年 |\n| 自动续签 | ✅ | ❌（但 15 年几乎等于永久） |\n| 验证方式 | 公网验证 | Cloudflare 内部验证 |\n| 浏览器访问 | ✅ | ❌（仅 CF 回源用） |\n本场景必须用 CF Origin Cert：浏览器访问经过 CF CF，CF 验证 Origin 证书即可，不需要公网信任的 CA 证书。",{"question":48,"answer":49},"如何监控整个架构的健康度？","``bash\n1. 看 CF → VPS 链路\nsystemctl status nginx\n2. 看后端服务\nsystemctl status wsapp\njournalctl -u wsapp --since \"1 hour ago\"\n3. 看 WebSocket 流量\ntail -f \u002Fvar\u002Flog\u002Fnginx\u002Faccess.log | findstr \u002Fws\n4. 看 443 端口\nss -tlnp | grep 443\n5. 看后端端口\nss -tlnp | grep 10000\n``\n进阶可以用 Prometheus + Grafana 做监控大盘，但小项目上面这些命令够用。\n---\n> 本文只做技术方案分享，所有配置均为公开的 Cloudflare + nginx 标准用法。请在合法范围内使用，部署合规业务。","cdn-anti-scan-vps-architecture","\u002Fwriting\u002Fcdn-anti-scan-vps-architecture","md",[54,72,87,105,123,141,157,175,190,208,224,236,251,268,283,300,316,334,350,367,379,394,408,425,439,454,469,484,500,512,526,539,541,553,561],{"id":55,"title":56,"date":57,"category":7,"readTime":58,"tags":59,"_excerpt":70,"_path":71},"github-9-free-open-source-projects","GitHub 上 9 个免费到癫狂的开源神器：AI 配音 \u002F 音乐生成 \u002F 自托管密码 \u002F 跨屏互传","2026-09-16","12 分钟",[60,61,62,63,64,65,66,67,68,69],"GitHub 开源","免费神器","自媒体副业","AI 配音","声音克隆","密码管理","量化交易","VoiceStudio","YuE","LocalSend","AI 配音 \u002F 音乐类（3 个）：VoiceStudio、YuE、VoxCPM——替代 ElevenLabs、Suno，做配音接单 \u002F 定制 BGM 情报 \u002F 交易类（3 个）：TradingAgents、Flowsint、RuView——替代 Bloomberg \u002F Wind \u002F Maltego ","\u002Fwriting\u002Fgithub-9-free-open-source-projects",{"id":73,"title":74,"date":57,"category":75,"readTime":76,"tags":77,"_excerpt":85,"_path":86},"vercel-deployment-blocked-commit-email-mismatch","Vercel 部署被拦截 Deployment Blocked：Git 提交邮箱与 Vercel 账号不匹配的修复方案","开发工具","6 分钟",[78,79,80,81,82,83,84],"Vercel","Git","部署失败","邮箱配置","Deployment Blocked","Hobby Plan","commit author","报错关键词：Deployment Blocked + commit author did not have contributing access + Hobby Plan does not support collaboration for private repositories 根因：Git ","\u002Fwriting\u002Fvercel-deployment-blocked-commit-email-mismatch",{"id":88,"title":89,"date":90,"category":91,"readTime":58,"tags":92,"_excerpt":103,"_path":104},"trustpilot-product-selection-method","Trustpilot 差评选品法：从独立站出海差评里挖掘百万美金机会（附 AI 筛选提示词）","2026-09-10","创业人生",[93,94,95,96,97,98,99,100,101,102],"独立站出海","Trustpilot","选品方法","跨境电商","差评挖掘","AI选品","Facebook广告","Google广告","独立站运营","赚美金","放弃跟爆品：榜单是公开的，你看到的别人也看到，卷到最后比的是资金量和供应链——新手赢不了 差评才是金矿：Trustpilot 上差评基本来自真实购买（没人给自己刷差评），差评多说明订单量大（需求被验证），评分低说明履约差（你的机会） AI 批量筛选：用 Claude\u002FCodex 跑提示词，筛选\"差评","\u002Fwriting\u002Ftrustpilot-product-selection-method",{"id":106,"title":107,"date":108,"category":91,"readTime":109,"tags":110,"_excerpt":121,"_path":122},"awesome-indie-indie-developer-resources-guide","独立开发者赚钱资源大全：awesome-indie 精选 60+ 社区、书籍、工具（GitHub 开源）","2026-09-09","14 分钟",[111,112,113,114,115,116,117,118,119,120],"独立开发者","awesome-indie","资源合集","IndieHackers","副业赚钱","微型创业","被动收入","自举创业","SaaS","开发者赚钱","awesome-indie 是 GitHub 上的独立开发者赚钱资源合集（作者 mezod），覆盖社区、新闻通讯、博客播客、案例研究、会议、书籍、工具、课程 8 大主题，与\"独立开发者如何赚钱\"强相关 社区类先收藏：IndieHackers、Hacker News、r\u002FSideProject、Meg","\u002Fwriting\u002Fawesome-indie-indie-developer-resources-guide",{"id":124,"title":125,"date":108,"category":126,"readTime":127,"tags":128,"_excerpt":139,"_path":140},"investment-most-important-cycle-reflexivity-wisdom","巴菲特芒格力荐的 2 本书 + 索罗斯反身理论：投资最重要的 3 件事（周期 × 认知 × 顺势而为）","交易心得","16 分钟",[129,130,131,132,133,134,135,136,137,138],"投资智慧","周期","霍华德马克思","巴菲特","芒格","索罗斯","反身性","价值投资","趋势投资","顺势而为","3 本经典合一：《投资最重要的事》（霍华德·马克思）+《周期》（霍华德·马克思）+ 索罗斯\"反身性理论\"——巴菲特、芒格都强力推荐 核心母题：万物皆有周期——经济周期、信贷周期、产能周期、房地产周期、情绪周期……周期是自然之道，不可对抗，只能顺从 书 1《投资最重要的事》核心：价值投资是底盘，技术分","\u002Fwriting\u002Finvestment-most-important-cycle-reflexivity-wisdom",{"id":142,"title":143,"date":108,"category":126,"readTime":144,"tags":145,"_excerpt":155,"_path":156},"tiandao-permanent-business-investment-logic","从《天道》看永久值得投资的生意：生存、刺激与繁衍的底层逻辑","15 分钟",[146,147,148,149,150,151,152,136,153,154],"天道","投资逻辑","强势文化","底层需求","基因","丁元英","生意经","消费行业","遥远的救世主","天道的定义：永不改变、永远正的法则确，是世界的底层系统；在《天道》里对应\"神即道，道法自然，如来\" 需求的源头是六感：视觉需求远大于听觉、嗅觉、味觉——人对\"还原真实世界\"的视觉追求永无止境（480p→8K），所以显示行业永远有成长性 黑色家电 vs 白色家电案例：人对温差（24℃ vs 24.1℃","\u002Fwriting\u002Ftiandao-permanent-business-investment-logic",{"id":158,"title":159,"date":160,"category":161,"readTime":144,"tags":162,"_excerpt":173,"_path":174},"payoneer-cross-border-payment-guide","Payoneer派安盈使用全教程：跨境电商与WooCommerce独立站收款提现避坑指南，附万里汇连连PingPong对比","2026-09-03","工具教程",[163,164,165,166,167,168,169,170,171,172],"Payoneer","派安盈","跨境收款","WooCommerce独立站","PayPal提现","万里汇","连连国际","PingPong","Airwallex","Stripe","Payoneer 提供美\u002F欧\u002F英\u002F日\u002F港等地虚拟银行账户，是跨境电商收款的\"资金中枢\"，而非信用卡收单工具 平台卖家（亚马逊、TikTok Shop、Shopee 等）绑定 Payoneer 虚拟账户即可自动收款，这是它的主战场 WooCommerce 独立站有两种用法：达到企业主体和流水门槛可申请","\u002Fwriting\u002Fpayoneer-cross-border-payment-guide",{"id":176,"title":177,"date":178,"category":126,"readTime":144,"tags":179,"_excerpt":188,"_path":189},"eg-limit-up-cant-control-hand","乙二醇连续涨停我逆势做空浮亏120万，期货交易为什么管不住手，读懂损失厌恶才能跟上趋势","2026-09-02",[180,181,182,183,184,185,186,187],"乙二醇期货","管不住手","逆势做空","损失厌恶","处置效应","期货交易心理","趋势交易","仓位管理","美伊战争引爆原油市场，布伦特突破100美元，能化板块整体走强，乙二醇期货连续大涨后涨停至5800元上方 明知趋势向上，我却反手做空乙二醇，开盘即涨停，单笔浮亏120万 \"管不住手\"的根源是四个心理机制：损失厌恶、处置效应、沉没成本谬误、报复性交易 逆势单的本质不是\"做空\"，而是\"拒绝承认自己看错了\"","\u002Fwriting\u002Feg-limit-up-cant-control-hand",{"id":191,"title":192,"date":193,"category":126,"readTime":194,"tags":195,"_excerpt":206,"_path":207},"ancient-du-jing-15-wisdoms-futures-trading","《赌经》千年智慧 × 期货交易：15 大核心心法在现代金融交易中的应用","2026-09-01","18 分钟",[196,197,198,199,200,201,202,203,204,205],"期货交易","交易系统","交易心态","交易纪律","博弈论","资金管理","善赌者","风险控制","古代智慧","交易心法","千年博弈智慧的核心：\"天下万物都离不开博弈，人生无处不博弈\"——交易、转业、选择，本质都是下注 15 大心法的期货对应：(1) 天性 (2) 万物皆博 (3) 相济 (4) 养德 (5) 专一 (6) 休息与好习惯 (7) 静心 (8) 胜机 (9) 料情 (10) 善听 (11) 胜险 (12) ","\u002Fwriting\u002Fancient-du-jing-15-wisdoms-futures-trading",{"id":209,"title":210,"date":193,"category":91,"readTime":58,"tags":211,"_excerpt":222,"_path":223},"information-diet-munger-deep-thinking","每天写 600 字、拒绝短视频、读书走路：芒格的\"反碎片化\"哲学与 3 个实操方法",[212,213,214,215,216,217,218,219,220,221],"信息过载","碎片化","深度思考","查理芒格","注意力管理","个人成长","反碎片化","自我管理","信息减肥","写作","信息过载的本质是\"被动兴奋\"：你不是在\"获取信息\"，你是在被算法训练成\"刷下一条\"的条件反射机器 芒格的\"避免愚蠢\"哲学：\"反过来想，总是反过来想\"——聪明难学，愚蠢容易避免，关键是识别\"什么是会让自己变蠢的事\" 3 个反碎片化方法：(1) 信息减肥——限制信息源、少刷短视频；(2) 用输出取代输入","\u002Fwriting\u002Finformation-diet-munger-deep-thinking",{"id":225,"title":226,"date":227,"category":126,"readTime":109,"tags":228,"_excerpt":234,"_path":235},"futures-sell-art-trailing-stop-profit-take","期货交易\"会买的是徒弟，会卖的才是师傅\"：浮盈守不住的 4 个真相与 5 个系统化解决方案","2026-08-30",[196,229,230,231,198,197,187,199,232,233],"止盈","止损","移动止盈","浮盈","卖出策略","期货交易最隐蔽的失败模式：\"买对、趋势对，但赚不到钱甚至亏钱\"，90% 的交易者死在这里 浮盈 100w 变 70w 的 4 个真相：(1) 急速亏损来不及止损；(2) 高额手续费侵蚀利润；(3) 急速上涨拿不住提前下车；(4) 心理预期失衡导致操作变形 5 个系统化卖出解决方案：(1) 移动止盈（","\u002Fwriting\u002Ffutures-sell-art-trailing-stop-profit-take",{"id":237,"title":238,"date":239,"category":91,"readTime":144,"tags":240,"_excerpt":249,"_path":250},"starter-story-5-acquisition-cases","网站出海必看：Starter Story 上 5 个独立开发者获客案例，把第一批用户从哪来都告诉你了","2026-08-27",[241,242,243,244,245,246,247,119,248],"独立开发","网站出海","Starter Story","获客","Product Hunt","SEO","Build in Public","增长黑客","Starter Story 上 2933 个月入过万美金的小项目，连第一批用户从哪来都告诉你了。深度拆解 Papermark、AudioPen、Bank Statement Converter、ScreenshotOne、Chatbase 五个真实案例的获客路径。","\u002Fwriting\u002Fstarter-story-5-acquisition-cases",{"id":252,"title":253,"date":254,"category":91,"readTime":255,"tags":256,"_excerpt":266,"_path":267},"chinese-rest-shameness-burnout-recovery","中国人为什么不敢停下来：内卷时代的\"休息羞耻\"与 3 个破解方法","2026-08-25","11 分钟",[257,258,259,260,261,262,111,263,264,265],"内卷","休息羞耻","工作焦虑","牛马","停下来","自由职业","心理健康","自我成长","生活平衡","\"玩几天就心慌\"不是意志力问题，是长期被社会时钟驯化后的条件反射 中国式\"内卷\"的本质是横向比较陷阱：不是想赢，是怕输；不是想更富，是怕被落下 \"当牛马心里舒服\"是一种心理代偿机制：用忙碌掩盖存在焦虑，越忙越空虚 停下来\"感觉别人都跑掉了\"是社会比较 + 信息过载的双重错觉，真实世界没人那么关注你 ","\u002Fwriting\u002Fchinese-rest-shameness-burnout-recovery",{"id":269,"title":270,"date":271,"category":161,"readTime":58,"tags":272,"_excerpt":281,"_path":282},"top-10-free-platforms-indie-creators","独立开发者必收藏的 10 个免费平台：从代码托管到内容分发全覆盖","2026-08-13",[241,273,274,275,276,277,278,279,280,111],"免费工具","开源平台","创作者工具","效率工具","GitHub","Figma","F-Droid","Substack","GitHub 不只是代码托管，更是独立开发者的免费简历 + 团队协作 + CI\u002FCD 基础设施 Linux 让独立开发者彻底摆脱\"环境不一致\"的坑，是服务器、Web 项目、AI 训练的事实标准 Wikipedia + Internet Archive 是最被低估的\"研究前哨站\"，能解决 80% 的英","\u002Fwriting\u002Ftop-10-free-platforms-indie-creators",{"id":284,"title":285,"date":271,"category":286,"readTime":58,"tags":287,"_excerpt":298,"_path":299},"fde-quanshu-zongjie","FDE 前沿部署工程师从零入门指南 · 全书总结","技术教程",[288,289,290,291,292,293,294,295,296,297],"FDE","前沿部署工程师","Palantir","企业 AI","部署","范冰","AI 落地","OpenAI","Anthropic","Harvey","FDE · 全书总结 前沿部署工程师（FDE） 从零入门指南 范冰 著 · 基于公开仓库 14 个 Markdown 文件的完整梳理 原书框架参照《增长黑客》方法论体例 01 FDE 是什么？ 一句话定义： 前线部署工程师（Forward Deployed Engineer），是一个驻扎在客户现场、","\u002Fwriting\u002Ffde-quanshu-zongjie",{"id":301,"title":302,"date":303,"category":286,"readTime":127,"tags":304,"_excerpt":314,"_path":315},"90-day-organic-traffic-b2b-factory-seo","90 天靠自然流量做独立站：B2B 工厂 SEO 完整复盘（4 个致命问题 + 4 项整改 + 程序员视角深度补充）","2026-08-12",[305,306,307,96,308,309,310,311,312,313],"独立站","自然流量","B2B 工厂","外贸","SEO 优化","技术 SEO","外链建设","内容营销","谷歌排名","3 分钟摘要： 工厂独立站最常见的 4 个致命问题：关键词错位 \u002F 转化力为零 \u002F 技术 SEO 不到位 \u002F 外链权重为零 针对性 4 项整改：全站关键词重构 \u002F 全盘内容改写 \u002F 深度技术 SEO 修复 \u002F 高质量外链搭建 90 天执行时间表：第 1-30 天（技术修复 + 关键词重挖）\u002F 第 3","\u002Fwriting\u002F90-day-organic-traffic-b2b-factory-seo",{"id":317,"title":318,"date":319,"category":91,"readTime":320,"tags":321,"_excerpt":332,"_path":333},"ai-short-drama-industry-2026","AI 短剧 4 阶段生死局:3 个月一波,90% 承制公司要关,留下的只有 3 种人","2026-07-31","13 分钟",[322,323,324,325,326,327,328,329,330,331],"AI 短剧","短剧","创业复盘","行业分析","红果短剧","抖音短剧","内容创业","投流","出海","TikTok","3 分钟摘要: 4 阶段速览:解说漫剧(2024.6-9)→ 2D 黄金期(11-1 月)→ Seedance 仿真人(春节-4 月)→ 出海 TikTok(现在) 承制公司必死:长沙最大 200 人公司,一天入职 87 人,1 个月后关门,1 亿播放分账不到 10 万 闭门会真相:红果真人剧+AI","\u002Fwriting\u002Fai-short-drama-industry-2026",{"id":335,"title":336,"date":319,"category":91,"readTime":337,"tags":338,"_excerpt":348,"_path":349},"niche-product-overseas-thinking","国内做产品总想服务所有人,海外却专做 1% 小众市场,这是独立开发的真相","9 分钟",[241,339,340,341,342,343,344,345,346,347],"细分市场","小而美","海外产品","独立产品","niche","垂直产品","创业思维","产品哲学","Indiehacker","3 分钟摘要: 国内产品迷思:做一个工具,恨不得覆盖\"18-35 岁全人群\",功能堆到 50+,最后谁都不满意 海外独立开发者哲学:只服务一个明确小群体(Notion 用户\u002F播客主\u002FIndie Hacker),做深做透 1% 市场数学:全球 80 亿人 × 1% × 1% 转化 = 80 万付费用户","\u002Fwriting\u002Fniche-product-overseas-thinking",{"id":351,"title":352,"date":353,"category":161,"readTime":255,"tags":354,"_excerpt":365,"_path":366},"giffgaff-account-terminated-refund-guide","giffgaff 不到 1 月被封号？10 欧元余额退款攻略 + 英国保号卡使用避坑指南","2026-07-29",[355,356,357,358,359,360,361,362,363,364],"giffgaff","英国保号卡","海外手机号","余额退款","漫游政策","公平使用政策","eSIM","出国旅行","国际通信","账户管理","3 分钟摘要： giffgaff 封号邮件里写的 \"final position\" 指的是无法恢复号码和卡片使用权，不意味着可以扣押你的预付费余额 余额退款是常规操作——按 giffgaff 政策，账户终止时未消耗的预存资金应原路退回 提交 Ask an Agent 工单 申请退款，用对英文模板、态","\u002Fwriting\u002Fgiffgaff-account-terminated-refund-guide",{"id":368,"title":369,"date":353,"category":91,"readTime":320,"tags":370,"_excerpt":377,"_path":378},"smart-people-ultimate-arena-financial-markets","聪明人最后都会走向金融市场？10 年程序员的 5 点反驳 + 1 条血泪建议",[371,196,372,373,203,66,374,375,376,111],"金融市场","认知变现","独立思考","趋势跟踪","移动止损","心理博弈","3 分钟摘要： \"金融市场是世界上最公平的战场\"——部分对，但隐藏了 3 个不公平 \"认知变现速度最快\"——部分对，但 90% 的聪明人亏得比上班族还快 \"和全球最聪明的人博弈\"——部分对，但你以为的\"博弈\"是另一种\"被博弈\" \"最残酷的认知审判场\"——完全对，这是 5 点里最真实的一句 \"唯一能燃","\u002Fwriting\u002Fsmart-people-ultimate-arena-financial-markets",{"id":380,"title":381,"date":382,"category":91,"readTime":127,"tags":383,"_excerpt":392,"_path":393},"tiktok-shop-13-products-zero-orders","200 元 AI 跨境课复盘：13 个产品 0 订单，10 年程序员的跨境电商真实踩坑记录","2026-07-22",[96,384,385,386,111,387,388,389,390,391],"AI 跨境","TikTok 小店","避坑指南","副业变现","选品方法论","海外市场调研","供应链","真实复盘","3 分钟摘要： 课程里讲的\"4 大机会\"是真实的——AI 确实放大了小团队的跨境能力 但课程不会告诉你 90% 的卖家死在\"选品\"上——选错品 = 一切努力清零 13 个产品 0 订单的真实原因 = 我犯了跨境电商最经典的 3 个错：选品靠感觉、内容靠 AI 量产、流量靠自然等 跨境电商的隐藏成本是","\u002Fwriting\u002Ftiktok-shop-13-products-zero-orders",{"id":395,"title":396,"date":397,"category":91,"readTime":109,"tags":398,"_excerpt":406,"_path":407},"pieter-levels-one-person-saas","一人 + 一台电脑 + 500 万美金：从 Pieter Levels 看独立开发者的 6 环商业链路（实操玩法版）","2026-07-16",[399,111,400,401,402,403,404,405,342,387],"Pieter Levels","一人公司","海外商业","付费按钮","两周验证法","自动化系统","复购会员","3 分钟摘要： 一人公司不是\"小团队\"，是 \"单人 + 自动化系统\" 的商业形态——一个人 + 一台电脑 + 6 个产品环节 海外用户付费习惯跟国内完全不同：先看页面、再看价格、付款即交付，没有\"私聊逼单\"这一环 第一个核心方法 = \"先做付费按钮，不做大系统\"——24 小时内就能验证真假需求 第二","\u002Fwriting\u002Fpieter-levels-one-person-saas",{"id":409,"title":410,"date":397,"category":161,"readTime":411,"tags":412,"_excerpt":423,"_path":424},"workbuddy-110-office-prompts","WorkBuddy 不会用？110 条能直接干活的办公提示词库 + 5 段式黄金结构","22 分钟",[413,414,415,416,417,418,419,420,421,422],"WorkBuddy","提示词工程","AI 办公","智能办公","提示词库","工作流自动化","提示词模板","AI Agent","办公效率","萝卜哥","3 分钟摘要： 90% 的人用 WorkBuddy 失败的原因 = 只给\"愿望\"、不给\"任务\" 5 段式黄金结构 = 工作对象 + 可用材料 + 具体动作 + 交付物 + 检查规则 核心安全线 = 写入前先给预览（邮件、任务、自动化必须遵守） 11 类 110 条提示词完整覆盖：个人工作台 \u002F 会议","\u002Fwriting\u002Fworkbuddy-110-office-prompts",{"id":426,"title":427,"date":428,"category":286,"readTime":194,"tags":429,"_excerpt":437,"_path":438},"indie-dev-150-seo-strategies","独立开发者 150 个 SEO 策略速查手册：从 0 到 10 万流量的完整作战地图（关键词 \u002F 内容 \u002F 页面 \u002F 技术 \u002F 外链 \u002F AI \u002F 转化）","2026-07-15",[246,111,430,431,432,311,433,434,435,436],"关键词策略","内容策略","技术SEO","AI SEO","GEO","流量增长","转化优化","3 分钟摘要： SEO 7 大模块：关键词（找用户在哪）、内容（接住用户）、页面（让 Google 看得懂）、技术（让 Google 抓得到）、外链（让 Google 信得过）、AI SEO（让 ChatGPT \u002F Perplexity 引用你）、增长（把流量变收入） 关键词策略的核心 = 挖出 1","\u002Fwriting\u002Findie-dev-150-seo-strategies",{"id":440,"title":441,"date":428,"category":91,"readTime":255,"tags":442,"_excerpt":452,"_path":453},"zhongnian-beiye-bailand-fansi","失业 4 年、每天只想摆烂：一个 40 岁中年男人的复盘与自救",[443,444,445,446,447,448,449,450,217,451],"中年危机","摆烂","失业焦虑","副业","赚钱方法","底层逻辑","40岁","怀孕老婆","自我救赎","3 分钟摘要： 摆烂的本质是\"大脑拒绝再接收无效输入\"，不是意志力问题 失业 4 年 = 焦虑的真实来源不是\"没钱\"，是\"看不到确定的现金流\" 噪音型学习 = 看了 100 个博主的\"月入十万\"，一个底层闭环都没跑过 中年人不缺方法、缺打透一个方法的执行力 + 耐住 6-12 个月不冒头的耐心 摆烂","\u002Fwriting\u002Fzhongnian-beiye-bailand-fansi",{"id":455,"title":456,"date":457,"category":91,"readTime":255,"tags":458,"_excerpt":467,"_path":468},"chinese-seller-brand-mindset","中国独立站为什么做不出品牌:有网站不等于有品牌,从中美认知差到品牌资产构建","2026-07-05",[305,459,96,460,461,462,463,464,465,466],"品牌建设","商标注册","品牌资产","Shopify","中国卖家","DTC 品牌","流量套利","美国市场","3 分钟摘要: 中美品牌第一差:中国卖家从\"货\"出发(本月 ROI),美国卖家从\"资产\"出发(三年后品牌值多少钱) 中国独立站的本质是\"换了皮的批发摊位\":有网站,没有品牌;有产品,没有资产;有订单,没有复购理由 美国卖家把商标、域名、社媒账号、品牌名统一视为 品牌资产,在卖爆之前就把这些\"产权\"占","\u002Fwriting\u002Fchinese-seller-brand-mindset",{"id":470,"title":471,"date":457,"category":161,"readTime":8,"tags":472,"_excerpt":482,"_path":483},"google-indexing-api-fast-index","沙盒期 GitHub Pages 提速收录:用 Google Indexing API 24 小时强制收录新文章",[473,474,475,476,477,246,478,479,480,481],"Google Indexing API","GitHub Pages","沙盒期","强制收录","sitemap","Google Search Console","Service Account","googleapis","站长工具","3 分钟摘要: 沙盒期 = Google 对新域名\u002F低权重域名的\"观察期\",普通收录通道排队要 2-4 周 Indexing API 是 Google 官方给新闻站用的快速收录接口,任何类型站点都能用(Google 文档明确说明) 5 步走通:GCP 建项目 → 开 Indexing API → 建","\u002Fwriting\u002Fgoogle-indexing-api-fast-index",{"id":485,"title":486,"date":487,"category":91,"readTime":337,"tags":488,"_excerpt":498,"_path":499},"ai-music-creator-first-album","AI 让我成为音乐创作人：第一张专辑《未乱》与主打歌《鱼肚白》的诞生全流程","2026-06-18",[489,490,491,492,493,494,495,387,496,497],"AI 音乐","Suno","Udio","豆包","Gemini","音乐创作","独立创作","腾讯音乐","专辑发行","AI 把音乐创作的门槛从\"会乐器 + 懂乐理\"降到\"会写主题 + 会挑曲风\"，普通人也能成为音乐创作者 三步走完整路径：AI 写词 → AI 谱曲演唱 → 发行到平台 主流工具组合：豆包 \u002F Gemini（写词）+ Suno \u002F Udio \u002F 谱乐 AI（谱曲演唱） 主打歌《鱼肚白》从第一行歌词到腾","\u002Fwriting\u002Fai-music-creator-first-album",{"id":501,"title":502,"date":487,"category":91,"readTime":337,"tags":503,"_excerpt":510,"_path":511},"kalodata-market-research","如何用 Kalodata 做 TikTok 选品市场调研：10 分钟看懂一个赛道",[504,505,388,506,507,508,509,241,330,387],"Kalodata","TikTok 选品","市场调研","TikTok Shop","类目大盘","联盟达人","3 分钟摘要： 选品失败的 90% 原因不是产品不好，而是赛道没看清就开干 Kalodata 的「类目大盘」是最高效的市场调研入口，单页覆盖六个核心维度 优先选 增长中 + 盘子大 + 竞争分散 + 联盟达人驱动 + $10–30 主流价格带 + 新品占比高 的类目 价格带 $10–$30 是 Ti","\u002Fwriting\u002Fkalodata-market-research",{"id":513,"title":514,"date":487,"category":126,"readTime":337,"tags":515,"_excerpt":524,"_path":525},"kan-da-zuo-xiao-futures-trading","期货「看大做小」趋势交易法：从前辈点拨到实操悟道的完整路径（日线 + 30分钟 + RSI 临界点入场）",[196,516,517,186,518,519,520,521,522,523],"看大做小","多周期共振","日线","30分钟","5分钟","RSI指标","入场点","顺势交易","3 分钟摘要： 看大做小 = 大周期定方向 + 小周期找入场 + RSI 等临界点 周期组合按交易风格选：波段 = 日线 + 30分钟 \u002F 5分钟（本文重点） 大周期判方向三件套：均线排列、高低点结构、关键支撑阻力 小周期入场三件套：回调企稳、K 线反转形态、RSI 临界点 越是简单的事越难执行——","\u002Fwriting\u002Fkan-da-zuo-xiao-futures-trading",{"id":527,"title":528,"date":487,"category":126,"readTime":58,"tags":529,"_excerpt":537,"_path":538},"trading-for-a-living-book-summary","《以交易为生》核心思想精读：三重筛选 + 2% 风险 + 鳄鱼原则，三大支柱撑起一个交易者的底层操作系统",[530,531,532,533,201,534,197,374,535,536],"以交易为生","Alexander Elder","三重筛选","鳄鱼原则","交易心理","2% 风险","交易日志","交易是Mind（心理）+ Method（方法）+ Money（资金） 三位一体的职业，三者缺一不可 三重过滤筛选系统（Triple Screen） 是本书核心方法论：用周线定趋势 → 日线找回调 → 60 分钟找入场点 2% 风险原则：单笔交易最大亏损不超过账户总资金的 2% 6% 月度原则：单月累","\u002Fwriting\u002Ftrading-for-a-living-book-summary",{"id":50,"title":4,"date":6,"category":7,"readTime":8,"tags":540,"_excerpt":21,"_path":51},[10,11,12,13,14,15,16,17,18,19],{"id":542,"title":543,"date":6,"category":161,"readTime":544,"tags":545,"_excerpt":551,"_path":552},"telegram-86-login-recovery","86 手机号无法登录 Telegram 终极解决方案：绕过付费验证码 + 旧设备验证找回账号","8 分钟",[546,547,548,549,550],"Telegram","86手机号","账号找回","二次验证","短信收费","3 分钟摘要： 86 号码 + 邮箱 + 二次验证密码 = 找回账号的三要素，缺一不可 用第三方客户端 Telega（绕过 Google Play 校验版本）登录，触发邮箱 + 2FA 通道 登录成功后再用官方 Telegram 登录、更新到最新版本 整个过程不需要原手机短信、不需要旧设备在线","\u002Fwriting\u002Ftelegram-86-login-recovery",{"id":554,"title":555,"date":556,"category":91,"readTime":544,"tags":557,"_excerpt":559,"_path":560},"indie-developer-journey","从零到一：我的独立开发之路","2026-05-15",[241,558,217],"创业","2023年初，我做出了一个重要决定：离开稳定的工作，成为一名独立开发者。这个决定并非一时冲动，而是经过深思熟虑的结果。","\u002Fwriting\u002Findie-developer-journey",{"id":562,"title":563,"date":564,"category":126,"readTime":565,"tags":566,"_excerpt":569,"_path":570},"futures-trading-seven-rules","期货交易的七条铁律：从亏损到稳定盈利的思考","2026-03-20","5 分钟",[196,126,567,230,374,568],"交易思维","心法","做期货这几年，踩过的坑、爆过的仓、熬过的夜，最终都沉淀成这七条心得。期货交易本质上不是预测行情，而是管理自己。以下每一条都是真金白银换来的，建议反复读、慢慢悟。","\u002Fwriting\u002Ffutures-trading-seven-rules",1789555369190]