物院学工办网站启用了两个域名,其一是 phyxgb.pku.edu.cn,解析到了服务器的v4地址;另一个域名为 *.pkuphy.cn,这个域名使用了 CloudFlare 的 CDN 服务,并使用服务器的 IPv6 地址进行回源。并做了重定向服务,即当访问 phyxgb.pku.edu.cn 这个域名时,如果监测到用户不在校内,会被重定向到 www.pkuphy.cn 域名下,而直接访问 www.pkuphy.cn 则不会做任何处理。

这么做的主要原因有以下几点:

  1. 服务器的 v4 和 v6 都是使用的 CERNET 提供的服务, CERNET 对于 v4 流量收费很高(¥0.5/MB),而对于 v6 流量免费。
  2. 学校防火墙对于非 pku 后缀域名的 v4 协议访问会直接阻断,也就是如果不使用 CloudFlare CDN 服务,将 www.pkuphy.cn 解析到服务器的 v4 地址,也无法正常访问。但神奇的是v6没有阻断,所以我用了智能cdn,如果客户有v6地址,则会解析到服务器的v6地址上,提供更快的访问速度,如果没有v6,则会解析到 CloudFlare 的 CDN 服务上。

这样处理后,有一个问题就是网站的访问记录中的 IP 地址全是 CloudFlare 的地址,不是访客的地址。这里记录一下怎么使得 log 文件中记录访客的地址。

解决方法

服务器使用的是宝塔面板编译安装的 nginx,默认编译了 gx_http_realip_module 模块,所以只需要到/www/server/nginx/conf 目录下新建一个名为 cf.conf的文件,并将以下内容写入:

set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 104.16.0.0/12;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2c0f:f248::/32;
set_real_ip_from 2a06:98c0::/29;
 
# use any of the following two
real_ip_header CF-Connecting-IP;
#real_ip_header X-Forwarded-For;

然后到 nginx 的配置文件中,在 http 模块下添加一行 include cf.conf即可。

最后修改:2020 年 10 月 20 日
如果觉得我的文章对你有用,请随意赞赏