Nginx 获取真实客户端 IP:先划清可信代理边界 网站接入反向代理或负载均衡后,源站看到的连接地址通常是代理地址。于是很多配置直接读取 X-Forwarded-For,把最左侧内容当成访客 IP。问题在于:请求头可以由客户端自行发送,只有可信代理经过正确处理后交给源... yunqueblog/ 技术教程/ 2026-10-01/ 3 阅读
PostgreSQL EXPLAIN 入门:先找估算偏差,再决定要不要建索引 一条查询变慢,最容易冲动的做法是立刻给条件列加索引。但慢查询可能来自数据分布变化、返回结果过多、错误的行数估计,甚至应用网络与序列化。执行计划的价值,是把“感觉数据库慢”变成可检验的假设。本文以 PostgreSQL... yunqueblog/ 技术教程/ 2026-10-01/ 3 阅读
Git worktree 实战:保留当前现场,同时开一个修复目录 功能做到一半,线上问题突然需要修复。与其反复保存现场、切换分支和恢复依赖,可以为同一个仓库增加一个工作目录。Git worktree 适合并行查看不同分支、验证历史提交或临时修复;它共享仓库数据,但每个目录拥有自己的... yunqueblog/ 技术教程/ 2026-10-01/ 3 阅读
Python 虚拟环境排错:先确认解释器,再检查依赖 pip 提示安装成功,程序却说找不到模块,很多时候不是包消失了,而是安装和运行使用了不同的 Python。虚拟环境的价值是为项目建立独立依赖目录,但它不会替你决定 IDE、终端、计划任务到底调用哪个解释器。本文先用 ... yunqueblog/ 技术教程/ 2026-10-01/ 5 阅读
SQLite 在线备份别只复制 db 文件:建立可恢复的备份流程 SQLite 把数据库放进文件,容易让人把“复制文件”误认为完整备份方案。真正要保证的是:备份能够表示一个一致的数据库状态,而且恢复时应用能读懂它。本文针对仍在被应用使用的普通 SQLite 数据库;示例会创建新备份... yunqueblog/ 技术教程/ 2026-10-01/ 3 阅读
用 systemd timer 管理定时脚本:从首次运行到失败排查 定时脚本最难维护的部分,通常不是时间表达式,而是“它以谁的身份运行、工作目录在哪里、失败后去哪里看”。在使用 systemd 的 Linux 主机上,可以让 service 描述工作,让 timer 描述触发时机。下... yunqueblog/ 技术教程/ 2026-10-01/ 3 阅读
HTTP 缓存验证实战:用 ETag 与 304 区分“没更新”和“没请求” 网页刷新后没有变化,既可能是内容没更新,也可能是浏览器仍在使用缓存。排查时先拆开两个问题:这次请求有没有发出去;服务器确认的资源版本是否改变。本文适用于普通 GET 页面或静态文件的缓存检查,示例域名和版本标识需要替... yunqueblog/ 技术教程/ 2026-10-01/ 6 阅读