LUG 服务器黑板报迁回 servers.blog.ustc.edu.cn

2015 年 1 月 4 日 把非 USTC 域名迁移到国外代理 后,很多用户反映 servers.ustclug.org 无法访问。

阿里测 测试,通过国外代理访问的 https://servers.ustclug.org 有 55% 的地区和运营商无法访问,http://servers.ustclug.org 有 48% 的地区和运营商无法访问。

现将 LUG 服务器黑板报的默认域名从 servers.ustclug.org 改回 servers.blog.ustc.edu.cn。两个域名仍然都可以访问。

Freeshell HTTP Proxy 如何获取真实 IP 和 HTTPS

Freeshell 上的 HTTP 服务器在使用 HTTP Proxy 时,请求的来源 IP 是代理服务器的内网 IP,而请求协议也都是 HTTP(HTTPS 证书和加解密已经在 HTTP Proxy 上处理了)。要知道客户端的真实 IP 和 HTTP/HTTPS 协议,可以使用 HTTP header 中的下列字段:

  • X-Forwarded-For: 客户端 IP 地址,可能是 IPv4 或 IPv6 地址
  • X-Real-IP: 同 X-Forwarded-For
  • X-Forwarded-Proto: 客户端是通过 http 还是 https 访问的,值可能是 http 或 https
  • X-Scheme: 同 X-Forwarded-Proto

其中 X-Forwarded-Proto 是今天(2015年2月26日)新加的 HTTP Header,因为 X-Forwarded-ForX-Forwarded-Proto 是 HTTP 代理服务器的事实标准。

要让 WordPress、Discuz 等 PHP 程序能够正确识别用户的真实 IP 和 HTTP 请求协议,可以把上述 HTTP Header 作为服务器的环境变量传递给 PHP 程序。

Nginx

Freeshell 上如果安装的是 Nginx + FastCGI,可以在 nginx 配置文件中的 server 块以外添加如下代码:

map $http_x_forwarded_proto $proxy_https {
        default off;
        https on;
}

然后在 location 块内的 include fastcgi_params; 一行下面添加

fastcgi_param remote_addr $http_x_forwarded_for;
fastcgi_param https $proxy_https;

在 PHP 程序中,$_SERVER['REMOTE_ADDR'] 就会变成客户端的真实 IP;而客户端是否通过 https 来访问,可以通过 $_SERVER['HTTPS'] 是否为 on 来判断。

Apache

Freeshell 上如果安装的是 Apache 2,建议安装 mod_rpaf 模块,该模块可以根据 X-Forwarded-ForX-Forwarded-Proto 正确设置 PHP 环境变量。

如果不想安装模块,可以如下解决:

  • 客户端 IP:由于 Apache 不允许修改 REMOTE_ADDR,需要修改 PHP 代码,首先尝试 $_SERVER['X_FORWARDED_FOR'] 变量,如果存在就把它作为客户端 IP;如果不存在,再使用 $_SERVER['REMOTE_ADDR']。Discuz 已经这样做了,但 WordPress 没有这样做,需要自己改或安装相关插件。
  • 客户端 HTTP/HTTPS:在 Apache 配置文件中添加如下代码:
    SetEnvIf X-Forwarded-Proto https HTTPS=On
    

    PHP 程序中可以通过 $_SERVER['HTTPS'] 是否为 on 来判断。

感谢 崔天一 和 郑子涵 提出问题。

mirrors 提供 git 服务

值此新春佳节来临之际,科大开源软件镜像 提供了 git 服务。至此,科大开源软件镜像提供了 http、https、ftp、rsync、git 五种服务。

第一批上线的 git 镜像包括:

  • Android Open Source Project (AOSP) 镜像:使用帮助
  • Linux Kernel 镜像:git clone git://mirrors.ustc.edu.cn/linux.git
  • Homebrew 镜像:git clone git://mirrors.ustc.edu.cn/homebrew.git

说明:

  1. 大多数镜像每天同步一次,Linux Kernel 镜像每 6 小时同步一次。
  2. 由于服务器资源限制,每个 IP 地址限制 5 个并发 git 连接。
  3. 暂不提供 gitweb 在线查看源码服务,但可以通过 http 方式访问这些 git 仓库。

如果您希望添加其他开源 git 仓库,欢迎联系 lug (at) ustc.edu.cn。

顺祝各位新春快乐,羊年大吉!

继续阅读mirrors 提供 git 服务

mirrors 添加 Android (AOSP) 源

Android (AOSP) 源测试上线。Android (AOSP) 镜像使用帮助

每天凌晨 04:30 同步一次。

目前 AOSP 源提供 git 和 http 两种同步方式,推荐使用 git 同步。

为方便墙内用户访问 repo 工具所在的 storage.googleapis.comgerrit.googlesource.com,我们提供了代理,具体用法见 Android (AOSP) 镜像使用帮助

为了不引入额外的 git daemon,目前仅提供 HTTP 服务,同步过程中不会显示进度,而且由于不支持 --depth 选项,部分项目可能同步失败。

如果发现某些项目同步失败,可以使用 repo sync -f 强制同步。我们会修复此问题。
继续阅读mirrors 添加 Android (AOSP) 源

USTC Blog FTP 目录访问限制说明

USTC Blog FTP 的主要作用是:

  1. 方便用户备份 blog 数据
  2. 不小心把代码改错的时候可以进 FTP 修复

Blog 系统为了节约磁盘空间和提升性能,WordPress 核心文件是共享的,各个用户博客的根目录下大多是符号链接。也就是说 blog FTP 仅有 wp-contentwp-config.php 是可以访问的。

