Gitlab升级至7.3

本次维护历时33分钟,服务共中断28分钟。

为了提升效率,本次更新过程中,将Redis的连接方式改为了UNIX socket。

7.3 主要特性:

  • 使用socket连接Redis
  • 简洁的登陆、注册页面
  • 改进评论功能
  • 增强搜索过滤和分页等功能
  • 为ssh key变化增加系统钩子
  • 片段搜索
  • git push –all更加迅速
  • 其他功能性改进
  • 其他安全性改进

GitLab服务器维护通知

GitLab服务器计划于2014年9月23日凌晨升级维护,计划维护时间为0:00 ~ 0:30。届时GitLab代码托管服务将短暂性中断。

维护内容:

  • 升级GitLab至 7.3 stable

给您带来的不便,深表歉意。

由于凌晨GitLab备份过程中我的电脑就没电了,更新推迟至23日中午11点。

Blog 修复自定义域名固定链接证书错误问题

如果设置了第三方域名但没有设置 SSL 证书(如 http://example.com),在 https://example.blog.ustc.edu.cn 中文章的固定链接就会指向 https://example.com/...,导致证书错误。这是由于 WordPress 程序中一处“自作聪明”的 https 强制,即当前页面是 https 时固定链接也被强制为 https。现在已经修改 WordPress 代码以解决这个问题。

感谢 张静宁 的 bug 反馈。

9月18日 blog、freeshell IPv4 服务中断

昨天(9月18日)14:23 至 15:55,可能是由于自动修复 VPN 隧道的脚本跑飞了,blog 服务器的 IPv4 策略路由规则(ip rule)出现错误,导致 blog、freeshell 的 IPv4 TCP 无法连接,但 IPv6 正常,IPv4 的 UDP 和 ping 也正常。由于 blog 服务器关闭了 IPv6 SSH,我们无法远程登录该服务器,只好等网络中心老师重启。15:55 重启成功,服务恢复。非常抱歉这次持续一个半小时的部分服务中断给您带来的不便。

Nginx try_files 里的一个坑

今天下午 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)是特殊的,它会发出一个内部 “子请求” 而非直接在文件系统里查找这个文件。

Freeshell 外部存储文件锁故障说明

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 反馈!

LUG 权威 DNS 服务器故障说明

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 后,系统负载回归正常,问题解决。

此次事件暴露出了我们服务器内部监控不足的问题,我们会尽快建立起完善的服务监控体制,以便在服务器出现问题时第一时间获得通知。此外,我们正在努力探明数据同步时出现了死循环的触发条件,如有发现我们会在此博客上及时发布。

Freeshell NFS 故障,外部存储暂停服务

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 秒自动重启机器。

Freeshell 1 号节点宕机(已恢复)

9月8日 17:50,freeshell 1 号节点宕机。19:20 @zsj 去机房,由于该节点没有响应任何鼠标键盘事件,物理重启了该节点,并没有查出宕机的原因。19:53 该节点再次宕机。@zsj 和 @cuihao 再次去机房,发现是 NFS 导致的 kernel panic。20:13 机器重启,随后 10 分钟内服务恢复。

由于外部磁盘放在 1 号节点,其他节点上使用外部存储的 freeshell 也宕机了。因此带来的不便,我们深表歉意。顺祝中秋节快乐!(中秋节上午、下午、晚上各出一个故障,也算是多事之秋了……)

DNSPod 被墙导致自定义域名国外无法解析的说明

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 解析不稳定(墙是双向的)。

域名解析问题有新进展时我们会更新此文。