使用 Nginx 自己實現一個 Web 除錯代理伺服器

2016-08-01    分類:WEB開發、程式設計開發、首頁精華0人評論發表於2016-08-01

本文由碼農網 – 唐李川原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃

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

譯文連結:http://www.codeceo.com/article/make-web-debug-proxy-server.html
英文原文:twiinsen
翻譯作者:碼農網 – 唐李川
轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]

相關文章