恰西 / 按主题阅读

技术笔记

文章日期,要在元数据里统一定义

标题、日期和草稿状态应放在明确的元数据字段中,避免仅修改正文显示。 列表、正文、RSS 和站点地图可能读取不同时间字段。只修改页面上显示的一行文字,很容易让其他入口仍保留旧日期,出现看起来互相矛盾的记录。

继续阅读

WAN 有 IPv6,LAN 就一定能用吗?

路由器自身拿到 IPv6 地址,不代表 LAN 已获得可用的子网前缀。 路由器自身的地址与向下游分配的前缀属于不同配置内容。客户端还需要有效地址、默认路由、DNS 以及允许转发的防火墙规则,任何一环缺失都可能失败。

继续阅读

改了域名记录,应该先问哪台 DNS?

递归服务器代用户查找答案,权威服务器提供某个区域的数据。 权威服务器决定区域中的记录,递归服务器通常缓存并代为查询。两者都能回答同一个域名,但回答的来源和刷新时机不同,排错时需要有意区分。

继续阅读

线上到底是哪一版,应该能查出来

线上问题需要对应到源码、配置和产物,而不只是一个模糊的发布时间。 仅知道“下午发布过”不足以定位问题。代码摘要、构建编号和产物标识形成关联后,才能判断配置、页面与日志是否来自同一轮部署。

继续阅读

容器里的 127.0.0.1 到底指向谁?

容器内部的 localhost 指向它自己,不会自动指向另一个数据库容器。 每个容器通常拥有独立网络命名空间。应用连接 localhost 时,寻找的是自己内部的服务,而不是宿主或旁边的数据库容器,这是容器迁移时常见的误解。

继续阅读

Up 和 Healthy,说的是不同层次的事

进程存在与业务接口能够响应是不同状态,健康检查要覆盖最小可用路径。 容器 Up 说明入口进程仍在运行,Healthy 则取决于配置的探测命令。应用卡死、依赖不可达或内部错误时,进程可能没有退出,业务却已经不可用。

继续阅读

上传失败,限制可能不在应用里

客户端、代理和应用都可能限制请求大小,错误应定位到具体一层。 请求从客户端到应用可能经过多个代理,每一层都能设置大小限制。返回 413 时应先识别由谁生成响应,再决定修改哪一处配置。

继续阅读

代理的“等多久”,至少有两个答案

连接上游与等待上游返回是两个阶段,分别设置才能准确排障。 连接超时处理的是无法与上游建立连接;读取超时处理的是连接已存在但迟迟没有新数据。两者适合不同故障,统一加大数值常常只会延长用户等待。

继续阅读

一次平滑重载,背后发生了什么

重载让主进程读取新配置并启动新 worker,旧连接通常交由旧 worker 收尾。 主进程读取新配置并启动新 worker,旧 worker 尽量完成已经接收的工作。相比直接停掉服务,这通常能减少普通配置变更对现有连接的影响。

继续阅读

唯一性不能只靠插入前查一下

先查询再插入仍可能遭遇并发竞争,唯一性必须由约束保证。 两个并发请求都可能看到“目前不存在”,随后各自插入。数据库约束在写入时做最终判断,才有机会阻止竞争条件造成的重复记录。

继续阅读

分组查询的条件应该放在哪一层?

WHERE 过滤原始记录,HAVING 过滤分组后的聚合结果。 查询可以先从原始行里排除不符合条件的数据,再对剩余数据分组,最后筛选聚合结果。理解这两个过滤阶段,比死记 WHERE 和 HAVING 的名字更有效。

继续阅读

小函数也值得测一测空输入

稳定的测试不仅覆盖正常结果,也应检查空输入和边界值。 只测试常见输入容易留下边界盲点。空列表、缺失字段和重复元素往往不复杂,却能暴露对数据形状的错误假设,使后续重构更有把握。

继续阅读

页面慢在解析、建连,还是等待正文?

DNS、建连、TLS 和等待响应是不同阶段,分阶段计时更容易定位瓶颈。 把总耗时拆开,能避免把 DNS 慢、TLS 慢和应用处理慢都归因于服务器性能。curl 的时间字段多为自请求开始累计的值,解释阶段时要注意差值关系。

继续阅读

Cookie 只是载体,会话还需要生命周期

会话通常通过随机标识关联服务端状态,Cookie 只是传递标识的一种机制。 浏览器保存一个标识并不等于完成会话管理。服务端仍需要定义会话有效期、退出失效和权限检查;Cookie 属性主要限制传输与脚本访问方式。

继续阅读

网站搬家后,301 应该指向哪里

永久迁移与临时跳转应使用不同语义,避免客户端长期缓存错误目标。 迁移的目标是让旧地址继续对应原有内容,而不是把流量一律送回首页。保留路径关系和明确跳转语义,能让用户、缓存与搜索引擎得到一致信号。

继续阅读

发布版本需要一个稳定的名字

标签提供稳定的版本引用,便于将线上产物对应到具体源码。 分支随着新提交持续移动,标签更适合表示某个发布节点。带注释标签还能保存发布说明,但线上最终运行的产物仍需要与提交摘要建立对应关系。

继续阅读

提交前只看 git diff,可能漏了一半

普通 diff 查看未暂存变更,cached diff 查看准备进入提交的内容。 暂存区是提交内容的直接来源,普通 diff 却默认比较工作区与暂存区。文件一旦暂存,相关修改可能从普通 diff 中消失,但仍会进入下一次提交。

继续阅读

让短选项解析回归 getopts

手写位置参数判断容易漏掉组合选项,getopts 适合短选项接口。 参数数量变多后,手写 shift 与位置判断容易漏掉选项取值、未知字符和错误状态。getopts 提供基础解析循环,让脚本能把注意力放回实际业务。

继续阅读

逐行读文件时,别吃掉反斜杠和空格

反斜杠可能被 read 解释,使用 -r 可以避免它作为转义符被消费。 文本行常常包含路径、正则表达式或缩进,读取时不应未经约定就把它们重新解释。清空 IFS 与启用 read -r,分别处理首尾分隔字符和反斜杠的问题。

继续阅读

权限问题,先检查文件再检查目录

读取脚本与执行脚本是两回事,目录的执行位还决定能否穿越路径。 能看到文件名却不能进入目录,与能读取脚本却不能直接执行,并不是同一种权限问题。排查时需要沿目标路径向上检查,而不只是给最后一个文件增加权限。

继续阅读

读大日志,先别急着打开编辑器

先查看文件开头和末尾,往往比直接打开整个大文件更高效。 日志排查通常从时间窗口开始:开头能说明文件格式,末尾能说明最近发生了什么。只读几十行既减少等待,也避免把巨大的日志一次载入编辑器。

继续阅读

搜索文章

输入关键词,找回一篇记录。