<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>小鱼人的博客</title><description>技术 · 运维 · 随笔</description><link>https://blog.727221.xyz/</link><templateTheme>Firefly</templateTheme><templateThemeVersion>6.15.0</templateThemeVersion><templateThemeUrl>https://github.com/CuteLeaf/Firefly</templateThemeUrl><lastBuildDate>2026年7月26日 16:16:03</lastBuildDate><item><title>人类 AI 发展脉络：从图灵测试到大模型时代</title><link>https://blog.727221.xyz/posts/2026-07-26-ai-history-timeline/</link><guid isPermaLink="true">https://blog.727221.xyz/posts/2026-07-26-ai-history-timeline/</guid><description>一张时间轴 + 四张示意图，系统梳理人工智能七十年主线：符号主义、统计学习、深度学习、Transformer 与当代能力栈。</description><pubDate>Sun, 26 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;本文面向希望建立「大地图」的读者：不堆砌八卦，而把 &lt;strong&gt;问题定义、方法范式、数据与算力条件、工程化拐点&lt;/strong&gt; 串成一条可读主线。配图为教学向示意图，便于快速建立直觉。&lt;/p&gt;&lt;/blockquote&gt;
&lt;section&gt;&lt;h2&gt;写在前面：AI 不是一条直线&lt;a href=&quot;#写在前面ai-不是一条直线&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;人们常说「AI 终于爆发了」。更准确的说法是：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;问题一直在&lt;/strong&gt;（如何让机器完成感知、推理、语言、决策）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;范式换了好几次&lt;/strong&gt;（符号 → 统计 → 深度表示 → 大规模预训练）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;真正撬动曲线的，往往是数据、算力、算法与工程同时成熟&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;把历史读成「英雄发明清单」容易失真；把它读成 &lt;strong&gt;约束条件下的方法迁移&lt;/strong&gt;，会更有用。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/assets/images/ai-history/timeline.svg&quot; alt=&quot;人类 AI 发展脉络时间轴&quot; /&gt;&lt;figcaption&gt;人类 AI 发展脉络时间轴&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;图 1：七十年主线时间轴（教学简化）&lt;/em&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;一、起源：智能能否被计算？（1950–1956）&lt;a href=&quot;#一起源智能能否被计算19501956&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1.1 图灵与「机器能否思考」&lt;a href=&quot;#11-图灵与机器能否思考&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;1950 年，Alan Turing 在 &lt;em&gt;Computing Machinery and Intelligence&lt;/em&gt; 中提出后来俗称的 &lt;strong&gt;图灵测试&lt;/strong&gt;：与其争论「机器有没有心灵」，不如问「机器的语言行为能否在对话中与人难分」。&lt;/p&gt;&lt;p&gt;这一定义非常工程化——它把哲学问题改写成了 &lt;strong&gt;可观测的行为判据&lt;/strong&gt;。尽管后来学界对「通过图灵测试 = 真正智能」有大量批评，但它奠定了现代 AI 讨论的公共语汇。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;1.2 达特茅斯会议：AI 作为学科诞生&lt;a href=&quot;#12-达特茅斯会议ai-作为学科诞生&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;1956 年 Dartmouth 研讨会被广泛视为 &lt;strong&gt;人工智能学科命名与立项的节点&lt;/strong&gt;。早期议程雄心勃勃：语言、抽象、自我改进、创造力……都写在愿景里。&lt;/p&gt;&lt;p&gt;早期乐观来自一个强假设：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;智能的核心是 &lt;strong&gt;符号操作&lt;/strong&gt;；只要找到正确的表示与规则，机器就能复现理性。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这一假设开启了符号主义的黄金期，也埋下了第一次幻灭的种子。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二、第一次浪潮：感知机、符号主义与寒冬（1957–1970s）&lt;a href=&quot;#二第一次浪潮感知机符号主义与寒冬19571970s&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;2.1 连接主义的早产儿：感知机&lt;a href=&quot;#21-连接主义的早产儿感知机&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Rosenblatt 的 &lt;strong&gt;Perceptron&lt;/strong&gt; 展示了「从样例中学习权重」的可能。它激起媒体热情，也引发严肃争论：单层感知机的表达能力边界是什么？&lt;/p&gt;&lt;p&gt;Minsky 与 Papert 的分析让学界更清醒：&lt;strong&gt;没有隐藏层的线性分类器&lt;/strong&gt;无法处理一类非线性可分问题。这对当时硬件与训练方法条件下的神经网络是沉重打击，连接主义进入漫长低潮。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2 符号主义的高光与裂痕&lt;a href=&quot;#22-符号主义的高光与裂痕&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;同一时期，搜索、逻辑证明、早期自然语言与博弈程序在受限领域取得进展。人们逐渐形成一种「高层智能 = 搜索 + 知识 + 启发式」的图景。&lt;/p&gt;&lt;p&gt;但现实很快给出反馈：&lt;/p&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;承诺&lt;/th&gt;&lt;th&gt;现实约束&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;通用推理&lt;/td&gt;&lt;td&gt;组合爆炸，搜索空间失控&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;常识理解&lt;/td&gt;&lt;td&gt;常识极难形式化&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;鲁棒交互&lt;/td&gt;&lt;td&gt;噪声、歧义、开放世界&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;于是出现了第一次 &lt;strong&gt;AI Winter&lt;/strong&gt;：资金与预期回落，研究转向更可验证的子问题。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三、专家系统：知识工程的兴衰（约 1980s）&lt;a href=&quot;#三专家系统知识工程的兴衰约-1980s&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;3.1 把专家经验编成规则&lt;a href=&quot;#31-把专家经验编成规则&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;第二波高潮来自 &lt;strong&gt;专家系统&lt;/strong&gt;：在医学诊断、配置、故障排查等窄域任务上，把专家启发式写成规则库，配合推理引擎给出建议。&lt;/p&gt;&lt;p&gt;它的工程价值真实存在：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;可审计（规则可解释）；&lt;/li&gt;
&lt;li&gt;可迭代（专家可增补规则）；&lt;/li&gt;
&lt;li&gt;在封闭业务里 ROI 明确。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.2 为什么又冷了？&lt;a href=&quot;#32-为什么又冷了&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;核心瓶颈被称为 &lt;strong&gt;知识获取瓶颈（knowledge acquisition bottleneck）&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;专家自己也说不清全部直觉；&lt;/li&gt;
&lt;li&gt;规则数量膨胀后冲突与维护成本爆炸；&lt;/li&gt;
&lt;li&gt;离开训练域就脆弱；&lt;/li&gt;
&lt;li&gt;与感知（视觉、语音）脱节。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;当维护成本超过收益，第二次寒冬接踵而至。教训很尖锐：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;可解释的手工知识&lt;/strong&gt;很珍贵，但很难 scale。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;四、统计机器学习：从「写规则」到「估分布」（1990s–2011）&lt;a href=&quot;#四统计机器学习从写规则到估分布1990s2011&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;互联网与数字化把「数据」变成新石油。研究重心从「如何编码知识」转向：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;给定特征与标签，如何学习一个泛化良好的函数？&lt;/p&gt;&lt;/blockquote&gt;&lt;section&gt;&lt;h3&gt;4.1 代表性工具箱&lt;a href=&quot;#41-代表性工具箱&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;支持向量机（SVM）&lt;/strong&gt;：间隔最大化与核方法；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;概率图模型&lt;/strong&gt;：用图结构表达条件独立；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;集成树模型&lt;/strong&gt;：Boosting / Random Forest 在表格数据上极强；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;序列与语音早期系统&lt;/strong&gt;：HMM 等。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.2 关键变化：评测与可复现&lt;a href=&quot;#42-关键变化评测与可复现&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这一时期形成了现代 ML 文化：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;训练集 / 验证集 / 测试集分离；&lt;/li&gt;
&lt;li&gt;基准数据集与排行榜；&lt;/li&gt;
&lt;li&gt;正则化、偏差-方差权衡成为共同语言。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;但也有天花板：&lt;strong&gt;特征工程&lt;/strong&gt;往往决定上限。视觉里手工 SIFT，NLP 里 n-gram 与语言学特征，都高度依赖专家经验。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/assets/images/ai-history/paradigms.svg&quot; alt=&quot;三条技术主线对比&quot; /&gt;&lt;figcaption&gt;三条技术主线对比&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;图 2：符号主义 / 统计学习 / 深度学习——三条主线对照&lt;/em&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;五、深度学习革命：表示学习重回舞台（2012–2016）&lt;a href=&quot;#五深度学习革命表示学习重回舞台20122016&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;5.1 ImageNet 时刻&lt;a href=&quot;#51-imagenet-时刻&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;2012 年，深度卷积网络在 ImageNet 上取得突破性优势，被广泛视为 &lt;strong&gt;深度学习进入主舞台&lt;/strong&gt; 的信号。关键不只是「多层」，而是：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;GPU 使大规模矩阵运算可行；&lt;/li&gt;
&lt;li&gt;大规模标注数据出现；&lt;/li&gt;
&lt;li&gt;更好的初始化、非线性、正则与优化实践。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;CNN 证明：&lt;strong&gt;层次化特征可以自动学习&lt;/strong&gt;——底层边缘，中层部件，高层语义。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5.2 序列智能：从 RNN/LSTM 到机器翻译&lt;a href=&quot;#52-序列智能从-rnnlstm-到机器翻译&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;语音识别与神经机器翻译迅速跟进。LSTM/GRU 缓解了长程依赖训练困难，seq2seq 与 attention 雏形让「编码器-解码器」成为标准范式。&lt;/p&gt;&lt;p&gt;此时行业形成共识：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;在感知与序列任务上，&lt;strong&gt;端到端深度模型&lt;/strong&gt;开始系统性超过传统流水线。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;但 RNN 仍受限于逐步计算与长程信息压缩；真正的结构革命还在后面。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;六、Transformer 与大模型时代（2017–今）&lt;a href=&quot;#六transformer-与大模型时代2017今&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;6.1 Attention Is All You Need&lt;a href=&quot;#61-attention-is-all-you-need&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;2017 年 Transformer 提出后，核心思想可概括为：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;用 &lt;strong&gt;自注意力&lt;/strong&gt; 让任意位置直接交互；&lt;/li&gt;
&lt;li&gt;高度并行，吃得下超大规模数据；&lt;/li&gt;
&lt;li&gt;通过堆叠层数扩展表示能力。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;它先征服 NLP，再扩展到视觉（ViT）、多模态、语音、甚至部分科学计算场景。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/assets/images/ai-history/transformer.svg&quot; alt=&quot;Transformer 简化示意&quot; /&gt;&lt;figcaption&gt;Transformer 简化示意&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;图 3：Transformer 教学简化图&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6.2 预训练范式：先学世界，再学任务&lt;a href=&quot;#62-预训练范式先学世界再学任务&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;BERT、GPT 系列等工作把路线推到新阶段：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;预训练&lt;/strong&gt;：在海量无标注/弱标注文本上学习通用表示与生成；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;适配&lt;/strong&gt;：微调、提示学习、指令微调；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对齐&lt;/strong&gt;：让模型更好遵循人类意图与安全约束（如 SFT、RLHF、各类偏好优化）。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;「大模型」不是单一算法名，而是一套 &lt;strong&gt;规模法则 + 数据工程 + 后训练 + 产品化&lt;/strong&gt; 的系统工程。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6.3 从聊天到系统：工具、RAG 与智能体&lt;a href=&quot;#63-从聊天到系统工具rag-与智能体&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;当模型具备较强语言与推理接口后，系统形态快速变化：&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;能力&lt;/th&gt;&lt;th&gt;意义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;工具调用&lt;/td&gt;&lt;td&gt;连接搜索、代码执行、API&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;RAG&lt;/td&gt;&lt;td&gt;用外部知识补长尾与时效&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;工作流 / 多智能体&lt;/td&gt;&lt;td&gt;把复杂任务拆成可监控步骤&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;多模态&lt;/td&gt;&lt;td&gt;图文音视统一接口&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;AI 越来越像 &lt;strong&gt;可编排的认知组件&lt;/strong&gt;，而不只是单次补全的文本生成器。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/assets/images/ai-history/stack.svg&quot; alt=&quot;当代 AI 能力栈&quot; /&gt;&lt;figcaption&gt;当代 AI 能力栈&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;图 4：从基础设施到智能体的能力分层&lt;/em&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;七、主线之外：不可忽略的支流&lt;a href=&quot;#七主线之外不可忽略的支流&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;完整图景还应包括（此处点到为止）：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;强化学习&lt;/strong&gt;：从游戏与控制到作为后训练工具；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;概率与因果&lt;/strong&gt;：不只预测相关，还试图回答干预与反事实；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;神经符号结合&lt;/strong&gt;：把可微学习与规则/求解器拼接；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可信 AI&lt;/strong&gt;：鲁棒性、隐私、公平、可解释、对齐与治理。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;历史反复提醒：单一路线很少永久通吃，&lt;strong&gt;混合系统&lt;/strong&gt;会在工程上不断回来。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;八、一张表看懂「每次跃迁靠什么」&lt;a href=&quot;#八一张表看懂每次跃迁靠什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;阶段&lt;/th&gt;&lt;th&gt;核心假设&lt;/th&gt;&lt;th&gt;关键燃料&lt;/th&gt;&lt;th&gt;典型失败模式&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;符号 AI&lt;/td&gt;&lt;td&gt;智能=符号推理&lt;/td&gt;&lt;td&gt;专家知识&lt;/td&gt;&lt;td&gt;常识与开放世界&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;专家系统&lt;/td&gt;&lt;td&gt;领域规则可穷尽&lt;/td&gt;&lt;td&gt;知识工程人力&lt;/td&gt;&lt;td&gt;维护爆炸&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;统计 ML&lt;/td&gt;&lt;td&gt;数据可估计函数&lt;/td&gt;&lt;td&gt;特征 + 标注&lt;/td&gt;&lt;td&gt;表示瓶颈&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;深度学习&lt;/td&gt;&lt;td&gt;层次表示可学&lt;/td&gt;&lt;td&gt;GPU + 大数据&lt;/td&gt;&lt;td&gt;数据偏差、脆弱&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;大模型&lt;/td&gt;&lt;td&gt;规模带来通才接口&lt;/td&gt;&lt;td&gt;算力/数据/工程&lt;/td&gt;&lt;td&gt;幻觉、成本、治理&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;九、给读者的阅读地图（如何继续深挖）&lt;a href=&quot;#九给读者的阅读地图如何继续深挖&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;若你想建立可操作的知识树，建议按层学习：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;问题：感知 / 语言 / 决策&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;表示：特征 or 端到端&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;学习：监督 / 自监督 / 强化&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;系统：数据工程 + 训练 + 推理&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;对齐与安全&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;应用：工具 / RAG / Agent&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;问题：感知 / 语言 / 决策&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;表示：特征 or 端到端&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;学习：监督 / 自监督 / 强化&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;系统：数据工程 + 训练 + 推理&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;对齐与安全&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;应用：工具 / RAG / Agent&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;先懂损失与泛化&lt;/strong&gt;（过拟合、正则、验证）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;再懂深度网络训练&lt;/strong&gt;（反向传播、优化器、归一化）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;再懂序列与注意力&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最后才是分布式训练、推理优化与产品化&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;跳过前三层直接「追最强模型名」，容易只剩名词。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;十、结语：下一次跃迁可能在哪里？&lt;a href=&quot;#十结语下一次跃迁可能在哪里&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;没有人能精确预言，但可以从历史外推观察点：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;数据质量与合成数据&lt;/strong&gt;能否继续支撑规模；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;推理期计算&lt;/strong&gt;（test-time compute）如何改写能力曲线；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多模态世界模型&lt;/strong&gt;能否更好连接行动；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可靠性与治理&lt;/strong&gt;是否成为比刷榜更硬的门槛；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;人机协作界面&lt;/strong&gt;——AI 是否成为默认的认知基础设施。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;对个人学习者，最稳的策略不是赌单一路线，而是：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;掌握不变的基础（概率、优化、系统、评测），再快速迁移到新架构。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;参考与延伸（公开文献线索）&lt;a href=&quot;#参考与延伸公开文献线索&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Turing, &lt;em&gt;Computing Machinery and Intelligence&lt;/em&gt;（1950）&lt;/li&gt;
&lt;li&gt;Dartmouth AI 提案与早期符号主义综述&lt;/li&gt;
&lt;li&gt;专家系统与知识工程教材章节&lt;/li&gt;
&lt;li&gt;ImageNet / AlexNet 相关工作（2012 前后）&lt;/li&gt;
&lt;li&gt;Vaswani et al., &lt;em&gt;Attention Is All You Need&lt;/em&gt;（2017）&lt;/li&gt;
&lt;li&gt;预训练语言模型与对齐技术综述（BERT/GPT 路线及后续）&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;注：本文为科普向历史梳理，重点在结构与因果，不涉及未公开技术细节，也不对特定商业产品做排名背书。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;—— 小鱼人&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>博客上线：小鱼人的角落</title><link>https://blog.727221.xyz/posts/hello-blog/</link><guid isPermaLink="true">https://blog.727221.xyz/posts/hello-blog/</guid><description>blog.727221.xyz 正式上线，基于 Firefly（Astro）静态主题。</description><pubDate>Sat, 25 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;你好，这里是 &lt;strong&gt;小鱼人&lt;/strong&gt; 的个人博客。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;关于本站&lt;a href=&quot;#关于本站&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;域名：&lt;code&gt;blog.727221.xyz&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;主题：&lt;a href=&quot;https://github.com/CuteLeaf/Firefly&quot; target=&quot;_blank&quot;&gt;Firefly&lt;/a&gt;（Astro 静态站）&lt;/li&gt;
&lt;li&gt;托管：OpenResty 静态托管&lt;/li&gt;
&lt;li&gt;运维：日常维护与技术文档日更&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;写什么&lt;a href=&quot;#写什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;以实用为主，例如：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Linux / Docker / 运维笔记&lt;/li&gt;
&lt;li&gt;网络与系统相关学习记录&lt;/li&gt;
&lt;li&gt;生活随笔&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;感谢 Firefly / Fuwari 开源作者。&lt;/p&gt;&lt;p&gt;—— 小鱼人&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>用 systemd timer 替代 cron：更可控的定时任务</title><link>https://blog.727221.xyz/posts/2026-07-26-linux-systemd-timer-for-recurring-tasks/</link><guid isPermaLink="true">https://blog.727221.xyz/posts/2026-07-26-linux-systemd-timer-for-recurring-tasks/</guid><description>从 cron 迁移到 systemd timer 的实践笔记，包含二者对比表、service + timer 完整示例、日志与调试方法，以及容易踩的几个坑。</description><pubDate>Sun, 26 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;定时任务几乎是每台服务器的标配：备份、清理、同步、拉取证书。多数人第一反应是 &lt;code&gt;crontab -e&lt;/code&gt;，写一行就走人。cron 确实简单，但当任务变多、出错、需要排查时，它的短板会集中暴露——脚本执行环境和交互式 shell 不同、输出被邮件吞掉、任务重叠执行、机器关机期间的计划直接丢失。&lt;/p&gt;
&lt;p&gt;systemd 已经是主流发行版的 init 系统，它自带的 timer 单元可以完整替代 cron，并且把定时任务纳入统一的服务管理与日志体系。本文记录一套可直接套用的写法。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;与 cron 对比&lt;a href=&quot;#与-cron-对比&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;



























































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;维度&lt;/th&gt;&lt;th&gt;cron&lt;/th&gt;&lt;th&gt;systemd timer&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;配置形式&lt;/td&gt;&lt;td&gt;单行表达式&lt;/td&gt;&lt;td&gt;两个单元文件（&lt;code&gt;.service&lt;/code&gt; + &lt;code&gt;.timer&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;日志&lt;/td&gt;&lt;td&gt;默认发邮件，常常无人查看&lt;/td&gt;&lt;td&gt;统一进 journal，&lt;code&gt;journalctl -u&lt;/code&gt; 直接看&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;执行环境&lt;/td&gt;&lt;td&gt;极简 PATH，与登录 shell 不同&lt;/td&gt;&lt;td&gt;显式声明，行为可预期&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;错过的计划&lt;/td&gt;&lt;td&gt;关机期间直接丢失&lt;/td&gt;&lt;td&gt;&lt;code&gt;Persistent=true&lt;/code&gt; 开机后补跑&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;任务重叠&lt;/td&gt;&lt;td&gt;上次没跑完也会再起一个&lt;/td&gt;&lt;td&gt;同一 service 天然串行，不会重入&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;随机延迟&lt;/td&gt;&lt;td&gt;需要自己 &lt;code&gt;sleep $RANDOM&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;RandomizedDelaySec=&lt;/code&gt; 一行搞定&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;资源限制&lt;/td&gt;&lt;td&gt;无&lt;/td&gt;&lt;td&gt;可用 cgroup 限制 CPU / 内存&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;依赖关系&lt;/td&gt;&lt;td&gt;无&lt;/td&gt;&lt;td&gt;可声明 &lt;code&gt;After=&lt;/code&gt;、&lt;code&gt;Requires=&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;手动触发&lt;/td&gt;&lt;td&gt;只能手工执行脚本&lt;/td&gt;&lt;td&gt;&lt;code&gt;systemctl start xxx.service&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;上次/下次执行&lt;/td&gt;&lt;td&gt;需自行记录&lt;/td&gt;&lt;td&gt;&lt;code&gt;systemctl list-timers&lt;/code&gt; 一览&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;代价是配置变啰嗦了：一件事要写两个文件。换来的是可观测性和确定性，任务一多就很划算。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;一个完整示例&lt;a href=&quot;#一个完整示例&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;假设需要每天凌晨做一次备份脚本。先写 service 单元，描述「做什么」：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;/etc/systemd/system/backup.service&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[Unit]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Description&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;Daily backup job&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;After&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;network-online.target&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Wants&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;network-online.target&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[Service]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Type&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;oneshot&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;backup&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Group&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;backup&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Environment&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;LANG=C.UTF-8&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;WorkingDirectory&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;/srv/backup&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ExecStart&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;/usr/local/bin/backup.sh&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;TimeoutStartSec&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;30min&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 简单加固&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;PrivateTmp&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ProtectSystem&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;strict&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ProtectHome&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;NoNewPrivileges&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ReadWritePaths&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;/srv/backup&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;注意 &lt;code&gt;Type=oneshot&lt;/code&gt;：跑完就退出，不是常驻服务。没有 &lt;code&gt;[Install]&lt;/code&gt; 段是刻意的，这个 service 不需要开机自启，由 timer 拉起。&lt;/p&gt;&lt;p&gt;再写 timer 单元，描述「什么时候做」：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;/etc/systemd/system/backup.timer&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[Unit]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Description&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;Run backup daily&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[Timer]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;OnCalendar&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;*-*-* 03:30:00&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Persistent&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;RandomizedDelaySec&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;15min&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;AccuracySec&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;1min&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Unit&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;backup.service&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[Install]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;WantedBy&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;timers.target&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;两个文件同名（&lt;code&gt;backup&lt;/code&gt;），systemd 会自动关联，&lt;code&gt;Unit=&lt;/code&gt; 其实可省略，写出来更直白。&lt;/p&gt;&lt;p&gt;启用：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;daemon-reload&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;enable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--now&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;backup.timer&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 看下次触发时间&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;list-timers&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;backup.timer&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 不等定时，立刻手动跑一次验证&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;backup.service&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 看这次跑的输出&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;journalctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-u&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;backup.service&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-n&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;50&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--no-pager&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;OnCalendar&lt;/code&gt; 的语法比 cron 表达式易读得多，写完可以用 &lt;code&gt;systemd-analyze&lt;/code&gt; 校验：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemd-analyze&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;calendar&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Mon..Fri 09:00&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemd-analyze&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;calendar&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;*-*-01 04:00:00&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemd-analyze&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;calendar&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;hourly&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;它会打印规范化结果和下一次触发时间，比在脑子里推算 &lt;code&gt;0 3 * * *&lt;/code&gt; 靠谱。&lt;/p&gt;&lt;p&gt;除了绝对时间，还有相对触发方式，适合「开机后 10 分钟跑一次，之后每 6 小时一次」这类需求：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[Timer]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;OnBootSec&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;10min&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;OnUnitActiveSec&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;6h&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;常见坑&lt;a href=&quot;#常见坑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;1. 改了单元文件没有 &lt;code&gt;daemon-reload&lt;/code&gt;。&lt;/strong&gt;
systemd 读的是缓存后的配置，改完必须 &lt;code&gt;systemctl daemon-reload&lt;/code&gt;，否则你会对着「明明改了却没生效」发呆。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. enable 错了对象。&lt;/strong&gt;
要 &lt;code&gt;enable&lt;/code&gt; 的是 &lt;code&gt;.timer&lt;/code&gt; 而不是 &lt;code&gt;.service&lt;/code&gt;。启用 service 意味着开机就跑一次，和你的意图无关。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. 以为 service 里能用 shell 语法。&lt;/strong&gt;
&lt;code&gt;ExecStart=&lt;/code&gt; 不经过 shell，管道、重定向、通配符、&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; 都不会被解析。需要这些就调用脚本文件，或者显式写成：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ExecStart&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;/bin/bash -c &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;foo | bar &amp;gt; /var/log/out.log&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;4. PATH 和环境变量与登录 shell 不同。&lt;/strong&gt;
service 里的 PATH 很短，&lt;code&gt;node&lt;/code&gt;、&lt;code&gt;pnpm&lt;/code&gt;、&lt;code&gt;docker&lt;/code&gt; 之类常因为版本管理器装在用户目录而找不到。稳妥做法是在 &lt;code&gt;ExecStart&lt;/code&gt; 里写绝对路径，或用 &lt;code&gt;Environment=&lt;/code&gt; 显式补全。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5. &lt;code&gt;Persistent=true&lt;/code&gt; 的补跑行为要想清楚。&lt;/strong&gt;
它会在开机后立即补执行错过的任务。对备份、证书续期是好事；对「每天推送一次通知」类任务，可能在开机瞬间一次性触发一堆，需要评估。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6. 相对时间的基准容易记混。&lt;/strong&gt;
&lt;code&gt;OnUnitActiveSec=&lt;/code&gt; 从上次&lt;strong&gt;启动&lt;/strong&gt;时刻算起，&lt;code&gt;OnUnitInactiveSec=&lt;/code&gt; 从上次&lt;strong&gt;结束&lt;/strong&gt;时刻算起。任务耗时长时两者差别明显。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;7. 忘了任务超时。&lt;/strong&gt;
&lt;code&gt;Type=oneshot&lt;/code&gt; 默认会等任务结束，卡住的进程可能一直挂着。用 &lt;code&gt;TimeoutStartSec=&lt;/code&gt; 给个上限，超时自动杀掉，不至于挡住下一轮。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;8. 用户级 timer 的存活问题。&lt;/strong&gt;
放在 &lt;code&gt;~/.config/systemd/user/&lt;/code&gt; 下的 timer 由 &lt;code&gt;systemctl --user&lt;/code&gt; 管理，用户退出登录后默认会被清掉。需要常驻就执行一次 &lt;code&gt;loginctl enable-linger &amp;lt;用户名&amp;gt;&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;9. 集群里所有机器同一秒触发。&lt;/strong&gt;
多台机器同时拉取同一个上游，容易把对方打崩。&lt;code&gt;RandomizedDelaySec=&lt;/code&gt; 把触发点打散，比在脚本里 &lt;code&gt;sleep $((RANDOM % 300))&lt;/code&gt; 干净得多。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;排查手册&lt;a href=&quot;#排查手册&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;几条日常够用的命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 所有 timer 的上次/下次执行&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;list-timers&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--all&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 某个任务的历史日志（含退出码）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;journalctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-u&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;backup.service&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--since&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;3 days ago&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 实时跟踪&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;journalctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-u&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;backup.service&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 看单元最终生效的完整配置（含 drop-in 覆盖）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;backup.service&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemd-analyze&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;verify&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/systemd/system/backup.service&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;systemctl status backup.service&lt;/code&gt; 会显示上次退出码，脚本里记得让失败路径 &lt;code&gt;exit&lt;/code&gt; 非零，否则 systemd 认为一切正常。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;小结&lt;a href=&quot;#小结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;cron 依然适合「一行搞定、跑挂了也无所谓」的临时任务。但只要任务需要被观测、需要处理错过与重叠、需要限制资源或声明依赖，systemd timer 的多写几行就非常值得。&lt;/p&gt;&lt;p&gt;迁移路径也不激进：不必一次性清空 crontab，可以先把最关键、最容易出问题的那几个任务改成 timer，跑上两周看看日志是否更好排查，再决定要不要继续推进。&lt;/p&gt;&lt;p&gt;—— 小鱼人&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>OpenResty 静态站：缓存策略与安全响应头落地</title><link>https://blog.727221.xyz/posts/2026-07-26-openresty-static-cache-headers/</link><guid isPermaLink="true">https://blog.727221.xyz/posts/2026-07-26-openresty-static-cache-headers/</guid><description>用 OpenResty 托管 Astro/Firefly 静态博客时，如何配置长期缓存、HTML 不缓存、安全响应头与 gzip/brotli，附可直接套用的 location 片段。</description><pubDate>Sun, 26 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;静态博客构建一次、到处分发，表面上很省事；真正上线后，瓶颈往往不在「能不能打开」，而在「打开得快不快、缓存对不对、头信息安不安全」。本文以 OpenResty（兼容 Nginx 配置）托管 Astro/Firefly 产物为例，给出一套可直接落地的缓存与安全响应头方案。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;目标拆解&lt;a href=&quot;#目标拆解&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;对静态站通常要同时满足：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;HTML 可快速更新&lt;/strong&gt;：发文后用户刷新即见新内容，不靠硬刷新清缓存。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;静态资源可长期缓存&lt;/strong&gt;：&lt;code&gt;_astro/&lt;/code&gt;、字体、图片等带 hash 的文件，浏览器尽量本地复用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全基线&lt;/strong&gt;：补齐常见响应头，降低点击劫持、MIME 嗅探、协议降级等风险。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;传输更省&lt;/strong&gt;：开启压缩，对文本资源减体积。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;不要把「整站 &lt;code&gt;expires 30d&lt;/code&gt;」一刀切——那是踩坑最快的方式。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;目录与路由习惯&lt;a href=&quot;#目录与路由习惯&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Firefly/Astro 构建后常见结构：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;dist/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;index.html&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;posts/&amp;lt;slug&amp;gt;/index.html&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;_astro/*.js|*.css   # 文件名含内容 hash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;assets/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pagefind/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;对应 OpenResty &lt;code&gt;root&lt;/code&gt; 指向发布目录（例如 &lt;code&gt;/opt/openresty/www/blog&lt;/code&gt;），文章 URL 形如 &lt;code&gt;/posts/&amp;lt;slug&amp;gt;/&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;推荐 location 分层&lt;a href=&quot;#推荐-location-分层&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;核心思路：&lt;strong&gt;按扩展名与路径分流&lt;/strong&gt;，而不是对 &lt;code&gt;location /&lt;/code&gt; 统一缓存。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;1. HTML：短缓存或禁用强缓存&lt;a href=&quot;#1-html短缓存或禁用强缓存&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# HTML：允许协商缓存，但禁止长期强缓存&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt; ~* &lt;/span&gt;&lt;span&gt;\.html$ &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header &lt;/span&gt;&lt;span&gt;Cache-Control &lt;/span&gt;&lt;span&gt;&quot;public, max-age=0, must-revalidate&quot;&lt;/span&gt;&lt;span&gt; always;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header &lt;/span&gt;&lt;span&gt;X-Content-Type-Options &lt;/span&gt;&lt;span&gt;&quot;nosniff&quot;&lt;/span&gt;&lt;span&gt; always;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;try_files &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;uri&lt;/span&gt;&lt;span&gt; $&lt;/span&gt;&lt;span&gt;uri&lt;/span&gt;&lt;span&gt;/ $&lt;/span&gt;&lt;span&gt;uri&lt;/span&gt;&lt;span&gt;/index.html &lt;/span&gt;&lt;span&gt;=404&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 目录型页面（Astro 的 /posts/xxx/）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt; / {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header &lt;/span&gt;&lt;span&gt;Cache-Control &lt;/span&gt;&lt;span&gt;&quot;public, max-age=0, must-revalidate&quot;&lt;/span&gt;&lt;span&gt; always;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;try_files &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;uri&lt;/span&gt;&lt;span&gt; $&lt;/span&gt;&lt;span&gt;uri&lt;/span&gt;&lt;span&gt;/ $&lt;/span&gt;&lt;span&gt;uri&lt;/span&gt;&lt;span&gt;/index.html &lt;/span&gt;&lt;span&gt;=404&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;max-age=0, must-revalidate&lt;/code&gt; 的含义是：浏览器每次都要向源站确认是否过期；配合后续 ETag/Last-Modified，未改动时仍可 304，流量很小，但发文后能立刻生效。&lt;/p&gt;&lt;p&gt;若前面还有 CDN，可把 HTML 的 CDN 缓存设为 1–5 分钟，并在发布脚本里触发 purge；源站侧仍建议保持「可 revalidate」。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 带 hash 的构建产物：一年缓存 + immutable&lt;a href=&quot;#2-带-hash-的构建产物一年缓存--immutable&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt; ^~ &lt;/span&gt;&lt;span&gt;/_astro/ &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;access_log &lt;/span&gt;&lt;span&gt;off&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header &lt;/span&gt;&lt;span&gt;Cache-Control &lt;/span&gt;&lt;span&gt;&quot;public, max-age=31536000, immutable&quot;&lt;/span&gt;&lt;span&gt; always;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;try_files &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;uri&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=404&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt; ^~ &lt;/span&gt;&lt;span&gt;/assets/ &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;access_log &lt;/span&gt;&lt;span&gt;off&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header &lt;/span&gt;&lt;span&gt;Cache-Control &lt;/span&gt;&lt;span&gt;&quot;public, max-age=31536000, immutable&quot;&lt;/span&gt;&lt;span&gt; always;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;try_files &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;uri&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=404&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;Astro 打包进 &lt;code&gt;_astro/&lt;/code&gt; 的 JS/CSS 文件名含 hash，内容变了文件名就变，旧 URL 不会被错误复用，因此 &lt;code&gt;immutable&lt;/code&gt; 是安全的。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 字体与图片&lt;a href=&quot;#3-字体与图片&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt; ~* &lt;/span&gt;&lt;span&gt;\.(woff2?|ttf|otf|eot)$ &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;access_log &lt;/span&gt;&lt;span&gt;off&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header &lt;/span&gt;&lt;span&gt;Cache-Control &lt;/span&gt;&lt;span&gt;&quot;public, max-age=31536000, immutable&quot;&lt;/span&gt;&lt;span&gt; always;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header &lt;/span&gt;&lt;span&gt;Access-Control-Allow-Origin &lt;/span&gt;&lt;span&gt;&quot;*&quot;&lt;/span&gt;&lt;span&gt; always;  &lt;/span&gt;&lt;span&gt;# 若跨域用字体再开&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt; ~* &lt;/span&gt;&lt;span&gt;\.(png|jpe?g|gif|webp|avif|svg|ico)$ &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;access_log &lt;/span&gt;&lt;span&gt;off&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header &lt;/span&gt;&lt;span&gt;Cache-Control &lt;/span&gt;&lt;span&gt;&quot;public, max-age=2592000&quot;&lt;/span&gt;&lt;span&gt; always; &lt;/span&gt;&lt;span&gt;# 30 天，按需求调&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;没有 hash 的图片不要盲目 &lt;code&gt;immutable&lt;/code&gt;，否则换图同名会「改不掉」。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;安全响应头（站点级）&lt;a href=&quot;#安全响应头站点级&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在 &lt;code&gt;server { ... }&lt;/code&gt; 内统一加（对错误页也生效时用 &lt;code&gt;always&lt;/code&gt;）：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen &lt;/span&gt;&lt;span&gt;443&lt;/span&gt;&lt;span&gt; ssl http2;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name &lt;/span&gt;&lt;span&gt;blog.example.com;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;root &lt;/span&gt;&lt;span&gt;/opt/openresty/www/blog;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 基础安全头&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header &lt;/span&gt;&lt;span&gt;X-Content-Type-Options &lt;/span&gt;&lt;span&gt;&quot;nosniff&quot;&lt;/span&gt;&lt;span&gt; always;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header &lt;/span&gt;&lt;span&gt;X-Frame-Options &lt;/span&gt;&lt;span&gt;&quot;SAMEORIGIN&quot;&lt;/span&gt;&lt;span&gt; always;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header &lt;/span&gt;&lt;span&gt;Referrer-Policy &lt;/span&gt;&lt;span&gt;&quot;strict-origin-when-cross-origin&quot;&lt;/span&gt;&lt;span&gt; always;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header &lt;/span&gt;&lt;span&gt;Permissions-Policy &lt;/span&gt;&lt;span&gt;&quot;geolocation=(), microphone=(), camera=()&quot;&lt;/span&gt;&lt;span&gt; always;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header &lt;/span&gt;&lt;span&gt;Strict-Transport-Security &lt;/span&gt;&lt;span&gt;&quot;max-age=31536000; includeSubDomains&quot;&lt;/span&gt;&lt;span&gt; always;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 纯静态站可先用较宽松 CSP，再逐步收紧&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# add_header Content-Security-Policy &quot;default-src &apos;self&apos;; img-src &apos;self&apos; data: https:; style-src &apos;self&apos; &apos;unsafe-inline&apos;; script-src &apos;self&apos;;&quot; always;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# … ssl、location 等&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;说明：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HSTS&lt;/strong&gt; 只在确认全站 HTTPS、无混用 HTTP 子域后再开。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSP&lt;/strong&gt; 对带内联脚本/第三方统计的主题容易误伤，建议先在报告模式或分阶段启用。&lt;/li&gt;
&lt;li&gt;OpenResty/Nginx 的 &lt;code&gt;add_header&lt;/code&gt; 在嵌套 &lt;code&gt;location&lt;/code&gt; 里会「覆盖」上层，而不是合并——所以关键头要么只在最内层写全，要么用更现代的 &lt;code&gt;more_set_headers&lt;/code&gt;（headers-more 模块）统一管理。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;压缩&lt;a href=&quot;#压缩&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;gzip &lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;gzip_vary &lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;gzip_min_length &lt;/span&gt;&lt;span&gt;1024&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;gzip_comp_level &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;gzip_types &lt;/span&gt;&lt;span&gt;text/plain text/css application/javascript application/json application/xml image/svg+xml;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 若已编译 brotli 模块&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# brotli on;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# brotli_comp_level 5;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# brotli_types text/plain text/css application/javascript application/json application/xml image/svg+xml;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;HTML/CSS/JS/JSON/SVG 压缩收益明显；已压缩的 woff2、png、jpg、webp 不必再压。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;发布后如何验证&lt;a href=&quot;#发布后如何验证&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;发文或改配置后，用本地回环 + SNI 验证（端口按你的反代实际调整）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 看 HTML 是否禁止长期强缓存&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-skI&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--resolve&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;blog.example.com:443:127.0.0.1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;https://blog.example.com/posts/some-slug/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 看构建资源是否 immutable&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-skI&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--resolve&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;blog.example.com:443:127.0.0.1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;https://blog.example.com/_astro/some-file.hash.js&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;期望：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;文章页：&lt;code&gt;HTTP/2 200&lt;/code&gt;，&lt;code&gt;Cache-Control&lt;/code&gt; 含 &lt;code&gt;max-age=0&lt;/code&gt; 或短 max-age。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_astro&lt;/code&gt; 资源：&lt;code&gt;max-age=31536000&lt;/code&gt; 且最好带 &lt;code&gt;immutable&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;安全头：至少能看到 &lt;code&gt;X-Content-Type-Options&lt;/code&gt;、&lt;code&gt;X-Frame-Options&lt;/code&gt; 或你配置的等价头。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;再配合一次真实浏览器：DevTools → Network，确认二次访问 HTML 走 304/协商，hash 资源走 disk cache。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;和构建流水线的配合&lt;a href=&quot;#和构建流水线的配合&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;静态站正确缓存的前提是 &lt;strong&gt;构建产物文件名稳定且内容寻址&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;用主题/框架自带的 hash 资源命名（Astro 默认如此）。&lt;/li&gt;
&lt;li&gt;发布采用「整目录替换」而不是零散覆盖，避免半新半旧。&lt;/li&gt;
&lt;li&gt;HTML 不长期强缓存；若用 CDN，发布脚本里加对应 URL 的 purge。&lt;/li&gt;
&lt;li&gt;构建机 OOM 时优先限制并行、提高 swap 或 &lt;code&gt;NODE_OPTIONS=--max-old-space-size=...&lt;/code&gt;，而不是关掉 pagefind/字体子集化后留下残缺产物。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;示例发布节奏（概念上）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pnpm build  →  清空 www  →  拷贝 dist  →  （可选）CDN purge  →  curl 抽检首页与最新文章&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;常见坑&lt;a href=&quot;#常见坑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;


































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;现象&lt;/th&gt;&lt;th&gt;可能原因&lt;/th&gt;&lt;th&gt;处理&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;发文后仍看到旧文&lt;/td&gt;&lt;td&gt;HTML 被 &lt;code&gt;expires 30d&lt;/code&gt; 或 CDN 强缓存&lt;/td&gt;&lt;td&gt;HTML 改为 revalidate；purge CDN&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;改了 CSS 不生效&lt;/td&gt;&lt;td&gt;自定义 CSS 无 hash 且长缓存&lt;/td&gt;&lt;td&gt;文件名加版本号，或缩短 max-age&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;安全头「配了但没有」&lt;/td&gt;&lt;td&gt;子 location 的 &lt;code&gt;add_header&lt;/code&gt; 覆盖了父级&lt;/td&gt;&lt;td&gt;在返回 200 的那个 location 写全，或用 headers-more&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;仅首字节快、整页慢&lt;/td&gt;&lt;td&gt;未开 HTTP/2、未压 JS、字体阻塞&lt;/td&gt;&lt;td&gt;开 http2、压缩、&lt;code&gt;font-display: swap&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;本地 curl 200、外网 404&lt;/td&gt;&lt;td&gt;反代 root/try_files 与发布目录不一致&lt;/td&gt;&lt;td&gt;对齐 &lt;code&gt;root&lt;/code&gt; 与实际 &lt;code&gt;dist&lt;/code&gt; 拷贝路径&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;最小可复制清单&lt;a href=&quot;#最小可复制清单&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;code&gt;root&lt;/code&gt; 指向当前发布目录；&lt;code&gt;try_files&lt;/code&gt; 支持 Astro 的目录型 URL。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/_astro/&lt;/code&gt;、带 hash 的 assets：&lt;code&gt;max-age=31536000, immutable&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;HTML 与页面路径：&lt;code&gt;max-age=0, must-revalidate&lt;/code&gt;（或 CDN 短 TTL + purge）。&lt;/li&gt;
&lt;li&gt;站点级安全头 +（确认 HTTPS 后）HSTS。&lt;/li&gt;
&lt;li&gt;gzip/brotli 覆盖文本类型。&lt;/li&gt;
&lt;li&gt;每次发布后用 &lt;code&gt;curl -I&lt;/code&gt; 抽检一篇新文章和一个 &lt;code&gt;_astro&lt;/code&gt; 资源。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;小结&lt;a href=&quot;#小结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;OpenResty 托管静态博客，性能与正确性主要来自 &lt;strong&gt;分层缓存&lt;/strong&gt; 和 &lt;strong&gt;发布可观测&lt;/strong&gt;，而不是堆一堆模糊的 &lt;code&gt;expires&lt;/code&gt;。HTML 求「新」，hash 资源求「稳」，安全头求「全站一致」。把这三件事写进配置和发布脚本，日更站点就能在「当天可见」和「重复访问足够快」之间取得平衡。&lt;/p&gt;&lt;p&gt;若你的主题还有 service worker 或 PWA，需要额外审查 precache 列表，避免把 HTML 永久钉在客户端——那是另一层「缓存」，比 Nginx 更难排查。纯静态 + 上述头策略，对个人技术博客通常已经够用。&lt;/p&gt;&lt;/section&gt;</content:encoded></item></channel></rss>