嗯,这么久没更新博文,是因为有一篇文章写了很久但一直没写完。真是哔了狗了。
今天想说的是一件更加哔了狗的事情。
Gist 是 GitHub 推出的代码片段分享服务,是最好用的代码片段分享服务没有之一。但是,它被天杀的围墙挡在了外面;而挡住它的理由更是无厘头——有人在白宫上发起了一个针对围墙的请愿活动,使用 Gist 提供了一份围墙制作人员的名单。
没办法,学习工作都需要用到 Gist,于是决定用 Nginx 在 EC2 上搭建一个针对 Gist 服务的反向代理服务器。
反向代理
想必大家对代理服务器并不陌生,但是对「反向代理」这个名词却不一定了解。
实际上,代理服务器按照起到的功能作用可以分为两种:正向代理服务器和反向代理服务器。我们用得比较多的是正向代理服务器:它横在客户端前面,代理客户端的行为,向服务器发出请求。反向代理服务器则与之相反:它横在服务器面前,代理服务器的行为,接受客户端的请求,然后向服务器请求资源后,以服务器的身份将资源内容返回给客户端。
对于大型网站来说,反向代理可以作为 DMZ 服务器,承担屏蔽外网访问的功能。此时,外网所有的访问,都通过 DMZ 转发到内网相应的服务器上,从内网服务器获取内容后,再经由 DMZ 返回给外网的客户端。这样,外网客户端无法获知内网的网络拓扑结构,这对内网是一种保护。
现在我们希望在对于围墙可信的某计算机上搭建一个反向代理服务器,并赋予它一个特定的域名(比如 example.com
)。这样,我们访问 example.com
就相当于访问了 gist.github.com
。
编译安装 Nginx
Nginx 是俄罗斯大神 Igor Sysoev 开发的网页服务器,稳定、高效、并发能力好;最关键的是,用它来配置反向代理服务器非常方便。
首先我们来编译安装 Nginx。
前期准备
编译安装需要 gcc
和 g++
之类的编译器,文章之后的内容都默认你的服务器上已经安装了这些工具。
我的 EC2 服务器用的是 Ubuntu Server,安装这些工具可以用 apt-get
。
1 | sudo apt-get install build-essential |
接下来,我们需要安装 PCRE、zlib 以及 openssl 库。PCRE 是用 Perl 写的正则表达式库,zlib 库在 gzip
压缩的时候会用到,openssl 则是著名的 SSL 库。
我们将源码保存在 /usr/local/src
,然后开始下载和编译 PCRE、zlib 和 openssl 库。
1 | # PCRE |
安装 Nginx
Nginx 最新的版本是 1.9.4。我们下载并安装它。
1 | cd /usr/local/src |
这里,./configure
配置的时候:
--sbin-path
指定了二进制文件的位置--conf-path
指定了配置文件的位置--pid-path
指定了 pid 文件存放的位置--with-http_ssl_module
将会安装 SSL 模块--with-http_sub_module
将会安装替换模块,之后的 URL 替换会用到它--with-http_stub_status_module
将会安装性能监视模块--with-pcre
链接 PCRE 库--with-zlib
链接 zlib 库--with-openssl
链接 openssl 库
测试运行
首先确定 80
端口没有被占用:
1 | netstat -ano | grep 80 |
然后执行命令,运行 Nginx:
1 | sudo /usr/local/nginx/nginx |
查看 80
端口的情况:
1 | netstat -ano | grep 80 |
出现下列结果,则说明 Nginx 已成功运行,并且正在监听 80
端口:
1 | tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN off (0.00/0/0) |
配置反向代理
Nginx 的配置文件是用花括号对 {}
嵌套而成的结构化配置文件。这里我们不讲 Nginx 配置文件的详细内容,关于它的详细说明可以参见这篇博客。
按照安装时指定的内容,我们需要找到 /usr/local/nginx/nginx.conf
中的 http
块,在其中添加以下内容:
1 | # server, gist reverse proxy |
这里对它做一个解释。
- 井号开头的行是注释
server
开始了server
块listen
表明 Nginx 将会在80
端口监听server_name
是我们给反向代理配置的域名,访问这个域名就相当于访问 Gistaccess_log
是日志文件的配置,这里为了简化我将它关掉了resolver
是 DNS 服务器location
块具体配置反向代理的行为proxy_pass
说明将会将请求转发至 Gistproxy_cache_valid
配置缓存proxy_cache_valid
同上proxy_cache_use_stale
- 同上
proxy_set_header
设置 HTTP 请求头,Accept-Encoding ""
表示拒绝任何压缩,这保证了服务器返回给反向代理的内容是未经压缩的,以便进行 URL 替换proxy_set_header
设置 HTTP 请求头,语言设置proxy_set_header
设置 HTTP 请求头,设置 UAsub_filter
URL 替换sub_filter
同上sub_filter_once
被关闭,替换所有可替换的内容
这样,访问 http://gist.example.com
就相当于访问了 https://gist.github.com
。最后,我们需要让 Nginx 载入新的配置文件:
1 | sudo /usr/local/nginx/nginx -t |