服务器优化 TCP 参数

blog 和 mirrors 服务器调整了 ip_conntrack 配置:

net.ipv4.netfilter.ip_conntrack_max=655360</code>

# should not be less than net.ipv4.tcp_keepalive_time (default 7200)
net.netfilter.nf_conntrack_tcp_timeout_established=14400

blog,mirrors 和 gitlab 调整了 TCP 发送窗口大小限制,以充分利用高延迟和高带宽的线路:

net.core.wmem_max=12582912
net.core.rmem_max=12582912
net.ipv4.tcp_rmem= 10240 87380 12582912
net.ipv4.tcp_wmem= 10240 87380 12582912

blog,mirrors 和 gitlab 在 HTTP 持久连接期间不再慢启动,以加快第二次及以后访问页面:

net.ipv4.tcp_slow_start_after_idle=0

增加 TCP 发送和接收默认窗口大小到 10 个 MSS,以减少小 HTTP 请求和 HTTPS 握手的来回次数。对 2.6.33 以下内核只能调整默认发送窗口大小(以下命令仅为示例):

# example on Debian wheezy
ip route change default via 202.141.176.126 initrwnd 10 initcwnd 10
# example on Debian squeeze
ip route change default via 202.141.176.126 initcwnd 10

Gitlab的bug修复

gitlab升级到6.0之后,用户在新建project选择namespace的时候,会发现无法选择以前创建的group。这个bug推测是升级的时候造成的。

原因是在users_groups这个表中无法找到这些组的信息。

$ mysql -u root -p

$ use gitlab;

$ show tables;

users_groups表存储了用户和group的关系,其中的group_access推测是权限,50是指group owner。

namespaces表储存了namespace。这里的id就是users_groups表中的group_id。

将丢失的信息重新加进去就可以了

GitLab 支持 SPDY 协议

GitLab 支持 Google 提出的 SPDY 协议,通过压缩、多路复用,可以有效加速 HTTPS 协议。我们使用了 Nginx 1.4 开始内置的 SPDY 模块,支持 SPDY/2 协议。

赶快来体验 SPDY-enabled 的 gitgeek.net 吧!

  1. 用 Chrome 浏览器,先访问 https://gitgeek.net/users/sign_in 再访问 chrome://net-internals/#spdy 看 gitgeek.net 是否在 SPDY Sessions 列表中。
  2. 使用第三方 SDPY 协议验证工具:http://spdycheck.org/#gitgeek.net

To GitLab Maintainers: SPDY 需要 Nginx 1.4+ 和 OpenSSL 1.0.1c+,Nginx 1.5.6 是从官网上下载源码编译的,OpenSSL 1.0.1e 是加入了 Debian sid 源后升级的(原来是 OpenSSL 0.9.8)。OpenSSL 1.0.1e 又依赖 gcc 4.5+,而 Debian squeeze 上的 gcc 是 4.4.x,因此把 gcc 也升级到了 4.8,libc 也升级到了 2.17。不要随意执行 apt-get upgrade 了,以免把整个系统升级到 sid。

GitLab SSH 无 key 时不再提示输入密码

之前 git clone [email protected]:namespace/project.git 的时候,如果没设置好 SSH key,会提示输入密码,很多用户对此感到迷惑。现在在 sshd_config 中加了下面两行,会直接提示访问被拒绝。

Match User git
PasswordAuthentication no

Tips:GitLab 的代码仓库支持 SSH 和 HTTPS 两种访问方式:

  1. SSH 访问,需要用 ssh-keygen 生成密钥,把公钥(id_rsa.pub)添加到 GitLab 个人管理区域的 public key。
  2. HTTPS 访问,每次连接服务器都要输入用户名(注册邮箱)和密码。可以作为在公用电脑上的临时访问方式。

GitLab 挂上小绿锁了

代码安全是一件比较严肃的事情。看到这么多人使用 GitLab,我自己也经常在校外使用 GitLab,安全的 HTTPS 传输是必要的。由于 gitlab.lug.ustc.edu.cn 是三级域名,LUG 也没有顶级域名 ustc.edu.cn 的管理权限,搞 SSL 证书是比较麻烦的。

为此,我申请了 gitgeek.net 域名,去 StartSSL 申请了一个免费 SSL 证书。没办法,GoDaddy 非促销季的证书太贵了;要是那位高富帅给 USTC 搞个 Verisign 的 Extended Validation,我可以给TA所有服务器的 root 🙂

总之,GitLab 挂上小绿锁了:

screenshot

在 Ubuntu 和 Windows 下的主流浏览器中测试,均可以正常访问。在 Debian 和 cygwin 中用 git clone 和 curl 也可以正常访问。由于 wget 1.12 的一个 bug,会提示证书不匹配,升级 wget 即可。

如果大家发现小绿锁没有挂上,或者 HTTPS 访问出现任何问题,请把你用的操作系统、浏览器或命令行工具的名称及版本号发到 [email protected]

原来的 http://gitlab.lug.ustc.edu.cn 仍然可以使用,只不过登出之后,登录会跳到 gitgeek.net……… GitLab 就是这样的,我本来不想这样……

Tips for GitLab Maintainers

修改配置文件后,最好清除 Redis Cache。例如 Gravatar 的 URL 会缓存,今天下午我百思不得其解的小黄锁问题就是由于早先生成的 HTTP URL 被缓存了。清除缓存步骤:

  1. sudo -u git -i
  2. cd gitlab
  3. RAILS_ENV=production bundle exec rake cache:clear

重启 gitlab 服务需要比较长的时间,虽然 sudo service gitlab restart 会立即显示成功,但事实上还是原来的 sidekiq 和 unicorn 在运行。可以用 sudo service gitlab status 和 pstree -pa 来查看 gitlab 服务的状态。如果发现“残余进程”,要 kill 掉再 sudo service gitlab start。

如果 gitlab 服务起不来,可以查看 ~git/gitlab/log/ 里的日志文件。

注意,从 StartSSL 申请的免费证书是 intermediate CA 签发的,为了在 git clone 和 curl 中正常使用,需要 cat intermediate.CA.crt >> gitlab.crt,把自己的证书和 intermediate CA 证书连接在一起。