造轮子之谷歌镜像站

为什么?

在那片 963 万平方公里的土地上,因众所周知的原因,全球最大的搜索引擎 Google 被挡在墙外。不仅如此,包括谷歌学术、维基百科、推特、Facebook,Youtube、GMail 都无一幸免。而让我不禁想起我大清朝的 闭关锁国 ,造成的后果不言而喻。而邓小平同志曾提出的 对外开放 ,在互联网中似乎未得到丝毫眷顾。

“开放是国家繁荣发展的必由之路。必须顺应我国经济深度融入世界经济的趋势,奉行互利共赢的开放战略。” —— “十三五” 规划建议

“中国开放的大门永远不会关上。” —— 习近平同志

写到这里不仅苦笑,Shadowsocks 的作者在 Github 删除项目时的无奈似乎感同身受,仿佛一扇通往自由世界的大门突然有一天来了一群士兵们架着重武器把守。。

不敢说了 ,再接着说要被查水表了。

相信看到这里的朋友或多或少需要使用到 Google 搜索。我平时设备上均挂着 Shadowsocks ,但查文档仍有不时之需的时候,而当设备上没有 Shadowsocks 相关程序,又依托百度却解决不了任何问题的时候,这便非常让人抓狂。这也是搭建 Google 镜像站的目的。

是什么?

镜像,原意是光学里指的物体在镜面中所成之像。引用到计算机网络上,网站镜像是指对网站内容的拷贝。镜像通常用于为相同信息内容提供不同的源,特别是在下载量大的时候提供了一种可靠的网络连接。制作镜像是一种文件同步的过程。 —— 维基百科

如今~~ 翻墙~~ 的方式多种多样,把我所了解到的分享出来,有兴趣的朋友可以自己去了解。本文不敢说太多,请谅解。

按成本排序(个人见解,如有出入请斧正)

  • hosts
  • 蓝灯
  • 镜像站
  • Shadowsocks / v2ray
  • 去香港 :)

是的,你没看错,本文所讨论镜像站需要一定成本。但无可厚非就是一虚拟空间或者服务器。

镜像站又分为两种,一种是通过程序爬取 Google 搜索的结果页,另外一种通过服务器(本文为 Nginx)反向代理。而他们唯一的相同点都是 服务器需要在大陆以外,且能正常访问。

爬取 Google

先说说通过程序爬取,这里以 PHP 为例。原理是用户访问程序,程序将搜索关键字与谷歌搜索的链接进行参数拼接,然后通过 curl 进行抓取页面并输出。当然这种手段比较暴力,以至于 Google 的很多图片、CSS、JS 等资源均可能加载失败,不过也可以通过正则匹配资源路径进行缓存,然后替换页面中的地址再输出。

但不得不说,通过爬取结果页的效率是相当慢的,整个过程被下载页面和匹配替换耽搁了很长的时间。

这里有一个成品,有兴趣的朋友可以试试,本文重点并非程序爬取,所以不再赘述。

项目地址:7Ghost

反向代理

反向代理的方法多种多样,本文以服务器常用 Nginx 论述。反向原理是用户访问代理服务器,代理服务器将请求转发给目标服务器,目标服务器接收并响应给代理服务器,而代理服务器讲结果响应给用户。

看似过程和直接爬取结果差不多,但所执行的效率远高于爬取结果。

怎么做?

通过长篇大论,相信你对将要做的有了一定了解。

准备

  • 境外服务器一台(需要安装 Linux、Nginx)
  • 域名(子域名均可)
  • 耐心

开始

注:服务器需要安装 Nginx ,Nginx 安装本文不在讨论范围,自己可以查文档进行安装。

首先,需要在服务器上新建一个虚拟主机(VirtualHost):

1
2
3
4
5
6
# 移动到 Nginx 配置目录
$ cd /usr/local/nginx/conf/vhost/
# 创建一个配置文件,格式:*.conf
$ touch google.conf
# 编辑该文件
$ vim google.conf

然后将以下配置复制入配置文件,并修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server
{
listen 80;
listen 443 ssl;
server_name xxx.example.com; # 修改为你的域名
# 以下为 ssl 证书存放位置
#ssl_certificate /etc/.../fullchain.pem; #修改为您的证书地址
#ssl_certificate_key /etc/.../privkey.pem; #修改为你的证书地址
# 以下为强制跳转 https
#if ($server_port !~ 443){
# rewrite ^(/.*)$ https://$host$1 permanent;
#}
error_page 497 https://$host$request_uri;
location / {
# 需要代理的地址,这里为 谷歌香港
proxy_pass https://www.google.com.hk/;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

测试

然后保存并退出

1
2
3
4
5
# 按下 Esc 键
# 输入 : (Shift + ;)
$ qw
# 使用 nginx 命令测试配置文件 出现 successful 则通过测试
$ nginx -t

如果执行 nginx -t 命令后报错,根据行号找到报错原因并修改。

最后到域名解析商添加一个 A 记录 到你的主机 IP 。

其实到这里你所搭建的镜像站就能正常访问了,但在配置中能看到,还有 ssl 证书的相关配置。在这里建议镜像站均使用 https 协议,用于加密传输内容,尽量规避 GWF 以防封锁服务器 IP,免费证书各大主机商都可以申请。然后上传保存到服务器中,修改好证书的路径,打开所有 ssl 相关的注释便能通过 https 进行访问了。

还有哪些站点能够镜像?这个就没试验过了,不过刚刚测试了 wiki 中国,CSS 样式没有。且 console 一大堆报错,就直接删掉了。Youtube 就直接不用测试了,肯定不行。有其他站点测试成功的朋友,欢迎补充。

声明

本文只做技术探讨,由此产生的法律责任后果自负。