<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>HTTPS on WYF 的技术博客</title><link>https://saflyer.cn/tags/https/</link><description>Recent content in HTTPS on WYF 的技术博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sun, 20 Sep 2026 11:45:40 +0800</lastBuildDate><atom:link href="https://saflyer.cn/tags/https/index.xml" rel="self" type="application/rss+xml"/><item><title>建站运维 01：个人博客搭建与部署全记录（Hugo + Stack + Nginx + 腾讯云）</title><link>https://saflyer.cn/posts/blog-stack-deploy/</link><pubDate>Fri, 11 Sep 2026 13:57:34 +0800</pubDate><guid>https://saflyer.cn/posts/blog-stack-deploy/</guid><description>&lt;img src="https://saflyer.cn/posts/blog-stack-deploy/cover.webp" alt="Featured image of post 建站运维 01：个人博客搭建与部署全记录（Hugo + Stack + Nginx + 腾讯云）" /&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;环境&lt;/strong&gt;：本地 macOS (M1 Pro, arm64) / 服务器 腾讯云 Rocky Linux 9.4 (82.157.171.92)&#10;&lt;strong&gt;日期&lt;/strong&gt;：2026-09-11&#10;&lt;strong&gt;站点&lt;/strong&gt;：https://saflyer.cn/（2026-09-20 ICP 备案通过后恢复域名主入口，IP 访问 301 到域名——过程见 4.9 节）&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="一技术栈选型"&gt;&lt;a href="#%e4%b8%80%e6%8a%80%e6%9c%af%e6%a0%88%e9%80%89%e5%9e%8b" class="header-anchor"&gt;&lt;/a&gt;一、技术栈选型&#10;&lt;/h2&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;层&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;选型&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;理由&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;静态生成器&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Hugo (v0.166.0, extended)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;当前最主流的静态博客框架之一，Go 编写、单二进制、毫秒级构建&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;主题&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Stack (v4.0.3)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;卡片式设计、中文博客圈最流行的高颜值 Hugo 主题，自带搜索/归档/标签云/深色模式&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Web 服务器&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Nginx 1.20&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;静态站点标配，占资源少&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;部署方式&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;scp 全量同步&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;站点仅几百 KB，最简单可靠；文章多了可换 rsync 增量&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;自动化&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;bash + expect&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;密码登录场景下用 expect 模拟交互完成 ssh/scp&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;本地目录结构（&lt;code&gt;/Users/wyf/work/boke/&lt;/code&gt;）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt; 1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-2"&gt;&lt;a class="lnlinks" href="#hl-0-2"&gt; 2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-3"&gt;&lt;a class="lnlinks" href="#hl-0-3"&gt; 3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-4"&gt;&lt;a class="lnlinks" href="#hl-0-4"&gt; 4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-5"&gt;&lt;a class="lnlinks" href="#hl-0-5"&gt; 5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-6"&gt;&lt;a class="lnlinks" href="#hl-0-6"&gt; 6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-7"&gt;&lt;a class="lnlinks" href="#hl-0-7"&gt; 7&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-8"&gt;&lt;a class="lnlinks" href="#hl-0-8"&gt; 8&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-9"&gt;&lt;a class="lnlinks" href="#hl-0-9"&gt; 9&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-10"&gt;&lt;a class="lnlinks" href="#hl-0-10"&gt;10&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-11"&gt;&lt;a class="lnlinks" href="#hl-0-11"&gt;11&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-12"&gt;&lt;a class="lnlinks" href="#hl-0-12"&gt;12&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-13"&gt;&lt;a class="lnlinks" href="#hl-0-13"&gt;13&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-14"&gt;&lt;a class="lnlinks" href="#hl-0-14"&gt;14&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-15"&gt;&lt;a class="lnlinks" href="#hl-0-15"&gt;15&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-16"&gt;&lt;a class="lnlinks" href="#hl-0-16"&gt;16&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-17"&gt;&lt;a class="lnlinks" href="#hl-0-17"&gt;17&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;boke/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── 安全编排框架-4-Mac本地部署实操笔记.md # 文章源文件（只改它）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── deploy.sh # 一键部署脚本&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── tx.sh # 服务器交互式登录&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── txrun.exp # 远程执行命令（expect）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── txscp.exp # 上传文件（expect）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── blog.conf # nginx 站点配置（本地备份）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── blog/ # Hugo 站点工程&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── hugo.toml # 站点配置&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── assets/img/ # 头像、封面（参与构建处理）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── static/img/ # 原样拷贝的静态文件（OG 图）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── content/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├── _index.md # 首页菜单项&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├── posts/joysafety-mac-deploy/ # 文章（index.md + cover.png 页面包）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └── page/ # 归档/搜索/关于/友情链接&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── layouts/_partials/ # 主题局部模板覆盖（OG 图、自定义页脚）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── themes/stack/ # Stack 主题&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="二关键操作记录"&gt;&lt;a href="#%e4%ba%8c%e5%85%b3%e9%94%ae%e6%93%8d%e4%bd%9c%e8%ae%b0%e5%bd%95" class="header-anchor"&gt;&lt;/a&gt;二、关键操作记录&#10;&lt;/h2&gt;&lt;h3 id="21-建站"&gt;&lt;a href="#21-%e5%bb%ba%e7%ab%99" class="header-anchor"&gt;&lt;/a&gt;2.1 建站&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-1-2"&gt;&lt;a class="lnlinks" href="#hl-1-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-1-3"&gt;&lt;a class="lnlinks" href="#hl-1-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo new site blog&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; blog &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git init&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone --depth &lt;span class="m"&gt;1&lt;/span&gt; https://github.com/CaiJimmy/hugo-theme-stack themes/stack&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;注意点：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Stack v4 要求 Hugo ≥ 0.146（当前 min_version 0.157），版本不够先 &lt;code&gt;brew upgrade hugo&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;主题配置参考 &lt;code&gt;themes/stack/demo/config/_default/&lt;/code&gt; 下的示例，比文档更准&lt;/li&gt;&#10;&lt;li&gt;文章带封面图时要用&lt;strong&gt;页面包&lt;/strong&gt;结构（&lt;code&gt;posts/xxx/index.md + cover.png&lt;/code&gt;），front matter 里 &lt;code&gt;image: &amp;quot;cover.png&amp;quot;&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;头像等图片放 &lt;code&gt;assets/img/&lt;/code&gt;（会被 Hugo 处理）；需要固定 URL 的图（如 og:image）放 &lt;code&gt;static/img/&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="22-部署流水线deploysh-的逻辑"&gt;&lt;a href="#22-%e9%83%a8%e7%bd%b2%e6%b5%81%e6%b0%b4%e7%ba%bfdeploysh-%e7%9a%84%e9%80%bb%e8%be%91" class="header-anchor"&gt;&lt;/a&gt;2.2 部署流水线（deploy.sh 的逻辑）&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-2-2"&gt;&lt;a class="lnlinks" href="#hl-2-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-2-3"&gt;&lt;a class="lnlinks" href="#hl-2-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;同步文章（给&lt;/span&gt; &lt;span class="n"&gt;md&lt;/span&gt; &lt;span class="err"&gt;补上&lt;/span&gt; &lt;span class="n"&gt;front&lt;/span&gt; &lt;span class="n"&gt;matter&lt;/span&gt;&lt;span class="err"&gt;：&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;categories&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lastmod&lt;/span&gt;&lt;span class="err"&gt;）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;hugo&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;gc&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;minify&lt;/span&gt;&lt;span class="err"&gt;（构建到&lt;/span&gt; &lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;expect&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;scp&lt;/span&gt; &lt;span class="err"&gt;全量覆盖&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;blog&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;code&gt;lastmod&lt;/code&gt; 取 md 文件的修改时间自动写入（供 RSS/sitemap 使用）；后来为避免暴露私有备份仓库地址，页面端已去掉「最后更新于」与修订历史入口。&lt;/p&gt;&#10;&lt;h3 id="23-expect-自动化的两个坑"&gt;&lt;a href="#23-expect-%e8%87%aa%e5%8a%a8%e5%8c%96%e7%9a%84%e4%b8%a4%e4%b8%aa%e5%9d%91" class="header-anchor"&gt;&lt;/a&gt;2.3 expect 自动化的两个坑&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;expect 脚本里密码含 &lt;code&gt;+*@&lt;/code&gt; 等特殊字符，要用 &lt;code&gt;set password {密码}&lt;/code&gt; 花括号包裹，防止被当正则/变量解析&lt;/li&gt;&#10;&lt;li&gt;ssh 首次连接的 &lt;code&gt;yes/no&lt;/code&gt; 确认，用 &lt;code&gt;-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null&lt;/code&gt; 直接跳过&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="24-服务器侧初始化一次性"&gt;&lt;a href="#24-%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%be%a7%e5%88%9d%e5%a7%8b%e5%8c%96%e4%b8%80%e6%ac%a1%e6%80%a7" class="header-anchor"&gt;&lt;/a&gt;2.4 服务器侧初始化（一次性）&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-3-1"&gt;&lt;a class="lnlinks" href="#hl-3-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-3-2"&gt;&lt;a class="lnlinks" href="#hl-3-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-3-3"&gt;&lt;a class="lnlinks" href="#hl-3-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-3-4"&gt;&lt;a class="lnlinks" href="#hl-3-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dnf install -y nginx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p /var/www/blog&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 上传 nginx 配置后：&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nginx -t &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now nginx&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;SELinux 注意：文件从 home 目录拷入 web 根目录后要 &lt;code&gt;restorecon -R /var/www/blog&lt;/code&gt; 恢复安全上下文，否则 403。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="三nginx-配置详解etcnginxconfdblogconf"&gt;&lt;a href="#%e4%b8%89nginx-%e9%85%8d%e7%bd%ae%e8%af%a6%e8%a7%a3etcnginxconfdblogconf" class="header-anchor"&gt;&lt;/a&gt;三、Nginx 配置详解（/etc/nginx/conf.d/blog.conf）&#10;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-4-1"&gt;&lt;a class="lnlinks" href="#hl-4-1"&gt; 1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-2"&gt;&lt;a class="lnlinks" href="#hl-4-2"&gt; 2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-3"&gt;&lt;a class="lnlinks" href="#hl-4-3"&gt; 3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-4"&gt;&lt;a class="lnlinks" href="#hl-4-4"&gt; 4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-5"&gt;&lt;a class="lnlinks" href="#hl-4-5"&gt; 5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-6"&gt;&lt;a class="lnlinks" href="#hl-4-6"&gt; 6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-7"&gt;&lt;a class="lnlinks" href="#hl-4-7"&gt; 7&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-8"&gt;&lt;a class="lnlinks" href="#hl-4-8"&gt; 8&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-9"&gt;&lt;a class="lnlinks" href="#hl-4-9"&gt; 9&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-10"&gt;&lt;a class="lnlinks" href="#hl-4-10"&gt;10&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-11"&gt;&lt;a class="lnlinks" href="#hl-4-11"&gt;11&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-12"&gt;&lt;a class="lnlinks" href="#hl-4-12"&gt;12&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-13"&gt;&lt;a class="lnlinks" href="#hl-4-13"&gt;13&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-14"&gt;&lt;a class="lnlinks" href="#hl-4-14"&gt;14&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-15"&gt;&lt;a class="lnlinks" href="#hl-4-15"&gt;15&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-16"&gt;&lt;a class="lnlinks" href="#hl-4-16"&gt;16&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-17"&gt;&lt;a class="lnlinks" href="#hl-4-17"&gt;17&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-18"&gt;&lt;a class="lnlinks" href="#hl-4-18"&gt;18&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-19"&gt;&lt;a class="lnlinks" href="#hl-4-19"&gt;19&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-20"&gt;&lt;a class="lnlinks" href="#hl-4-20"&gt;20&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-21"&gt;&lt;a class="lnlinks" href="#hl-4-21"&gt;21&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-22"&gt;&lt;a class="lnlinks" href="#hl-4-22"&gt;22&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-23"&gt;&lt;a class="lnlinks" href="#hl-4-23"&gt;23&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-24"&gt;&lt;a class="lnlinks" href="#hl-4-24"&gt;24&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-25"&gt;&lt;a class="lnlinks" href="#hl-4-25"&gt;25&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-26"&gt;&lt;a class="lnlinks" href="#hl-4-26"&gt;26&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-27"&gt;&lt;a class="lnlinks" href="#hl-4-27"&gt;27&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-28"&gt;&lt;a class="lnlinks" href="#hl-4-28"&gt;28&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-29"&gt;&lt;a class="lnlinks" href="#hl-4-29"&gt;29&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-30"&gt;&lt;a class="lnlinks" href="#hl-4-30"&gt;30&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-31"&gt;&lt;a class="lnlinks" href="#hl-4-31"&gt;31&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-32"&gt;&lt;a class="lnlinks" href="#hl-4-32"&gt;32&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-33"&gt;&lt;a class="lnlinks" href="#hl-4-33"&gt;33&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-34"&gt;&lt;a class="lnlinks" href="#hl-4-34"&gt;34&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-35"&gt;&lt;a class="lnlinks" href="#hl-4-35"&gt;35&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-36"&gt;&lt;a class="lnlinks" href="#hl-4-36"&gt;36&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-37"&gt;&lt;a class="lnlinks" href="#hl-4-37"&gt;37&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-38"&gt;&lt;a class="lnlinks" href="#hl-4-38"&gt;38&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-39"&gt;&lt;a class="lnlinks" href="#hl-4-39"&gt;39&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt; &lt;span class="s"&gt;default_server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="s"&gt;[::]:80&lt;/span&gt; &lt;span class="s"&gt;default_server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="s"&gt;/var/www/blog&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;index&lt;/span&gt; &lt;span class="s"&gt;index.html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;error_page&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="s"&gt;/404.html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# HTML 不缓存：更新后立即生效（踩过浏览器拿旧页面的坑）&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt; &lt;span class="s"&gt;\.html&lt;/span&gt;$ &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Content-Type-Options&lt;/span&gt; &lt;span class="s"&gt;nosniff&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Frame-Options&lt;/span&gt; &lt;span class="s"&gt;DENY&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Referrer-Policy&lt;/span&gt; &lt;span class="s"&gt;strict-origin-when-cross-origin&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Cache-Control&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;no-cache&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;try_files&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt; &lt;span class="nv"&gt;$uri/&lt;/span&gt; &lt;span class="nv"&gt;$uri/index.html&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 静态资源长缓存：Hugo 构建的 CSS/JS 文件名带哈希指纹，内容变文件名就变&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt; &lt;span class="s"&gt;\.(css|js|png|jpg|jpeg|gif|ico|svg|woff2?|webp)&lt;/span&gt;$ &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Content-Type-Options&lt;/span&gt; &lt;span class="s"&gt;nosniff&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Frame-Options&lt;/span&gt; &lt;span class="s"&gt;DENY&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Referrer-Policy&lt;/span&gt; &lt;span class="s"&gt;strict-origin-when-cross-origin&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Cache-Control&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;public,&lt;/span&gt; &lt;span class="s"&gt;max-age=2592000,&lt;/span&gt; &lt;span class="s"&gt;immutable&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;try_files&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Content-Type-Options&lt;/span&gt; &lt;span class="s"&gt;nosniff&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Frame-Options&lt;/span&gt; &lt;span class="s"&gt;DENY&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Referrer-Policy&lt;/span&gt; &lt;span class="s"&gt;strict-origin-when-cross-origin&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;try_files&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt; &lt;span class="nv"&gt;$uri/&lt;/span&gt; &lt;span class="nv"&gt;$uri/index.html&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;gzip&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;gzip_comp_level&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;gzip_min_length&lt;/span&gt; &lt;span class="mi"&gt;1k&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;gzip_types&lt;/span&gt; &lt;span class="s"&gt;text/plain&lt;/span&gt; &lt;span class="s"&gt;text/css&lt;/span&gt; &lt;span class="s"&gt;application/javascript&lt;/span&gt; &lt;span class="s"&gt;application/json&lt;/span&gt; &lt;span class="s"&gt;image/svg+xml&lt;/span&gt; &lt;span class="s"&gt;application/xml&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;两个关键经验：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;nginx 的 add_header 继承陷阱&lt;/strong&gt;：location 块里一旦定义了自己的 &lt;code&gt;add_header&lt;/code&gt;，server 级的所有 &lt;code&gt;add_header&lt;/code&gt; 对该 location &lt;strong&gt;全部失效&lt;/strong&gt;。所以安全响应头必须在每个 location 里都写一遍。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Rocky/CentOS 系 nginx.conf 自带默认 server 块&lt;/strong&gt;：会和 conf.d 里的 &lt;code&gt;default_server&lt;/code&gt; 冲突（报 &lt;code&gt;conflicting server name &amp;quot;_&amp;quot;&lt;/code&gt;）。解法：编辑 &lt;code&gt;/etc/nginx/nginx.conf&lt;/code&gt;，删掉自带的 &lt;code&gt;server { listen 80; ... }&lt;/code&gt; 块。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="四从-http-迁移到-https实际执行全记录"&gt;&lt;a href="#%e5%9b%9b%e4%bb%8e-http-%e8%bf%81%e7%a7%bb%e5%88%b0-https%e5%ae%9e%e9%99%85%e6%89%a7%e8%a1%8c%e5%85%a8%e8%ae%b0%e5%bd%95" class="header-anchor"&gt;&lt;/a&gt;四、从 HTTP 迁移到 HTTPS（实际执行全记录）&#10;&lt;/h2&gt;&lt;p&gt;本节是 2026-09-11 的真实操作记录，含完整决策过程和踩坑。&lt;/p&gt;&#10;&lt;h3 id="41-决策过程免费证书的三条路"&gt;&lt;a href="#41-%e5%86%b3%e7%ad%96%e8%bf%87%e7%a8%8b%e5%85%8d%e8%b4%b9%e8%af%81%e4%b9%a6%e7%9a%84%e4%b8%89%e6%9d%a1%e8%b7%af" class="header-anchor"&gt;&lt;/a&gt;4.1 决策过程：免费证书的三条路&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;方案&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;是否免费&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;浏览器信任&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;前提&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;结论&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Let&amp;rsquo;s Encrypt 域名证书&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;需要有域名&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅ &lt;strong&gt;本站当前方案&lt;/strong&gt;（2026-09-11 晚切换，见 4.9）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Let&amp;rsquo;s Encrypt IP 证书&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2025 年起 CA/B 论坛允许 IP 证书&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;实测失败&lt;/strong&gt;，见 4.2&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;自签名证书&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;❌（警告一次）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;无&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;域名过渡期的方案，现为 IP 直连入口用证书（见 4.9）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="42-踩坑lets-encrypt-拒签纯-ip实测"&gt;&lt;a href="#42-%e8%b8%a9%e5%9d%91lets-encrypt-%e6%8b%92%e7%ad%be%e7%ba%af-ip%e5%ae%9e%e6%b5%8b" class="header-anchor"&gt;&lt;/a&gt;4.2 踩坑：Let&amp;rsquo;s Encrypt 拒签纯 IP（实测）&#10;&lt;/h3&gt;&lt;p&gt;政策上 IP 证书已经放开，于是先尝试正规路线：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-5-1"&gt;&lt;a class="lnlinks" href="#hl-5-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-2"&gt;&lt;a class="lnlinks" href="#hl-5-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-3"&gt;&lt;a class="lnlinks" href="#hl-5-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-4"&gt;&lt;a class="lnlinks" href="#hl-5-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-5"&gt;&lt;a class="lnlinks" href="#hl-5-5"&gt;5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-6"&gt;&lt;a class="lnlinks" href="#hl-5-6"&gt;6&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dnf install -y epel-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dnf install -y certbot python3-certbot-nginx &lt;span class="c1"&gt;# 装到 certbot 3.1.0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;certbot certonly --nginx --preferred-profile shortlived &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d 82.157.171.92 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --register-unsafely-without-email --agree-tos --non-interactive&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;结果直接被拒：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-6-1"&gt;&lt;a class="lnlinks" href="#hl-6-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-6-2"&gt;&lt;a class="lnlinks" href="#hl-6-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Requested name 82.157.171.92 is an IP address.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;The Let&amp;#39;s Encrypt certificate authority will not issue certificates for a bare IP address.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;结论：虽然 CA/B 论坛 2025 年通过了 IP 证书议案，但 Let&amp;rsquo;s Encrypt 对公网 IP 的实际签发仍未开放（短时效 IP 证书只在特定 profile/试点场景提供）。&lt;strong&gt;没有域名，受信任证书这条路目前走不通，转自签名。&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="43-自签名证书制作实际执行"&gt;&lt;a href="#43-%e8%87%aa%e7%ad%be%e5%90%8d%e8%af%81%e4%b9%a6%e5%88%b6%e4%bd%9c%e5%ae%9e%e9%99%85%e6%89%a7%e8%a1%8c" class="header-anchor"&gt;&lt;/a&gt;4.3 自签名证书制作（实际执行）&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-7-1"&gt;&lt;a class="lnlinks" href="#hl-7-1"&gt; 1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-7-2"&gt;&lt;a class="lnlinks" href="#hl-7-2"&gt; 2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-7-3"&gt;&lt;a class="lnlinks" href="#hl-7-3"&gt; 3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-7-4"&gt;&lt;a class="lnlinks" href="#hl-7-4"&gt; 4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-7-5"&gt;&lt;a class="lnlinks" href="#hl-7-5"&gt; 5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-7-6"&gt;&lt;a class="lnlinks" href="#hl-7-6"&gt; 6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-7-7"&gt;&lt;a class="lnlinks" href="#hl-7-7"&gt; 7&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-7-8"&gt;&lt;a class="lnlinks" href="#hl-7-8"&gt; 8&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-7-9"&gt;&lt;a class="lnlinks" href="#hl-7-9"&gt; 9&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-7-10"&gt;&lt;a class="lnlinks" href="#hl-7-10"&gt;10&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-7-11"&gt;&lt;a class="lnlinks" href="#hl-7-11"&gt;11&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-7-12"&gt;&lt;a class="lnlinks" href="#hl-7-12"&gt;12&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 生成 2048 位 RSA 私钥&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p /etc/nginx/ssl&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl genrsa -out /etc/nginx/ssl/blog.key &lt;span class="m"&gt;2048&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 生成自签名证书（10 年有效；关键：-addext 加 SAN，否则 Chrome 不认 CN 字段）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl req -x509 -new -key /etc/nginx/ssl/blog.key &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -out /etc/nginx/ssl/blog.crt -days &lt;span class="m"&gt;3650&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -subj &lt;span class="s2"&gt;&amp;#34;/C=CN/O=WYFBlog/CN=82.157.171.92&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -addext &lt;span class="s2"&gt;&amp;#34;subjectAltName=IP:82.157.171.92&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. 私钥权限收紧（必做）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod &lt;span class="m"&gt;600&lt;/span&gt; /etc/nginx/ssl/blog.key&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;验证证书内容：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-8-1"&gt;&lt;a class="lnlinks" href="#hl-8-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-8-2"&gt;&lt;a class="lnlinks" href="#hl-8-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-8-3"&gt;&lt;a class="lnlinks" href="#hl-8-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-8-4"&gt;&lt;a class="lnlinks" href="#hl-8-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ openssl x509 -in /etc/nginx/ssl/blog.crt -noout -subject -dates&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;subject&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;C&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;CN, &lt;span class="nv"&gt;O&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;WYFBlog, &lt;span class="nv"&gt;CN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;82.157.171.92&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;notBefore&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Sep &lt;span class="m"&gt;11&lt;/span&gt; 05:59:29 &lt;span class="m"&gt;2026&lt;/span&gt; GMT&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;notAfter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Sep &lt;span class="m"&gt;8&lt;/span&gt; 05:59:29 &lt;span class="m"&gt;2036&lt;/span&gt; GMT &lt;span class="c1"&gt;# 10 年有效期&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;为什么不加 SAN 不行&lt;/strong&gt;：Chrome 58 起不再读证书的 CN 字段，只认 &lt;code&gt;subjectAltName&lt;/code&gt;。IP 站点的 SAN 写法是 &lt;code&gt;IP:x.x.x.x&lt;/code&gt;（域名则是 &lt;code&gt;DNS:example.com&lt;/code&gt;）。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="44-nginx-配置本站当前生产配置"&gt;&lt;a href="#44-nginx-%e9%85%8d%e7%bd%ae%e6%9c%ac%e7%ab%99%e5%bd%93%e5%89%8d%e7%94%9f%e4%ba%a7%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;4.4 nginx 配置（本站当前生产配置）&#10;&lt;/h3&gt;&lt;p&gt;80 和 443 &lt;strong&gt;双协议并行&lt;/strong&gt;（原因见 4.5 的坑）：80 直接提供访问，443 提供加密访问。等域名和受信任证书就位后，80 再改成 &lt;code&gt;return 301 https://$host$request_uri;&lt;/code&gt;。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-9-1"&gt;&lt;a class="lnlinks" href="#hl-9-1"&gt; 1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-2"&gt;&lt;a class="lnlinks" href="#hl-9-2"&gt; 2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-3"&gt;&lt;a class="lnlinks" href="#hl-9-3"&gt; 3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-4"&gt;&lt;a class="lnlinks" href="#hl-9-4"&gt; 4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-5"&gt;&lt;a class="lnlinks" href="#hl-9-5"&gt; 5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-6"&gt;&lt;a class="lnlinks" href="#hl-9-6"&gt; 6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-7"&gt;&lt;a class="lnlinks" href="#hl-9-7"&gt; 7&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-8"&gt;&lt;a class="lnlinks" href="#hl-9-8"&gt; 8&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-9"&gt;&lt;a class="lnlinks" href="#hl-9-9"&gt; 9&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-10"&gt;&lt;a class="lnlinks" href="#hl-9-10"&gt;10&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-11"&gt;&lt;a class="lnlinks" href="#hl-9-11"&gt;11&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-12"&gt;&lt;a class="lnlinks" href="#hl-9-12"&gt;12&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-13"&gt;&lt;a class="lnlinks" href="#hl-9-13"&gt;13&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-14"&gt;&lt;a class="lnlinks" href="#hl-9-14"&gt;14&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-15"&gt;&lt;a class="lnlinks" href="#hl-9-15"&gt;15&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-16"&gt;&lt;a class="lnlinks" href="#hl-9-16"&gt;16&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-17"&gt;&lt;a class="lnlinks" href="#hl-9-17"&gt;17&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-18"&gt;&lt;a class="lnlinks" href="#hl-9-18"&gt;18&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-19"&gt;&lt;a class="lnlinks" href="#hl-9-19"&gt;19&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-20"&gt;&lt;a class="lnlinks" href="#hl-9-20"&gt;20&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-21"&gt;&lt;a class="lnlinks" href="#hl-9-21"&gt;21&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-22"&gt;&lt;a class="lnlinks" href="#hl-9-22"&gt;22&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-23"&gt;&lt;a class="lnlinks" href="#hl-9-23"&gt;23&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-24"&gt;&lt;a class="lnlinks" href="#hl-9-24"&gt;24&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-25"&gt;&lt;a class="lnlinks" href="#hl-9-25"&gt;25&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-26"&gt;&lt;a class="lnlinks" href="#hl-9-26"&gt;26&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-27"&gt;&lt;a class="lnlinks" href="#hl-9-27"&gt;27&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-28"&gt;&lt;a class="lnlinks" href="#hl-9-28"&gt;28&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-29"&gt;&lt;a class="lnlinks" href="#hl-9-29"&gt;29&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-30"&gt;&lt;a class="lnlinks" href="#hl-9-30"&gt;30&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-31"&gt;&lt;a class="lnlinks" href="#hl-9-31"&gt;31&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-32"&gt;&lt;a class="lnlinks" href="#hl-9-32"&gt;32&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-33"&gt;&lt;a class="lnlinks" href="#hl-9-33"&gt;33&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-34"&gt;&lt;a class="lnlinks" href="#hl-9-34"&gt;34&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-35"&gt;&lt;a class="lnlinks" href="#hl-9-35"&gt;35&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-36"&gt;&lt;a class="lnlinks" href="#hl-9-36"&gt;36&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-37"&gt;&lt;a class="lnlinks" href="#hl-9-37"&gt;37&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-38"&gt;&lt;a class="lnlinks" href="#hl-9-38"&gt;38&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-39"&gt;&lt;a class="lnlinks" href="#hl-9-39"&gt;39&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-40"&gt;&lt;a class="lnlinks" href="#hl-9-40"&gt;40&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-41"&gt;&lt;a class="lnlinks" href="#hl-9-41"&gt;41&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-42"&gt;&lt;a class="lnlinks" href="#hl-9-42"&gt;42&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-43"&gt;&lt;a class="lnlinks" href="#hl-9-43"&gt;43&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-44"&gt;&lt;a class="lnlinks" href="#hl-9-44"&gt;44&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-45"&gt;&lt;a class="lnlinks" href="#hl-9-45"&gt;45&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-46"&gt;&lt;a class="lnlinks" href="#hl-9-46"&gt;46&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-47"&gt;&lt;a class="lnlinks" href="#hl-9-47"&gt;47&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-48"&gt;&lt;a class="lnlinks" href="#hl-9-48"&gt;48&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-49"&gt;&lt;a class="lnlinks" href="#hl-9-49"&gt;49&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-50"&gt;&lt;a class="lnlinks" href="#hl-9-50"&gt;50&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-51"&gt;&lt;a class="lnlinks" href="#hl-9-51"&gt;51&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-52"&gt;&lt;a class="lnlinks" href="#hl-9-52"&gt;52&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-53"&gt;&lt;a class="lnlinks" href="#hl-9-53"&gt;53&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-54"&gt;&lt;a class="lnlinks" href="#hl-9-54"&gt;54&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-55"&gt;&lt;a class="lnlinks" href="#hl-9-55"&gt;55&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-56"&gt;&lt;a class="lnlinks" href="#hl-9-56"&gt;56&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-57"&gt;&lt;a class="lnlinks" href="#hl-9-57"&gt;57&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-58"&gt;&lt;a class="lnlinks" href="#hl-9-58"&gt;58&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-59"&gt;&lt;a class="lnlinks" href="#hl-9-59"&gt;59&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 80 端口：直接提供访问&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt; &lt;span class="s"&gt;default_server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="s"&gt;[::]:80&lt;/span&gt; &lt;span class="s"&gt;default_server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="s"&gt;/var/www/blog&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;index&lt;/span&gt; &lt;span class="s"&gt;index.html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;error_page&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="s"&gt;/404.html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kn"&gt;try_files&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt; &lt;span class="nv"&gt;$uri/&lt;/span&gt; &lt;span class="nv"&gt;$uri/index.html&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# （安全头 / 缓存策略 / gzip 与 443 块相同，从略）&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 443 端口：HTTPS 站点&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;default_server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="s"&gt;[::]:443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;default_server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="s"&gt;/var/www/blog&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;index&lt;/span&gt; &lt;span class="s"&gt;index.html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt; &lt;span class="s"&gt;/etc/nginx/ssl/blog.crt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="s"&gt;/etc/nginx/ssl/blog.key&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# TLS 加固：只留 1.2/1.3，开会话缓存&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_protocols&lt;/span&gt; &lt;span class="s"&gt;TLSv1.2&lt;/span&gt; &lt;span class="s"&gt;TLSv1.3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_prefer_server_ciphers&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_session_cache&lt;/span&gt; &lt;span class="s"&gt;shared:SSL:10m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_session_timeout&lt;/span&gt; &lt;span class="s"&gt;1d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;error_page&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="s"&gt;/404.html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt; &lt;span class="s"&gt;\.html&lt;/span&gt;$ &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Content-Type-Options&lt;/span&gt; &lt;span class="s"&gt;nosniff&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Frame-Options&lt;/span&gt; &lt;span class="s"&gt;DENY&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Referrer-Policy&lt;/span&gt; &lt;span class="s"&gt;strict-origin-when-cross-origin&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Cache-Control&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;no-cache&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;try_files&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt; &lt;span class="nv"&gt;$uri/&lt;/span&gt; &lt;span class="nv"&gt;$uri/index.html&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt; &lt;span class="s"&gt;\.(css|js|png|jpg|jpeg|gif|ico|svg|woff2?|webp)&lt;/span&gt;$ &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Content-Type-Options&lt;/span&gt; &lt;span class="s"&gt;nosniff&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Frame-Options&lt;/span&gt; &lt;span class="s"&gt;DENY&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Referrer-Policy&lt;/span&gt; &lt;span class="s"&gt;strict-origin-when-cross-origin&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Cache-Control&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;public,&lt;/span&gt; &lt;span class="s"&gt;max-age=2592000,&lt;/span&gt; &lt;span class="s"&gt;immutable&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;try_files&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Content-Type-Options&lt;/span&gt; &lt;span class="s"&gt;nosniff&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Frame-Options&lt;/span&gt; &lt;span class="s"&gt;DENY&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Referrer-Policy&lt;/span&gt; &lt;span class="s"&gt;strict-origin-when-cross-origin&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;try_files&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt; &lt;span class="nv"&gt;$uri/&lt;/span&gt; &lt;span class="nv"&gt;$uri/index.html&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;gzip&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;gzip_comp_level&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;gzip_min_length&lt;/span&gt; &lt;span class="mi"&gt;1k&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;gzip_types&lt;/span&gt; &lt;span class="s"&gt;text/plain&lt;/span&gt; &lt;span class="s"&gt;text/css&lt;/span&gt; &lt;span class="s"&gt;application/javascript&lt;/span&gt; &lt;span class="s"&gt;application/json&lt;/span&gt; &lt;span class="s"&gt;image/svg+xml&lt;/span&gt; &lt;span class="s"&gt;application/xml&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;注意：自签名场景&lt;strong&gt;不要&lt;/strong&gt;加 HSTS 头——浏览器不信任证书时，HSTS 会把用户锁死在警告页。&lt;/p&gt;&#10;&lt;h3 id="45-踩坑443-配置好了但外网不通--云安全组"&gt;&lt;a href="#45-%e8%b8%a9%e5%9d%91443-%e9%85%8d%e7%bd%ae%e5%a5%bd%e4%ba%86%e4%bd%86%e5%a4%96%e7%bd%91%e4%b8%8d%e9%80%9a--%e4%ba%91%e5%ae%89%e5%85%a8%e7%bb%84" class="header-anchor"&gt;&lt;/a&gt;4.5 踩坑：443 配置好了但外网不通 —— 云安全组&#10;&lt;/h3&gt;&lt;p&gt;配置后服务器内部验证全部通过：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-10-1"&gt;&lt;a class="lnlinks" href="#hl-10-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-2"&gt;&lt;a class="lnlinks" href="#hl-10-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-3"&gt;&lt;a class="lnlinks" href="#hl-10-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ nginx -t &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; systemctl reload nginx &lt;span class="c1"&gt;# 配置语法 OK&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ss -tlnp &lt;span class="p"&gt;|&lt;/span&gt; grep :443 &lt;span class="c1"&gt;# nginx 已在 443 监听&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -sk -o /dev/null -w &lt;span class="s1"&gt;&amp;#39;%{http_code}&amp;#39;&lt;/span&gt; https://127.0.0.1/ &lt;span class="c1"&gt;# 本机 200&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;但从外网访问 &lt;code&gt;https://82.157.171.92/&lt;/code&gt; 直接超时（&lt;code&gt;curl&lt;/code&gt; 返回 000）。排查发现是&lt;strong&gt;腾讯云安全组（云端防火墙）只放行了 80，没放行 443&lt;/strong&gt;——安全组是云平台层面的规则，在服务器操作系统里改 iptables/firewalld 都没用，只能去控制台加：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;腾讯云控制台 → 轻量应用服务器 → 实例详情 → 防火墙 → 添加规则 → TCP 443 → 0.0.0.0/0&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;期间还顺手排查了服务器上一个可疑的 &lt;code&gt;YJ-FIREWALL-INPUT&lt;/code&gt; iptables 链（内容是一批针对特定 IP 的 REJECT 规则，是云镜/主机安全组件的封禁名单），确认与本次无关。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;另一个教训&lt;/strong&gt;：最初把 80 配成 &lt;code&gt;301 → 443&lt;/code&gt; 后外网立刻全站打不开（443 被安全组拦着）。所以&lt;strong&gt;在云安全组放行之前，绝不能把 80 跳转 443&lt;/strong&gt;，双协议并行是正确的过渡姿势。&lt;/p&gt;&#10;&lt;h3 id="46-切换后验证清单"&gt;&lt;a href="#46-%e5%88%87%e6%8d%a2%e5%90%8e%e9%aa%8c%e8%af%81%e6%b8%85%e5%8d%95" class="header-anchor"&gt;&lt;/a&gt;4.6 切换后验证清单&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-11-1"&gt;&lt;a class="lnlinks" href="#hl-11-1"&gt; 1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-11-2"&gt;&lt;a class="lnlinks" href="#hl-11-2"&gt; 2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-11-3"&gt;&lt;a class="lnlinks" href="#hl-11-3"&gt; 3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-11-4"&gt;&lt;a class="lnlinks" href="#hl-11-4"&gt; 4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-11-5"&gt;&lt;a class="lnlinks" href="#hl-11-5"&gt; 5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-11-6"&gt;&lt;a class="lnlinks" href="#hl-11-6"&gt; 6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-11-7"&gt;&lt;a class="lnlinks" href="#hl-11-7"&gt; 7&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-11-8"&gt;&lt;a class="lnlinks" href="#hl-11-8"&gt; 8&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-11-9"&gt;&lt;a class="lnlinks" href="#hl-11-9"&gt; 9&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-11-10"&gt;&lt;a class="lnlinks" href="#hl-11-10"&gt;10&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-11-11"&gt;&lt;a class="lnlinks" href="#hl-11-11"&gt;11&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 服务器侧&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nginx -t &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; systemctl reload nginx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ss -tlnp &lt;span class="p"&gt;|&lt;/span&gt; grep :443&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 本机侧（自签名证书要加 -k 跳过校验）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sk -o /dev/null -w &lt;span class="s1"&gt;&amp;#39;%{http_code}\n&amp;#39;&lt;/span&gt; https://82.157.171.92/ &lt;span class="c1"&gt;# 期望 200&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sI http://82.157.171.92/ &lt;span class="c1"&gt;# 确认 80 仍正常&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看对端证书信息&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; openssl s_client -connect 82.157.171.92:443 -servername 82.157.171.92 2&amp;gt;/dev/null &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; openssl x509 -noout -subject -dates&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;浏览器访问 https://82.157.171.92/ 会出现「不受信任」警告 → 点「高级 → 继续访问」即可，只提示一次。这是自签名证书的正常现象，传输本身已加密。&lt;/p&gt;&#10;&lt;h3 id="47-关于密钥的几个要点含发布脱敏"&gt;&lt;a href="#47-%e5%85%b3%e4%ba%8e%e5%af%86%e9%92%a5%e7%9a%84%e5%87%a0%e4%b8%aa%e8%a6%81%e7%82%b9%e5%90%ab%e5%8f%91%e5%b8%83%e8%84%b1%e6%95%8f" class="header-anchor"&gt;&lt;/a&gt;4.7 关于「密钥」的几个要点（含发布脱敏）&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;私钥（blog.key / privkey.pem）是命根子&lt;/strong&gt;：权限 600、属主 root；不进 git、不用 scp 明文传输、&lt;strong&gt;绝不出现在任何博文里&lt;/strong&gt;（本篇只记录命令和路径，不贴任何密钥/证书内容）&lt;/li&gt;&#10;&lt;li&gt;本文发布前已做脱敏检查：不含服务器密码、私钥内容、腾讯云密钥；IP 属于公开信息（本身就是站点地址）无需脱敏&lt;/li&gt;&#10;&lt;li&gt;服务器登录密码只存在于本地 &lt;code&gt;tx.sh&lt;/code&gt; / &lt;code&gt;txrun.exp&lt;/code&gt; / &lt;code&gt;txscp.exp&lt;/code&gt;，这些文件已在 .gitignore 级别上注意，&lt;strong&gt;不要&lt;/strong&gt;提交到任何公开仓库&lt;/li&gt;&#10;&lt;li&gt;以后换 Let&amp;rsquo;s Encrypt 后：续期由 certbot 定时器自动完成（&lt;code&gt;certbot renew --dry-run&lt;/code&gt; 可演练）；80 若做了 301，certbot 的 nginx 插件会自动保留 &lt;code&gt;/.well-known/acme-challenge/&lt;/code&gt; 验证通路&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="48-以后有域名了怎么办10-分钟切换"&gt;&lt;a href="#48-%e4%bb%a5%e5%90%8e%e6%9c%89%e5%9f%9f%e5%90%8d%e4%ba%86%e6%80%8e%e4%b9%88%e5%8a%9e10-%e5%88%86%e9%92%9f%e5%88%87%e6%8d%a2" class="header-anchor"&gt;&lt;/a&gt;4.8 以后有域名了怎么办（10 分钟切换）&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;2026-09-11 晚已执行&lt;/strong&gt;：域名 saflyer.cn 上线，以下是当时的预案，实际执行记录见 4.9 节。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;域名 A 记录指向 82.157.171.92，确认安全组 443 已放行&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;certbot --nginx -d blog.example.com --email you@example.com --agree-tos&lt;/code&gt;（自动改 nginx 配置、自动配续期）&lt;/li&gt;&#10;&lt;li&gt;Hugo &lt;code&gt;baseURL&lt;/code&gt; 改为 &lt;code&gt;https://blog.example.com/&lt;/code&gt;，重跑 &lt;code&gt;deploy.sh&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;把 80 端口 server 块改为 &lt;code&gt;return 301 https://$host$request_uri;&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;可安全开启 HSTS：&lt;code&gt;add_header Strict-Transport-Security &amp;quot;max-age=31536000&amp;quot; always;&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="49-域名上线实操saflyercn2026-09-11-晚"&gt;&lt;a href="#49-%e5%9f%9f%e5%90%8d%e4%b8%8a%e7%ba%bf%e5%ae%9e%e6%93%8dsaflyercn2026-09-11-%e6%99%9a" class="header-anchor"&gt;&lt;/a&gt;4.9 域名上线实操：saflyer.cn（2026-09-11 晚）&#10;&lt;/h3&gt;&lt;p&gt;按 4.8 预案执行，全程约 15 分钟。域名腾讯云注册 &lt;code&gt;saflyer.cn&lt;/code&gt;，DNS 用 DNSPod 解析。&lt;/p&gt;&#10;&lt;h4 id="1-dns-解析dnspod-控制台"&gt;&lt;a href="#1-dns-%e8%a7%a3%e6%9e%90dnspod-%e6%8e%a7%e5%88%b6%e5%8f%b0" class="header-anchor"&gt;&lt;/a&gt;1. DNS 解析（DNSPod 控制台）&#10;&lt;/h4&gt;&lt;p&gt;控制台 → DNS 解析 DNSPod → 域名 &lt;code&gt;saflyer.cn&lt;/code&gt; → 添加两条记录：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;主机记录&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;记录类型&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;记录值&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;TTL&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;@&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;A&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;82.157.171.92&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;600&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;www&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;A&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;82.157.171.92&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;600&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;验证生效（1~10 分钟）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-12-1"&gt;&lt;a class="lnlinks" href="#hl-12-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-12-2"&gt;&lt;a class="lnlinks" href="#hl-12-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dig +short saflyer.cn &lt;span class="c1"&gt;# 应返回 82.157.171.92&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dig +short www.saflyer.cn &lt;span class="c1"&gt;# 同上&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;知识点&lt;/strong&gt;：&lt;code&gt;@&lt;/code&gt; 表示裸域名本身；&lt;code&gt;www&lt;/code&gt; 只是普通子域名，和 &lt;code&gt;blog.&lt;/code&gt;、&lt;code&gt;api.&lt;/code&gt; 地位相同，是约定俗成而非必需。「带不带 www 都能访问」是因为三层都配了双名：DNS 两条记录、nginx &lt;code&gt;server_name saflyer.cn www.saflyer.cn;&lt;/code&gt;、证书 SAN 同时含两个名字。&lt;/p&gt;&#10;&lt;h4 id="2-nginx-绑定域名"&gt;&lt;a href="#2-nginx-%e7%bb%91%e5%ae%9a%e5%9f%9f%e5%90%8d" class="header-anchor"&gt;&lt;/a&gt;2. nginx 绑定域名&#10;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;blog.conf&lt;/code&gt; 两个 server 块的 &lt;code&gt;server_name _;&lt;/code&gt; 改为 &lt;code&gt;server_name saflyer.cn www.saflyer.cn;&lt;/code&gt;，上传后 &lt;code&gt;nginx -t &amp;amp;&amp;amp; systemctl reload nginx&lt;/code&gt;。&lt;/p&gt;&#10;&lt;h4 id="3-lets-encrypt-证书一条命令完成签发--部署"&gt;&lt;a href="#3-lets-encrypt-%e8%af%81%e4%b9%a6%e4%b8%80%e6%9d%a1%e5%91%bd%e4%bb%a4%e5%ae%8c%e6%88%90%e7%ad%be%e5%8f%91--%e9%83%a8%e7%bd%b2" class="header-anchor"&gt;&lt;/a&gt;3. Let&amp;rsquo;s Encrypt 证书：一条命令完成签发 + 部署&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-13-1"&gt;&lt;a class="lnlinks" href="#hl-13-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-13-2"&gt;&lt;a class="lnlinks" href="#hl-13-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;certbot --nginx -d saflyer.cn -d www.saflyer.cn &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --register-unsafely-without-email --agree-tos --non-interactive&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;nginx 插件全自动完成：HTTP-01 验证（走 80 端口，无需停站，自动在 301 跳转前插入验证通路）→ 签发 → 改写 &lt;code&gt;blog.conf&lt;/code&gt;（&lt;code&gt;ssl_certificate&lt;/code&gt; 指向 &lt;code&gt;/etc/letsencrypt/live/saflyer.cn/&lt;/code&gt;，80 块顶部加两个 &lt;code&gt;# managed by Certbot&lt;/code&gt; 的 if 跳转块）→ reload。&lt;/p&gt;&#10;&lt;p&gt;证书有效期 90 天（至 2026-12-10），certbot 已注册 systemd 定时器自动续期。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;踩坑&lt;/strong&gt;：装完 certbot 后 &lt;code&gt;certbot-renew.timer&lt;/code&gt; 状态是 &lt;strong&gt;enabled 但 inactive&lt;/strong&gt;——&lt;code&gt;enabled&lt;/code&gt; 只保证开机自启，服务器没重启过它就一直没跑（&lt;code&gt;list-timers&lt;/code&gt; 里查无此项，&lt;code&gt;systemctl status&lt;/code&gt; 显示 &lt;code&gt;inactive (dead)&lt;/code&gt;）。需手动 &lt;code&gt;systemctl start certbot-renew.timer&lt;/code&gt; 启动一次，之后 &lt;code&gt;systemctl list-timers certbot-renew.timer&lt;/code&gt; 可见下次触发时间（每天两次，证书剩余 30 天内才会真正续期）。&lt;code&gt;certbot renew --dry-run&lt;/code&gt; 演练需访问 LE staging 服务器，国内网络下可能很慢，属正常现象。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h4 id="4-踩坑ip-访问不跳转--nginx-的-default_server-回退"&gt;&lt;a href="#4-%e8%b8%a9%e5%9d%91ip-%e8%ae%bf%e9%97%ae%e4%b8%8d%e8%b7%b3%e8%bd%ac--nginx-%e7%9a%84-default_server-%e5%9b%9e%e9%80%80" class="header-anchor"&gt;&lt;/a&gt;4. 踩坑：IP 访问不跳转 —— nginx 的 default_server 回退&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;现象&lt;/strong&gt;：改完 server_name 后，&lt;code&gt;https://82.157.171.92/&lt;/code&gt; 不跳转，直接返回站点内容。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：IP 访问的 &lt;code&gt;Host&lt;/code&gt; 头匹配不到任何 &lt;code&gt;server_name&lt;/code&gt;，nginx 回退到带 &lt;code&gt;default_server&lt;/code&gt; 标记的块（即 443 站点块），于是直接响应内容；且 80 块里 &lt;code&gt;return 301 https://$host$request_uri;&lt;/code&gt; 的 &lt;code&gt;$host&lt;/code&gt; 取访问者输入的主机名，IP 访问会跳回 IP 自己。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;解法&lt;/strong&gt;：加两组兜底 server 块，Host 不是域名的一律 301 到域名（域名块相应去掉 &lt;code&gt;default_server&lt;/code&gt; 标记）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-14-1"&gt;&lt;a class="lnlinks" href="#hl-14-1"&gt; 1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-2"&gt;&lt;a class="lnlinks" href="#hl-14-2"&gt; 2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-3"&gt;&lt;a class="lnlinks" href="#hl-14-3"&gt; 3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-4"&gt;&lt;a class="lnlinks" href="#hl-14-4"&gt; 4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-5"&gt;&lt;a class="lnlinks" href="#hl-14-5"&gt; 5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-6"&gt;&lt;a class="lnlinks" href="#hl-14-6"&gt; 6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-7"&gt;&lt;a class="lnlinks" href="#hl-14-7"&gt; 7&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-8"&gt;&lt;a class="lnlinks" href="#hl-14-8"&gt; 8&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-9"&gt;&lt;a class="lnlinks" href="#hl-14-9"&gt; 9&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-10"&gt;&lt;a class="lnlinks" href="#hl-14-10"&gt;10&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-11"&gt;&lt;a class="lnlinks" href="#hl-14-11"&gt;11&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-12"&gt;&lt;a class="lnlinks" href="#hl-14-12"&gt;12&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-13"&gt;&lt;a class="lnlinks" href="#hl-14-13"&gt;13&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-14"&gt;&lt;a class="lnlinks" href="#hl-14-14"&gt;14&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-15"&gt;&lt;a class="lnlinks" href="#hl-14-15"&gt;15&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-16"&gt;&lt;a class="lnlinks" href="#hl-14-16"&gt;16&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-17"&gt;&lt;a class="lnlinks" href="#hl-14-17"&gt;17&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 80 兜底：干净跳转，无警告&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt; &lt;span class="s"&gt;default_server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="s"&gt;[::]:80&lt;/span&gt; &lt;span class="s"&gt;default_server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="s"&gt;https://saflyer.cn&lt;/span&gt;&lt;span class="nv"&gt;$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 443 兜底：先用旧自签名证书完成握手，再跳转&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;default_server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="s"&gt;[::]:443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;default_server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt; &lt;span class="s"&gt;/etc/nginx/ssl/blog.crt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="s"&gt;/etc/nginx/ssl/blog.key&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="s"&gt;https://saflyer.cn&lt;/span&gt;&lt;span class="nv"&gt;$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;遗留限制&lt;/strong&gt;：&lt;code&gt;https://IP&lt;/code&gt; 跳转&lt;strong&gt;之前&lt;/strong&gt;浏览器仍会弹一次自签名警告——TLS 握手发生在 301 之前，而 CA 不给裸 IP 签证书（见 4.2），无法彻底消除。只影响还在用旧 IP 链接的人，&lt;code&gt;http://IP&lt;/code&gt; 则干净跳转。&lt;/p&gt;&#10;&lt;h4 id="5-hugo-侧同步"&gt;&lt;a href="#5-hugo-%e4%be%a7%e5%90%8c%e6%ad%a5" class="header-anchor"&gt;&lt;/a&gt;5. Hugo 侧同步&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;hugo.toml&lt;/code&gt;：&lt;code&gt;baseURL&lt;/code&gt; 改为 &lt;code&gt;https://saflyer.cn/&lt;/code&gt;（RSS/sitemap/og:image 全部跟着变）&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;layouts/_markup/render-link.html&lt;/code&gt;：外链判断加入 &lt;code&gt;saflyer.cn&lt;/code&gt;，避免站内链接被加新标签+外链图标&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;deploy.sh&lt;/code&gt;：完成提示改为域名，重跑一键部署&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="6-验证矩阵"&gt;&lt;a href="#6-%e9%aa%8c%e8%af%81%e7%9f%a9%e9%98%b5" class="header-anchor"&gt;&lt;/a&gt;6. 验证矩阵&#10;&lt;/h4&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;访问方式&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;结果&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;http://82.157.171.92/&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;301 → &lt;code&gt;https://saflyer.cn/&lt;/code&gt;（无警告）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;https://82.157.171.92/&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;一次自签名警告后 301 → &lt;code&gt;https://saflyer.cn/&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;http://saflyer.cn/&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;301 → &lt;code&gt;https://saflyer.cn/&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;https://saflyer.cn/&lt;/code&gt;、&lt;code&gt;https://www.saflyer.cn/&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;200，Let&amp;rsquo;s Encrypt 证书（issuer: YE1），无警告&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;code&gt;curl -s https://saflyer.cn/&lt;/code&gt;（不带 &lt;code&gt;-k&lt;/code&gt;）返回 200 即证书受系统信任。&lt;/p&gt;&#10;&lt;h4 id="7-可选后续"&gt;&lt;a href="#7-%e5%8f%af%e9%80%89%e5%90%8e%e7%bb%ad" class="header-anchor"&gt;&lt;/a&gt;7. 可选后续&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;主域名统一&lt;/strong&gt;：裸域与 www 二选一做 301，避免搜索引擎把两个地址当重复页面分散权重；本站 baseURL 用裸域，若统一则把 www 301 到裸域&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;HSTS&lt;/strong&gt;：受信任证书已就位，可安全开启 &lt;code&gt;add_header Strict-Transport-Security &amp;quot;max-age=31536000&amp;quot; always;&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="8-后续变动域名遭拦截回退-ip-直连2026-09-11-深夜"&gt;&lt;a href="#8-%e5%90%8e%e7%bb%ad%e5%8f%98%e5%8a%a8%e5%9f%9f%e5%90%8d%e9%81%ad%e6%8b%a6%e6%88%aa%e5%9b%9e%e9%80%80-ip-%e7%9b%b4%e8%bf%9e2026-09-11-%e6%b7%b1%e5%a4%9c" class="header-anchor"&gt;&lt;/a&gt;8. 后续变动：域名遭拦截，回退 IP 直连（2026-09-11 深夜）&#10;&lt;/h4&gt;&lt;p&gt;域名上线数小时后访问突然全挂。排查证据：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;测试&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;结果&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;TCP 连接 82.157.171.92:443&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;能连上&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;TLS 握手带 SNI=saflyer.cn&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;一发送即 Connection reset by peer&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;同 IP 同端口、SNI 不带域名&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;正常 200&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;http://域名（Host 头带域名）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;被拦（异常 302），数小时后间歇恢复 301&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;服务器本机自测 / fail2ban / nginx&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;全部正常&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：链路上的设备按&lt;strong&gt;域名&lt;/strong&gt;精准拦截（TLS SNI / HTTP Host 检测），是境内云厂商对&lt;strong&gt;未备案域名&lt;/strong&gt;的准入拦截特征；服务器与配置本身无问题。域名刚解析时检测系统有延迟所以能通，被发现后即遭拦截，且拦截规则刷新是逐步的（80 先恢复、443 仍被拦）。ICP 备案流程较长，决定暂回退 IP 直连；域名侧配置全部保留，备案通过后无需改配置即可恢复。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;注意：「跳转域名失败再自动跳回 IP」在服务端做不到——拦截发生在 TLS 握手阶段，nginx 根本看不到该请求，只能由用户手动选择可用入口。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;回退后的最终架构：&lt;code&gt;blog.conf&lt;/code&gt; 共 4 个 server 块；站点公共配置抽为 &lt;code&gt;/etc/nginx/blog-site-common.conf&lt;/code&gt;，被两个 443 块 &lt;code&gt;include&lt;/code&gt;，避免重复维护（本地同名文件备份，已纳入 deploy.sh 的 git 备份清单）。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;访问方式&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;行为&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;http://82.157.171.92/&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;301 → &lt;code&gt;https://82.157.171.92/&lt;/code&gt;（不跳域名）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;https://82.157.171.92/&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;自签名证书，&lt;code&gt;default_server&lt;/code&gt; 直接出站点&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;http://saflyer.cn/&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;301 → &lt;code&gt;https://saflyer.cn/&lt;/code&gt;（配置保留）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;https://saflyer.cn/&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;LE 证书正式站点（外部被拦期间仅服务器本机可达，已带 SNI 自测 200）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;同步改动：&lt;code&gt;hugo.toml&lt;/code&gt; 的 &lt;code&gt;baseURL&lt;/code&gt; 改回 &lt;code&gt;https://82.157.171.92/&lt;/code&gt;；certbot 自动续期不受影响（验证走 80 端口域名块，该块已保留）。&lt;/p&gt;&#10;&lt;h4 id="9-后续变动二icp-备案通过恢复域名主入口2026-09-20"&gt;&lt;a href="#9-%e5%90%8e%e7%bb%ad%e5%8f%98%e5%8a%a8%e4%ba%8cicp-%e5%a4%87%e6%a1%88%e9%80%9a%e8%bf%87%e6%81%a2%e5%a4%8d%e5%9f%9f%e5%90%8d%e4%b8%bb%e5%85%a5%e5%8f%a32026-09-20" class="header-anchor"&gt;&lt;/a&gt;9. 后续变动二：ICP 备案通过，恢复域名主入口（2026-09-20）&#10;&lt;/h4&gt;&lt;p&gt;备案审核通过，按&amp;quot;备案后恢复&amp;quot;预案把回退的三处原样改回，全程约 10 分钟：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;blog.conf&lt;/code&gt; 两个 IP 兜底块恢复为 &lt;code&gt;return 301 https://saflyer.cn$request_uri;&lt;/code&gt;（443 块保留自签名证书仅用于握手，随后 reload nginx）&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;hugo.toml&lt;/code&gt; 的 &lt;code&gt;baseURL&lt;/code&gt; 改回 &lt;code&gt;https://saflyer.cn/&lt;/code&gt;，重跑 &lt;code&gt;deploy.sh&lt;/code&gt;（sitemap/RSS/canonical 全部跟随）&lt;/li&gt;&#10;&lt;li&gt;验证矩阵回到本节第 6 小节的状态：&lt;code&gt;http://IP&lt;/code&gt; 干净 301 到域名；&lt;code&gt;https://IP&lt;/code&gt; 一次自签名警告后 301；域名 443 不带 &lt;code&gt;-k&lt;/code&gt; 直接 200&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;域名侧 nginx 配置、Let&amp;rsquo;s Encrypt 证书、certbot 续期全程未动、直接可用——回退时&amp;quot;配置全部保留，备案后无需改配置即可恢复&amp;quot;的设计兑现了价值。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="四点五接入评论系统-giscus实际执行记录"&gt;&lt;a href="#%e5%9b%9b%e7%82%b9%e4%ba%94%e6%8e%a5%e5%85%a5%e8%af%84%e8%ae%ba%e7%b3%bb%e7%bb%9f-giscus%e5%ae%9e%e9%99%85%e6%89%a7%e8%a1%8c%e8%ae%b0%e5%bd%95" class="header-anchor"&gt;&lt;/a&gt;四点五、接入评论系统 giscus（实际执行记录）&#10;&lt;/h2&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;静态博客没有后端，评论数据寄存在第三方。选型结论：技术博客用 &lt;strong&gt;giscus&lt;/strong&gt;（评论存在自己 GitHub 仓库的 Discussions 里），零成本、零后端、Stack 主题原生支持。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="451-选型对比为什么不用别的"&gt;&lt;a href="#451-%e9%80%89%e5%9e%8b%e5%af%b9%e6%af%94%e4%b8%ba%e4%bb%80%e4%b9%88%e4%b8%8d%e7%94%a8%e5%88%ab%e7%9a%84" class="header-anchor"&gt;&lt;/a&gt;4.5.1 选型对比（为什么不用别的）&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;方案&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;数据存哪&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;访客门槛&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;结论&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;giscus&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;自己 GitHub 仓库的 Discussions&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;GitHub 登录&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅ 采用：零后端零成本，主题原生支持&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;utterances&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;GitHub Issues&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;GitHub 登录&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;备选，思路同 giscus&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Twikoo&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;腾讯云开发&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;可匿名&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;想开放匿名评论再换，迁移成本低&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Waline&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;LeanCloud/自建&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;可匿名&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;要维护服务端，放弃&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Disqus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Disqus 云端&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;可匿名&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;❌ 国内访问不了&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="452-github-侧操作一次性约-10-分钟"&gt;&lt;a href="#452-github-%e4%be%a7%e6%93%8d%e4%bd%9c%e4%b8%80%e6%ac%a1%e6%80%a7%e7%ba%a6-10-%e5%88%86%e9%92%9f" class="header-anchor"&gt;&lt;/a&gt;4.5.2 GitHub 侧操作（一次性，约 10 分钟）&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;建&lt;strong&gt;公开&lt;/strong&gt;仓库 &lt;code&gt;blog-comments&lt;/code&gt;（必须 Public，勾选 Add a README 让仓库非空）&lt;/li&gt;&#10;&lt;li&gt;仓库 &lt;strong&gt;Settings → Features → 勾选 Discussions&lt;/strong&gt;（默认不开）&lt;/li&gt;&#10;&lt;li&gt;安装 giscus App：https://github.com/apps/giscus → Install → &lt;strong&gt;Only select repositories&lt;/strong&gt; → 只授权 &lt;code&gt;blog-comments&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;到 &lt;a href="https://giscus.app/zh-CN" target="_blank" rel="noopener noreferrer" class="external-link"&gt;https://giscus.app/zh-CN&lt;span class="external-icon"&gt;↗&lt;/span&gt;&lt;/a&gt; 生成参数：&#10;&lt;ul&gt;&#10;&lt;li&gt;仓库填 &lt;code&gt;用户名/blog-comments&lt;/code&gt;，出现 ✅ 才继续&lt;/li&gt;&#10;&lt;li&gt;Discussion 分类选 &lt;strong&gt;Announcements&lt;/strong&gt;（只有仓库主能发起新帖，最干净）&lt;/li&gt;&#10;&lt;li&gt;复制底部生成代码里的 4 个值：&lt;code&gt;data-repo&lt;/code&gt; / &lt;code&gt;data-repo-id&lt;/code&gt; / &lt;code&gt;data-category&lt;/code&gt; / &lt;code&gt;data-category-id&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;说明：&lt;code&gt;repo-id&lt;/code&gt; 和 &lt;code&gt;category-id&lt;/code&gt; 是公开标识符（本来就嵌在网页源码里），不属于敏感信息，可以出现在本文中——本文也只做占位化展示。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="453-hugo-侧配置hugotoml"&gt;&lt;a href="#453-hugo-%e4%be%a7%e9%85%8d%e7%bd%aehugotoml" class="header-anchor"&gt;&lt;/a&gt;4.5.3 Hugo 侧配置（hugo.toml）&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-15-1"&gt;&lt;a class="lnlinks" href="#hl-15-1"&gt; 1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-2"&gt;&lt;a class="lnlinks" href="#hl-15-2"&gt; 2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-3"&gt;&lt;a class="lnlinks" href="#hl-15-3"&gt; 3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-4"&gt;&lt;a class="lnlinks" href="#hl-15-4"&gt; 4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-5"&gt;&lt;a class="lnlinks" href="#hl-15-5"&gt; 5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-6"&gt;&lt;a class="lnlinks" href="#hl-15-6"&gt; 6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-7"&gt;&lt;a class="lnlinks" href="#hl-15-7"&gt; 7&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-8"&gt;&lt;a class="lnlinks" href="#hl-15-8"&gt; 8&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-9"&gt;&lt;a class="lnlinks" href="#hl-15-9"&gt; 9&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-10"&gt;&lt;a class="lnlinks" href="#hl-15-10"&gt;10&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-11"&gt;&lt;a class="lnlinks" href="#hl-15-11"&gt;11&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-12"&gt;&lt;a class="lnlinks" href="#hl-15-12"&gt;12&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-13"&gt;&lt;a class="lnlinks" href="#hl-15-13"&gt;13&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-14"&gt;&lt;a class="lnlinks" href="#hl-15-14"&gt;14&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-15"&gt;&lt;a class="lnlinks" href="#hl-15-15"&gt;15&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-16"&gt;&lt;a class="lnlinks" href="#hl-15-16"&gt;16&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-17"&gt;&lt;a class="lnlinks" href="#hl-15-17"&gt;17&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;enabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;provider&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;giscus&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;giscus&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;repo&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;用户名&amp;gt;/blog-comments&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;repoID&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;你的 repo-id&amp;gt;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;category&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Announcements&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;categoryID&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;你的 category-id&amp;gt;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;mapping&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pathname&amp;#39;&lt;/span&gt; &lt;span class="c"&gt;# 每篇文章按路径对应一条 Discussion&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;strict&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;reactionsEnabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="c"&gt;# 允许表情点赞&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;emitMetadata&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;inputPosition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;bottom&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;lightTheme&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;light&amp;#39;&lt;/span&gt; &lt;span class="c"&gt;# 跟随博客明/暗双主题&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;darkTheme&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;dark_dimmed&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;lang&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;zh-CN&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;loading&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;lazy&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;填完重跑 &lt;code&gt;deploy.sh&lt;/code&gt; 即可，无需改任何代码。&lt;/p&gt;&#10;&lt;h3 id="454-日常使用与运维"&gt;&lt;a href="#454-%e6%97%a5%e5%b8%b8%e4%bd%bf%e7%94%a8%e4%b8%8e%e8%bf%90%e7%bb%b4" class="header-anchor"&gt;&lt;/a&gt;4.5.4 日常使用与运维&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;发评论&lt;/strong&gt;：访客在文章页底部用 GitHub 登录后评论（首条评论自动建 Discussion 帖）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;管理评论&lt;/strong&gt;：在 GitHub 仓库的 Discussions 页面删帖/锁帖/置顶，改动实时同步到博客&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;验证&lt;/strong&gt;：&lt;code&gt;curl&lt;/code&gt; 文章页 HTML 里应有 &lt;code&gt;giscus.app/client.js&lt;/code&gt; 和正确的 &lt;code&gt;data-repo&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;不想用某篇文章的评论：该文章 front matter 加 &lt;code&gt;comments: false&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="五日常运维速查"&gt;&lt;a href="#%e4%ba%94%e6%97%a5%e5%b8%b8%e8%bf%90%e7%bb%b4%e9%80%9f%e6%9f%a5" class="header-anchor"&gt;&lt;/a&gt;五、日常运维速查&#10;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-16-1"&gt;&lt;a class="lnlinks" href="#hl-16-1"&gt; 1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-16-2"&gt;&lt;a class="lnlinks" href="#hl-16-2"&gt; 2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-16-3"&gt;&lt;a class="lnlinks" href="#hl-16-3"&gt; 3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-16-4"&gt;&lt;a class="lnlinks" href="#hl-16-4"&gt; 4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-16-5"&gt;&lt;a class="lnlinks" href="#hl-16-5"&gt; 5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-16-6"&gt;&lt;a class="lnlinks" href="#hl-16-6"&gt; 6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-16-7"&gt;&lt;a class="lnlinks" href="#hl-16-7"&gt; 7&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-16-8"&gt;&lt;a class="lnlinks" href="#hl-16-8"&gt; 8&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-16-9"&gt;&lt;a class="lnlinks" href="#hl-16-9"&gt; 9&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-16-10"&gt;&lt;a class="lnlinks" href="#hl-16-10"&gt;10&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-16-11"&gt;&lt;a class="lnlinks" href="#hl-16-11"&gt;11&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-16-12"&gt;&lt;a class="lnlinks" href="#hl-16-12"&gt;12&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 更新文章（本地）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/Users/wyf/work/boke/deploy.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 服务器侧&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nginx -t &lt;span class="c1"&gt;# 改配置后必做&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl reload nginx &lt;span class="c1"&gt;# 平滑重载（不断连）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tail -f /var/log/nginx/access.log &lt;span class="c1"&gt;# 访问日志&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tail -f /var/log/nginx/error.log &lt;span class="c1"&gt;# 错误日志&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;certbot renew &lt;span class="c1"&gt;# 手动续期证书（一般不需要，有定时器）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 本地预览（改主题/配置时先本地看效果）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /Users/wyf/work/boke/blog &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; hugo server -D &lt;span class="c1"&gt;# http://localhost:1313/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="六遗留事项"&gt;&lt;a href="#%e5%85%ad%e9%81%97%e7%95%99%e4%ba%8b%e9%a1%b9" class="header-anchor"&gt;&lt;/a&gt;六、遗留事项&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; &lt;del&gt;GitHub 社交链接占位&lt;/del&gt; 已改为真实地址 &lt;code&gt;github.com/iyongfei&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; &lt;del&gt;未接评论系统&lt;/del&gt; 已接入 giscus（见 4.5 节），评论存于 GitHub Discussions&lt;/li&gt;&#10;&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; &lt;del&gt;HTTPS 未启用&lt;/del&gt; 自签名证书已部署（见第四章），443 已放行，80 已 301 跳转&lt;/li&gt;&#10;&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; &lt;del&gt;有域名后切换 Let&amp;rsquo;s Encrypt 受信任证书&lt;/del&gt; saflyer.cn 已上线，LE 证书已部署（见 4.9 节）&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; saflyer.cn 完成 ICP 备案后恢复域名为主入口（4.9 节第 8 条；域名配置已保留，届时只需把 baseURL 改回域名）&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 主域名统一：www 与裸域二选一 301（4.9 节第 7 条，备案后处理）&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 开启 HSTS（4.9 节第 7 条，备案后处理）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="七上线后的持续优化记录2026-09-11-下午"&gt;&lt;a href="#%e4%b8%83%e4%b8%8a%e7%ba%bf%e5%90%8e%e7%9a%84%e6%8c%81%e7%bb%ad%e4%bc%98%e5%8c%96%e8%ae%b0%e5%bd%952026-09-11-%e4%b8%8b%e5%8d%88" class="header-anchor"&gt;&lt;/a&gt;七、上线后的持续优化记录（2026-09-11 下午）&#10;&lt;/h2&gt;&lt;h3 id="71-部署流水线升级"&gt;&lt;a href="#71-%e9%83%a8%e7%bd%b2%e6%b5%81%e6%b0%b4%e7%ba%bf%e5%8d%87%e7%ba%a7" class="header-anchor"&gt;&lt;/a&gt;7.1 部署流水线升级&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;rsync 增量部署&lt;/strong&gt;替代 scp 全量覆盖：&lt;code&gt;rsync -az --delete&lt;/code&gt;，只传变化文件，秒级完成&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;文章自动扫描&lt;/strong&gt;：&lt;code&gt;deploy.sh&lt;/code&gt; 不再硬编码文章，自动扫描目录所有 md；元数据登记在 &lt;code&gt;articles.conf&lt;/code&gt;，内部文档（如周报）用 &lt;code&gt;articles.ignore&lt;/code&gt; 排除&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Git 自动备份&lt;/strong&gt;：每次部署自动提交并推送到 GitHub 私有仓库；&lt;code&gt;.gitignore&lt;/code&gt; 隔离含密码的 expect 脚本；仓库级 git 身份与公司 GitLab 全局配置隔离&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="72-传输性能"&gt;&lt;a href="#72-%e4%bc%a0%e8%be%93%e6%80%a7%e8%83%bd" class="header-anchor"&gt;&lt;/a&gt;7.2 传输性能&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;HTTP/2&lt;/strong&gt;：&lt;code&gt;listen 443 ssl http2;&lt;/code&gt;（注意 nginx 1.25 以下写法的 &lt;code&gt;http2&lt;/code&gt; 在 listen 里，1.25+ 才是 &lt;code&gt;http2 on;&lt;/code&gt;），实测 ALPN 协商到 h2&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Brotli 压缩&lt;/strong&gt;：&lt;code&gt;dnf install nginx-mod-brotli&lt;/code&gt;（EPEL），&lt;code&gt;brotli on;&lt;/code&gt; 比 gzip 再省 15~20%，实测 &lt;code&gt;content-encoding: br&lt;/code&gt;。踩坑：dnf 包已自动在 &lt;code&gt;/usr/share/nginx/modules/mod-brotli.conf&lt;/code&gt; 加载模块，手动再写 &lt;code&gt;load_module&lt;/code&gt; 会报重复加载&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;图片 WebP&lt;/strong&gt;：头像 53KB→11KB（-80%），封面全转 WebP；og:image 保留 PNG 保证微信/微博分享兼容&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;资源提示&lt;/strong&gt;：主 CSS 加 &lt;code&gt;preload&lt;/code&gt;；giscus/不蒜子等外部域名加 &lt;code&gt;preconnect&lt;/code&gt;/&lt;code&gt;dns-prefetch&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="73-自建访问量统计"&gt;&lt;a href="#73-%e8%87%aa%e5%bb%ba%e8%ae%bf%e9%97%ae%e9%87%8f%e7%bb%9f%e8%ae%a1" class="header-anchor"&gt;&lt;/a&gt;7.3 自建访问量统计&#10;&lt;/h3&gt;&lt;p&gt;不蒜子只能统计「当前页面」，无法实现列表页显示每篇文章阅读量。自建方案：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-17-1"&gt;&lt;a class="lnlinks" href="#hl-17-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;浏览器 JS → nginx /api/counter 反代 → Python 计数服务(127.0.0.1:8901) → counter.json&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;50 行 Python 标准库实现，systemd 托管，详情页计数、列表页批量只读查询，sessionStorage 防刷新刷量。详见独立文章《50 行 Python 给静态博客加访问量统计》。&lt;/p&gt;&#10;&lt;h3 id="74-安全防护"&gt;&lt;a href="#74-%e5%ae%89%e5%85%a8%e9%98%b2%e6%8a%a4" class="header-anchor"&gt;&lt;/a&gt;7.4 安全防护&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;排查发现服务器 24 小时内遭 &lt;strong&gt;397 次 SSH 密码爆破&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;部署 fail2ban（10 分钟失败 5 次封 24 小时），踩坑：Rocky 9 的 SSH 日志在 systemd journal 需 &lt;code&gt;backend = systemd&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;详见独立文章《服务器防爆破实战：fail2ban 部署全记录》&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="75-交互与视觉主题定制"&gt;&lt;a href="#75-%e4%ba%a4%e4%ba%92%e4%b8%8e%e8%a7%86%e8%a7%89%e4%b8%bb%e9%a2%98%e5%ae%9a%e5%88%b6" class="header-anchor"&gt;&lt;/a&gt;7.5 交互与视觉（主题定制）&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;特效：粒子星空背景、多句轮换打字机签名、标题渐变流光、卡片入场/3D 倾斜、封面视差滚动、暗色切换圆形扩散（View Transitions API）、点击飘字&lt;/li&gt;&#10;&lt;li&gt;功能：阅读进度条、悬浮迷你目录、代码行号、图片 Lightbox、外链自动新标签+图标、文末分享卡、终端风关于页&lt;/li&gt;&#10;&lt;li&gt;实现方式：Stack 主题的 &lt;code&gt;assets/scss/custom.scss&lt;/code&gt; + &lt;code&gt;layouts/_partials/footer/custom.html&lt;/code&gt; + 模板覆盖，&lt;strong&gt;不改主题源码&lt;/strong&gt;，主题升级不丢&lt;/li&gt;&#10;&lt;li&gt;踩坑：主题主色变量是 &lt;code&gt;--accent-color&lt;/code&gt; 不是 &lt;code&gt;--accent&lt;/code&gt;，写错会导致按钮白字白底「隐形」&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item></channel></rss>