友荐云推荐

在Hecker News中我提到过,我记录了一种我使用NGINX(一个久经考验的产品,可以迅速地反向代理)作为一个本地测试代理服务器的方法。

我决定使用NGINX作为一个本地的调试代理服务器,是因为其它所有的测试代理服务器能够根据我的喜好来工作。它们都有一些很好的功能特征,但是它们没有一个有我希望得到的功能。很多成熟的代理,当我试着启动它们时,它们就不工作了。如果NGINX是你的代理服务器,那么你所需要的一切功能就都可能有了,而且它很容易设置。这篇博客将给出一个例子,告诉你通过最基本的设置,就使一切成为了可能。

在这篇帖子中,我们将搭建一个本地代理服务器,这个本地代理服务器将会打印由你的计算机产生的所有的HTTP request请求的一些基本信息到一个日志信息文件里。

安装 openresty

Openresty只是nginx拥有添加写的能力并且可以在它的内部运行常用的lua代码。我使用一台macbook电脑作为我日常的驱动,而且有了brew工具,在OS X系统上安装openresty很简单。

Openresty介绍链接地址: http://openresty.org/cn/

brew介绍链接地址: http://wenku.baidu.com/view/5fde7c78102de2bd9705887a.html

$ ~ brew install homebrew/nginx/openresty

通过这行命令,就开始安装openresty和相关的配置文件了。你可以通过运行openresty命令来启动它,如果它在一个特殊的端口上启动,那么就需要sudo命令。使用该命令,你可以核实安装的程序和在你的PATH路径下的可执行程序。如果某个程序没有安装,该命令不会打印一个文件路径。

$ ~ which openresty
/usr/local/bin/openresty

$ ~ sudo openresty -c /usr/local/etc/openresty/nginx.conf

处理domain(域)

为了能使我们本地的openresty实例能够作为一个调试代理服务器使用,我们需要使所有的HTTP请求发送给openresty,并且配置openresty来接收和代理所有请求。

在代理服务器上指示请求

在一些linux和unix系统上,使用网络用户界面安装一个HTTP代理服务器很简单。OSX系统也不例外,在OSX的System Preference(系统偏好预设)里也可以完成一个HTTP代理服务器的配置。

如果你没有这么奢侈,HTTP_PROXY环境变量或许也可以作为设置一个HTTP代理的标准方法。你可以在/etc/environment文件路径下设置它。

export http_proxy="http://localhost:80"

配置openresty

配置nginx不需要太多的事,但是如果你不是太擅长nginx,配置它也许有点麻烦。在OSX操作系统上的openresty配置文件,在/usr/local/etc/openresty/nginx.conf文件路径下。

首先,我们应该想着去确保在openresty配置文件里默认的location指令应该像下面这样。

location / {
    resolver 8.8.8.8;
    set $origin_server "$scheme://$host";
    proxy_pass $origin_server;
}

resolver 8.8.8.8用来设置能被谷歌DNS服务器解析的域名。你是否想用一个不同的resolver,那就随便你了。

设置$origin_server”$scheme://$host”将会设置一个nginx变量,这个变量叫origin_server,它包括下行流量的HTTP请求scheme和host。

proxy_pass用来把请求代理到远程服务器,并且返回请求返回的结果。

打印request请求日志

现在,我们的代理服务器开始接收和代理流量,最后的步骤就是打印所有代理HTTP request请求日志了。在你的openresty配置文件的nginx服务器块添加如下一行命令:

access_log /tmp/proxy.access.log main;

在服务器块外面(http块的里面)添加如下一行命令:

log_format main '[$time_local] $scheme://$host$request_uri $status $http_user_agent';

并且创建一个相应的文件。这个文件就是你HTTP request请求记录保存的地方。

$ ~ touch /tmp/proxy.access.log

这将告诉nginx打印日志的格式,在哪里打印,并且为打印日志创建文件。如果你想长时间保存这些日志信息,你将需要设置log rotate,并且选择一个不同的日志文件位置(tmp目录也许不太适合用来存储日志信息……)。

Log rotate介绍链接地址: http://blog.csdn.net/cjwid/article/details/1690101

它正常运行了!

如果你该设置的都设置好了,你访问的HTTP站点将会被打印到/tmp/proxy.access.log文件路径下。

通过保存在日志文件里的日志信息,你可以看到,curl和浏览器流量被拦截了:

$ ~ tail -f /tmp/proxy.access.log
[22/Jul/2016:23:41:44 -1000] http://ejj.io/asdf 200 curl/7.43.0
[23/Jul/2016:00:19:13 -1000] http://ejj.io/ 200 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36
[23/Jul/2016:00:19:25 -1000] http://twiinsen.com/ 304 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36
[23/Jul/2016:00:20:08 -1000] http://twiinsen.com/blog.html 304 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36
[23/Jul/2016:00:20:56 -1000] http://example.com/ 200 curl/7.43.0

那接下来做什么呢?

如果你是一个nginx专家,你也许会注意到我们安装了openresty,但是没有用任何在nginx里不存在的功能。那是因为我们仍然还有很多事情要做。

最明显的事实是,openresty没有配置来支持代理HTTPS。

我将保留,然后在之后的博客中发布出来,但是为了通过HTTPS流量来使用这个代理,而且还没有经常发生的认证错误,我们需要做两件事情:

  • 创建我们自己的CA,并且在本地把它作为一个可信任的root。
  • 在SNI基础上,在我们的配置文件里动态添加代码,来为所有的域名认证签名。

CA介绍链接地址: http://baike.sogou.com/v6328142.htm?fromTitle=CA%E8%AE%A4%E8%AF%81

这听上去,好像有很多的事情要做,但是所有很难的工作已经被我们做完了。

Already been done for us的链接地址: https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/ssl.md