本次维护历时33分钟,服务共中断28分钟。
为了提升效率,本次更新过程中,将Redis的连接方式改为了UNIX socket。
7.3 主要特性:
- 使用socket连接Redis
- 简洁的登陆、注册页面
- 改进评论功能
- 增强搜索过滤和分页等功能
- 为ssh key变化增加系统钩子
- 片段搜索
- git push –all更加迅速
- 其他功能性改进
- 其他安全性改进
本次维护历时33分钟,服务共中断28分钟。
为了提升效率,本次更新过程中,将Redis的连接方式改为了UNIX socket。
7.3 主要特性:
GitLab服务器计划于2014年9月23日凌晨升级维护,计划维护时间为0:00 ~ 0:30。届时GitLab代码托管服务将短暂性中断。
维护内容:
给您带来的不便,深表歉意。
由于凌晨GitLab备份过程中我的电脑就没电了,更新推迟至23日中午11点。
如果设置了第三方域名但没有设置 SSL 证书(如 http://example.com
),在 https://example.blog.ustc.edu.cn
中文章的固定链接就会指向 https://example.com/...
,导致证书错误。这是由于 WordPress 程序中一处“自作聪明”的 https 强制,即当前页面是 https 时固定链接也被强制为 https。现在已经修改 WordPress 代码以解决这个问题。
感谢 张静宁 的 bug 反馈。
昨天(9月18日)14:23 至 15:55,可能是由于自动修复 VPN 隧道的脚本跑飞了,blog 服务器的 IPv4 策略路由规则(ip rule)出现错误,导致 blog、freeshell 的 IPv4 TCP 无法连接,但 IPv6 正常,IPv4 的 UDP 和 ping 也正常。由于 blog 服务器关闭了 IPv6 SSH,我们无法远程登录该服务器,只好等网络中心老师重启。15:55 重启成功,服务恢复。非常抱歉这次持续一个半小时的部分服务中断给您带来的不便。
今天下午 blog 某管理员踩到了 nginx try_files 的一个坑,导致 WordPress 博客采用了固定链接的页面无法访问。此问题持续半小时后修复。
原来的配置是这样的:
location / { try_files $uri $uri/ /index.php; index index.html index.htm index.php; } location ~ \.php$ { ... }
修改成了
location / { try_files $uri $uri/ /index.php =404; index index.html index.htm index.php; } location ~ \.php$ { ... }
增加的这个 =404
,似乎是让 index.php 找不到的时候返回 404。但这么一改,形如 https://servers.blog.ustc.edu.cn/2014/09/ustc-telecom-link-failure/
这样的链接返回的竟然是 index.php 的源码!这是怎么回事呢?
这要从 nginx try_files 的工作原理说起。以 try_files $uri $uri/ /index.php;
为例,当用户请求 http://servers.blog.ustc.edu.cn/example
时,这里的 $uri
就是 /example
。try_files 会到硬盘里尝试找这个文件。如果存在名为 /$root/example
(其中 $root
是 WordPress 的安装目录)的文件,就直接把这个文件的内容发送给用户。显然,目录中没有叫 example 的文件。然后就看 $uri/
,增加了一个 /,也就是看有没有名为 /$root/example/
的目录。又找不到,就会 fall back 到 try_files 的最后一个选项 /index.php,发起一个内部 “子请求”,也就是相当于 nginx 发起一个 HTTP 请求到 http://servers.blog.ustc.edu.cn/index.php
。这个请求会被 location ~ \.php$ { ... }
catch 住,也就是进入 FastCGI 的处理程序。而具体的 URI 及参数是在 REQUEST_URI 中传递给 FastCGI 和 WordPress 程序的,因此不受 URI 变化的影响。
配置修改之后,/index.php
就不在 fall back 的位置了,也就是说 try_files 在文件系统里找到 index.php 之后,就会直接把文件内容(也就是 PHP 源码)返回给用户。这里的坑就是 try_files 的最后一个位置(fall back)是特殊的,它会发出一个内部 “子请求” 而非直接在文件系统里查找这个文件。
9月8日晚重启 freeshell 1 号节点之后,其他节点通过 NFS 访问的外部存储,在文件加锁时会超时,这导致 freeshell 创建缓慢、SSH 无法登录等问题。该问题现已修复,非常抱歉此问题给您带来的不便。
问题的原因是9月8日 Freeshell NFS 故障,@zsj 暂时关闭了 NFS 服务。我在开启 nfs-kernel-server 服务(nfsd)后,测试从其他节点读写 NFS 正常,就没再管了。我以为 nfs-common 服务(statd、idmapd)中的 statd 是 NFS 客户端才需要使用的,而 idmapd 是 NFSv4 需要使用的(我们用的是 NFSv3,原因见此),就没有启动 nfs-common 服务。事实上,statd 为 NFSv3 提供了远程锁的支持,我们的 NFS 挂载参数里没有 nolock,也就是当 statd 服务未启动时,如果远程挂载的节点执行了文件加锁操作,NFS 客户端会等待服务器端上锁,但这个上锁操作是永远不能完成的。Freeshell 创建过程中设置 root 密码需要文件锁,SSH 登录也需要文件锁,因此这些操作无法正常完成。
从9月8日晚开始,就不断收到服务器报警邮件,但我并没有重视起来。今晚 sa514122 同学坚持给我报 bug,一开始我也是隔靴搔痒,没有认真去调查,甚至人肉修改了 freeshell 系统在检测到数据不一致时的锁定标志,让该同学重试。在继续报 bug 的情况下,我自己试着注册了个 freeshell 才发现问题真的存在。我对这种忽视问题的行为深深自责,感谢 sa514122 同学的 bug 反馈!
2014 年 9 月 8 日下午 4 时左右,LUG 权威 DNS 服务器上托管的所有域名均解析失败。
经查,这是 9 月 7 日 15:48 分在 LUG 权威 DNS 服务器上由于未知原因导致 BIND 服务占用大量内存,触发了内核的 OOM Kill 机制,导致 BIND 服务被杀掉。因我们内部监控系统暂不完善,此事件没有被第一时间发现。经过了 24 小时之后, mirrors 上的 Slave DNS 服务器上的记录因超时而失效,从而导致LUG 权威 DNS 服务器上托管的所有域名均解析失败。
9 月 8 日 16:14 分重新启动 BIND 服务之后发现,BIND 服务一直占用接近 100% 的 CPU 资源。在 BIND 的日志中可以看出,在服务器配置的不同 VIew 间数据同步时出现了死循环。这导致 SOA 记录中 Zone 的序列号疯涨。
从 strace 中可以看出,BIND 服务器频繁获取 DNSSec 签名所用的私钥,故初步断定问题由 DNSSec 引起,在关闭 DNSSec 支持后重启 BIND 后,系统负载回归正常,问题解决。
此次事件暴露出了我们服务器内部监控不足的问题,我们会尽快建立起完善的服务监控体制,以便在服务器出现问题时第一时间获得通知。此外,我们正在努力探明数据同步时出现了死循环的触发条件,如有发现我们会在此博客上及时发布。
9月8日 20:39,1号节点 NFS server 再次导致 kernel panic。为保证服务正常运行,现暂停外部存储的网络挂载。存储在外部存储上的 freeshell 暂时无法访问,非常抱歉。请放心此故障不会导致数据丢失。
受影响的 freeshell 列表:
2397,2410,2425,2426,2428,2431,2433,2438,2443,2445,2446,2447,2448,2449,2450,2452,2460,2461,2462,2468,2469,2470,2471,2473,2474,2475,2480,2481,2482,2483,2490,2496,2497,2499,2506,2508,2509,2512,2513
Update(21:30):现已恢复。
为避免 NFS oops 再次导致 kernel panic,现修改了 sysctl kernel.panic_on_oops = 0,即发现非严重错误(BUG 或 oops 时)只记录日志,不产生 kernel panic 挂死机器。
为避免 kernel panic 后机器一直处于宕机状态,现修改了 sysctl kernel.panic = 60,即 kernel panic 后 60 秒自动重启机器。
9月8日 17:50,freeshell 1 号节点宕机。19:20 @zsj 去机房,由于该节点没有响应任何鼠标键盘事件,物理重启了该节点,并没有查出宕机的原因。19:53 该节点再次宕机。@zsj 和 @cuihao 再次去机房,发现是 NFS 导致的 kernel panic。20:13 机器重启,随后 10 分钟内服务恢复。
由于外部磁盘放在 1 号节点,其他节点上使用外部存储的 freeshell 也宕机了。因此带来的不便,我们深表歉意。顺祝中秋节快乐!(中秋节上午、下午、晚上各出一个故障,也算是多事之秋了……)
9月7日,我们检测到 DNSPod 免费域名解析服务器(f1g1ns1.dnspod.net、f1g1ns2.dnspod.net)的部分 IP 地址遭到某墙干扰,使得 DNSPod 的权威 DNS 服务器能够 ping 通但 UDP 53 端口遭到严重丢包,从国外解析 DNSPod 免费域名会有较大的概率超时,也就是访问网站时 DNS 解析失败。DNSPod 方面已确认此问题的存在,并建议使用 DNSPod 国际版。但实测发现 DNSPod 国际版的权威域名服务器({a,b,c}.dnspod.com)有一些节点似乎是宕机了,不要说 DNS 解析,连 ping 都不通。DNSPod 方面尚未就此作出回应。
我们发布这个公告,是为了说明此问题与 LUG 服务器无关。如果您绑定在 blog 或 freeshell 上的域名使用了 DNSPod 的解析服务,从国外访问超时,并提示 “DNS 解析失败”,则可能是 DNSPod 被墙的原因,我们和 DNSPod 都无能为力。如果海外用户非常重要,您可以试着切换回域名注册商的 DNS 服务器(如 Godaddy 自带的 DNS 服务),尽管这些海外的 DNS 服务器有可能反过来导致大陆用户的 DNS 解析不稳定(墙是双向的)。
域名解析问题有新进展时我们会更新此文。