备份博客的时候,除了使用 phpmyadmin 备份数据库,只需备份 wp-content 目录即可。用户上传的附件、图片、插件、主题、语言包都在该目录中。

如何使用 phpmyadmin 导出/导入 blog 数据库

在 phpmyadmin 导入数据库的时候,一些朋友遇到 Duplicate entry '1' for key 'PRIMARY' 的错误。这是由于数据库里已经有数据,与待导入的数据存在冲突。

在导出数据库时,使用 “自定义” 添加以下选项即可解决该问题。该选项会把数据库中已存在的表名相同的表删除,避免表结构和数据的冲突。

感谢 高三山 的问题反馈。

Freeshell 查明 NFS 经常卡死问题

2015 年 2 月 3 日,freeshell 出现持续两个小时的 NFS 卡死问题。事实上,2014 年 8 月启用外部磁盘以来,就经常出现持续几十秒甚至几分钟的 NFS 卡死,卡死期间外部磁盘上的 freeshell 无法执行任何操作,有的 freeshell 还会因为磁盘操作超时而关机。之前一直以为是 NFS bug 导致了死锁,没有定位到故障原因,也没能重现。

2 月 3 日,通过 tcpdump 抓包和 strace nfsiod 进程的方法,查明 NFS server not responding 的问题是由于外部硬盘(一块希捷的 2T 绿盘)过于繁忙。

在 NFS 卡死的时段,外部磁盘读的平均延迟可达 600ms,写的平均延迟是 1400ms。当初设置 NFS 挂载参数的时候,我没有考虑到磁盘繁忙的问题,只是想到了网络延迟不应当超过 1 秒,于是就设置了超时 timeo=10,表示 1 秒超时。一个 NFS 请求可能需要分解为多个磁盘读请求,这些请求的时间之和很可能超过 1 秒,也就是大部分读写请求还没来得及发给磁盘就超时了,形成了 NFS 服务器失去响应的假象。

下面是 早先的挂载参数
vers=3,rw,rsize=32768,wsize=32768,tcp,timeo=10,retrans=5,soft,intr,sec=sys,lookupcache=all,ac,nocto

现将超时修改成 30 秒(timeo=300)。
vers=3,rw,rsize=32768,wsize=32768,tcp,timeo=300,retrans=5,soft,intr,sec=sys,lookupcache=all,ac,nocto

2 月 3 日已经修改 fstab,但由于挂载着的 NFS 不能修改挂载参数(见 man nfs),需要关闭所有外部磁盘上的虚拟机才能重新挂载 NFS。2 月 4 日刚好 1 号节点挂了,于是把所有其他节点也重启了一遍,NFS 参数就更新了。

Freeshell 所有节点重启

2 月 4 日凌晨 04:05,freeshell 1 号节点卡死,原因未知。这导致所有节点上的外部磁盘访问中断,也就是外部磁盘上的 freeshell 都卡死了。由于学校已经放假,少年班学院机房值班人员不在,无法进入机房修复。

中午 zhsj 告诉了我们 用 IPMI 远程重启机器 的方法。

下午 17:00 ~ 18:00,freeshell 所有节点通过 IPMI 接口远程重启,现在所有节点恢复正常。

非常抱歉此问题给您带来的不便。

用 IPMI 远程重启机器

服务器主板通常支持 IPMI,是主板上的硬件控制的,可以获取一个 IP 远程重启系统,妈妈再也不用担心机器挂掉了。首先安装 ipmitool、加载内核模块,就会生成 /dev/ipmi0 设备。然后进行网络配置。

apt-get install ipmitool
modprobe ipmi_devintf
ipmitool lan set 1 ipsrc dhcp
ipmitool lan set 1 arp respond on
ipmitool lan set 1 auth ADMIN MD5
ipmitool lan set 1 access on

然后检查 IPMI 网卡的网络配置:

# ipmitool lan print 1
Set in Progress         : Set Complete
Auth Type Support       : NONE MD5 PASSWORD
Auth Type Enable        : Callback :
                        : User     :
                        : Operator :
                        : Admin    : MD5
                        : OEM      :
IP Address Source       : DHCP Address
IP Address              : 114.214.197.69
Subnet Mask             : 255.255.255.0
MAC Address             : 00:15:17:65:03:0a
SNMP Community String   :
IP Header               : TTL=0x40 Flags=0x40 Precedence=0x00 TOS=0x10
BMC ARP Control         : ARP Responses Enabled, Gratuitous ARP Disabled
Gratituous ARP Intrvl   : 2.0 seconds
Default Gateway IP      : 114.214.197.254
Default Gateway MAC     : 00:00:00:00:00:00
Backup Gateway IP       : 0.0.0.0
Backup Gateway MAC      : 00:00:00:00:00:00
RMCP+ Cipher Suites     : 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14
Cipher Suite Priv Max   : XXXXXXXXXXXXXXX
                        :     X=Cipher Suite Unused
                        :     c=CALLBACK
                        :     u=USER
                        :     o=OPERATOR
                        :     a=ADMIN
                        :     O=OEM

继续设置管理员用户和密码:

ipmitool user set name 2 admin
ipmitool user set password 2
# 这里输入密码
ipmitool channel setaccess 1 2 link=on ipmi=on callin=on privilege=4
ipmitool user enable 2

然后检查用户密码设置:

# ipmitool user list 1
ID  Name             Callin  Link Auth  IPMI Msg   Channel Priv Limit
2   admin            true    true       true       ADMINISTRATOR

现在就算是配好了。

软重启机器:

ipmitool -U admin -H $hostname power cycle

硬重启机器:

ipmitool -U admin -H $hostname power reset

多谢 @zhsj 给我们科普!