在Hecker News中我提到过,我记录了一种我使用NGINX(一个久经考验的产品,可以迅速地反向代理)作为一个本地测试代理服务器的方法。
我决定使用NGINX作为一个本地的调试代理服务器,是因为其它所有的测试代理服务器能够根据我的喜好来工作。它们都有一些很好的功能特征,但是它们没有一个有我希望得到的功能。很多成熟的代理,当我试着启动它们时,它们就不工作了。如果NGINX是你的代理服务器,那么你所需要的一切功能就都可能有了,而且它很容易设置。这篇博客将给出一个例子,告诉你通过最基本的设置,就使一切成为了可能。
在这篇帖子中,我们将搭建一个本地代理服务器,这个本地代理服务器将会打印由你的计算机产生的所有的HTTP request请求的一些基本信息到一个日志信息文件里。
目录
安装 openresty
Openresty只是nginx拥有添加写的能力并且可以在它的内部运行常用的lua代码。我使用一台macbook电脑作为我日常的驱动,而且有了brew工具,在OS X系统上安装openresty很简单。
Openresty介绍链接地址: http://openresty.org/cn/
brew介绍链接地址:
通过这行命令,就开始安装openresty和相关的配置文件了。你可以通过运行openresty命令来启动它,如果它在一个特殊的端口上启动,那么就需要sudo命令。使用该命令,你可以核实安装的程序和在你的PATH路径下的可执行程序。如果某个程序没有安装,该命令不会打印一个文件路径。
处理domain(域)
为了能使我们本地的openresty实例能够作为一个调试代理服务器使用,我们需要使所有的HTTP请求发送给openresty,并且配置openresty来接收和代理所有请求。
在代理服务器上指示请求
在一些linux和unix系统上,使用网络用户界面安装一个HTTP代理服务器很简单。OSX系统也不例外,在OSX的System Preference(系统偏好预设)里也可以完成一个HTTP代理服务器的配置。
如果你没有这么奢侈,HTTP_PROXY环境变量或许也可以作为设置一个HTTP代理的标准方法。你可以在/etc/environment文件路径下设置它。
配置openresty
配置nginx不需要太多的事,但是如果你不是太擅长nginx,配置它也许有点麻烦。在OSX操作系统上的openresty配置文件,在/usr/local/etc/openresty/nginx.conf文件路径下。
首先,我们应该想着去确保在openresty配置文件里默认的location指令应该像下面这样。
resolver 8.8.8.8用来设置能被谷歌DNS服务器解析的域名。你是否想用一个不同的resolver,那就随便你了。
设置$origin_server”$scheme://$host”将会设置一个nginx变量,这个变量叫origin_server,它包括下行流量的HTTP请求scheme和host。
proxy_pass用来把请求代理到远程服务器,并且返回请求返回的结果。
打印request请求日志
现在,我们的代理服务器开始接收和代理流量,最后的步骤就是打印所有代理HTTP request请求日志了。在你的openresty配置文件的nginx服务器块添加如下一行命令:
在服务器块外面(http块的里面)添加如下一行命令:并且创建一个相应的文件。这个文件就是你HTTP request请求记录保存的地方。
这将告诉nginx打印日志的格式,在哪里打印,并且为打印日志创建文件。如果你想长时间保存这些日志信息,你将需要设置log rotate,并且选择一个不同的日志文件位置(tmp目录也许不太适合用来存储日志信息……)。
Log rotate介绍链接地址:
它正常运行了!
如果你该设置的都设置好了,你访问的HTTP站点将会被打印到/tmp/proxy.access.log文件路径下。
通过保存在日志文件里的日志信息,你可以看到,curl和浏览器流量被拦截了:
那接下来做什么呢?
如果你是一个nginx专家,你也许会注意到我们安装了openresty,但是没有用任何在nginx里不存在的功能。那是因为我们仍然还有很多事情要做。
最明显的事实是,openresty没有配置来支持代理HTTPS。
我将保留,然后在之后的博客中发布出来,但是为了通过HTTPS流量来使用这个代理,而且还没有经常发生的认证错误,我们需要做两件事情:
创建我们自己的CA,并且在本地把它作为一个可信任的root。
在SNI基础上,在我们的配置文件里动态添加代码,来为所有的域名认证签名。
CA介绍链接地址: ?fromTitle=CA%E8%AE%A4%E8%AF%81
这听上去,好像有很多的事情要做,但是所有很难的工作已经被我们做完了。
Already been done for us的链接地址: