日志轮转不只是改名:读懂 logrotate、inode 与文件重开

Linux 日志轮转与文件重开

线上日志持续增长时,直接删除大文件未必能释放磁盘,简单改名也未必能让进程写入新文件。原因在于 Linux 进程持有的是指向文件对象的描述符,而不是一条会自动跟随变化的路径。把 logrotate 配置写对,关键不是记住几个参数,而是明确谁负责切换文件、进程何时重开描述符,以及怎样证明空间真的被回收。

Read More

epoll 为什么会漏事件:LT、ET、非阻塞与读空循环

epoll 事件循环与非阻塞 I/O

服务从“每连接一个线程”改成 epoll 后,压测时却偶尔有连接停住,重启才恢复。问题通常不在 epoll_wait() 本身,而在程序混淆了“已经有数据”和“内核通知数据变化”这两件事。理解 LT、ET 的通知语义,并把 Socket、读取循环和业务状态机配套设计,才能避免看似随机的漏事件。

Read More

反向代理后的客户端 IP 别直接信:建立可信代理边界

反向代理与客户端 IP 信任链

限流、审计和地域判断经常依赖客户端 IP,但应用部署到 CDN、负载均衡器或网关之后,套接字看到的通常只是上一跳代理。直接取 X-Forwarded-For 的最左值看似解决了问题,却可能把攻击者自己填写的地址当成事实。真正可靠的做法不是“找一个请求头”,而是先划出可信代理边界。

Read More