文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

在Hacker News论坛里一个跟帖提示,我已经记录了一种用nginx作为本地测试代理的方法,用这种方式搭建的反向代理久经生产线上运行的考验。

由于没有其他测试代理满足我的工作喜好,所以我决定开始使用nginx作为本地调试代理。  虽然其他的代理都有很好的功能特性,但是没有一个有能满足我所有的需求。 很多更成熟的代理在我尝试使用的时候甚至无法使用。 当用nginx做你的代理的时候,任何功能是可能实现,而且它很容易设置。 这篇博客给出了一个通过简单的修改就有可能实现各种功能的例子。

第 1 段(可获 2 积分)

在这篇文章中,我们将构建一个本地代理,将记录由你计算机产生的所有HTTP请求的一些基本信息到一个日志文件中。

安装 openresty

Openresty  只是nginx的附加功能,在它里面可以用来编写和运行lua代码。 我使用的是macbook来作为我的日常工具,在OS X系统上用brew来安装openresty非常简单。

$ ~ brew install homebrew/nginx/openresty

这个命令将安装openresty和相关的配置文件。 您可以通过openresty的运行命令来启动它,如果在特权端口上启动,则需要管理员权限。 使用which命令,您可以验证该程序是否已安装,并在是否在可执行的$ 路径中。 如果该程序没有安装,则which命令将不打印文件路径。

第 2 段(可获 2 积分)
$ ~ which openresty 
/usr/local/bin/openresty 
​​​​​​​ $ ~ sudo openresty -c /usr/local/etc/openresty/nginx.conf

处理任何域名

为了使我们的本地openresty实例用作调试代理,我们需要将所有HTTP流量汇集到openresty,并将其配置为接受和代理所有请求。

将流量指向代理

在一些linux和unix系统上,很容易使用网络UI设置HTTP代理。 OS X也不例外,可以在系统首选项中配置HTTP代理。

如果你没有这个配置界面,HTTP_PROXY 环境变量也可以通过标准的方式来设置一个HTTP代理。 您可以在/ etc / environment中进行设置。

第 3 段(可获 2 积分)
export http_proxy="http://localhost:80"

配置openresty

配置nginx不需要太多的工作,但如果你不是一个经常使用nginx的人,那么你可能觉得有点混乱。 OS X操作系统上的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 将设置接收到的域名由google的DNS服务器进行解析。 如果你想使用不同的解析器,请随意。

第 4 段(可获 2 积分)

set $origin_server "$scheme://$host" 将设置一个名为origin_server的nginx变量,其中包含下游HTTP请求的schemehost信息

proxy_pass用于代理对远程服务器的请求,并返回结果。

日志请求

现在我们的代理会接收和代理流量,最后一步是记录所有代理的HTTP请求。 在openresty配置文件中的Nginx内部的server大括号内,添加以下行。

access_log /tmp/proxy.access.log main;

在server大括号外添加以下行(但在http块中):

log_format main '[$time_local] $scheme://$host$request_uri $status $http_user_agent';
第 5 段(可获 2 积分)

并创建相应的文件。 这个文件内容就是你的HTTP请求记录的保存。

$ ~ touch /tmp/proxy.access.log

这个命令将告诉nginx日志的格式,以及日志的保存位置,并会创建日志文件。 如果要存储这些日志很长时间,您将需要设置日志循环,并选择不同的日志文件位置(tmp目录可能不适合存储日志...)。

它的工作原理!

如果你已经成功设置了一切,你访问的HTTP网站应该被记录到/tmp/proxy.access.log文件中。

您可以看到保存到文件的日志显示了cURL和浏览器流量都已经被拦截。

第 6 段(可获 2 积分)
$ ~ 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
第 7 段(可获 2 积分)

下一步是什么?

如果你是一个nginx大师,你可能已经注意到我们安装了openresty,但没有使用任何不存在于nginx的功能。 这是因为还有很多其他工作要做。

最明显的是,openresty并未配置使其支持HTTPS的代理。

我节约篇幅是为了在以后的博客发表,但为了使这个能代理支持HTTPS流量,且不会经常发生证书错误,我们需要做一些事情:

  • 创建自己的CA,并在本地安装作为一个可信的根证书。
  • 向我们的openresty配置文件添加代码,以便根据SNI对任何域名进行实时证书签名

这听起来好像很多工作要做,但所有的复杂的工作nginx 已经帮我们完成了

如果你想在这个版块博文更新时得到通知,,请订阅这个博客

如果你完全不知所云, 这是一个基本的openresty配置 这里将全部的记录了我们所做的。

第 8 段(可获 2 积分)

文章评论