使用 Nginx 自己實現一個 Web 除錯代理伺服器
本文由碼農網 – 唐李川原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃!
在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
翻譯作者:碼農網 – 唐李川
[ 轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]
相關文章
- 使用PHP內建web伺服器,實現簡單的除錯應用PHPWeb伺服器除錯
- 自己動手實現java斷點/單步除錯(一)Java斷點除錯
- Nginx初步(反向代理/Web伺服器/輕量級)NginxWeb伺服器
- Nginx-正向代理實現Nginx
- 在自己的 app 中使用 Sarfari 開發工具除錯 Web 頁面APP除錯Web
- nginx 錯誤除錯Nginx除錯
- 使用Nginx搭建公網代理伺服器Nginx伺服器
- 介紹Nginx、正向代理和實現反向代理的兩個例項Nginx
- Nginx反向代理實現跨域Nginx跨域
- 除錯 Ingress Nginx除錯Nginx
- 自己動手實現java斷點/單步除錯(二)Java斷點除錯
- 實現一個自己的mvvmMVVM
- nginx反向代理實現不同域名對映到同一臺伺服器的相同埠Nginx伺服器
- Nginx(五):http反向代理的實現NginxHTTP
- 使用 express 輕鬆實現反向代理伺服器Express伺服器
- 自己實現一個window.location
- 自己實現一個java的arraylistJava
- Nginx搭建反向代理負載均衡和web快取伺服器Nginx負載Web快取伺服器
- Nginx 高階篇(一)反向代理實現動靜分離Nginx
- 如何使用 Visual Studio Code 除錯 Angular Schematics 實現除錯Angular
- 自己動手實現一個前端路由前端路由
- 自己實現一個滑動視窗
- 自己動手實現一個EventBus框架框架
- 自己實現一個Controller——終極型Controller
- 自己實現一個Controller——精簡型Controller
- 使用Netty和動態代理實現一個簡單的RPCNettyRPC
- Nginx伺服器的使用與反向代理負載均衡Nginx伺服器負載
- 使用docker和nginx搭建一個下載伺服器DockerNginx伺服器
- find 命令刪除冗餘 Nginx 錯誤日誌並實現備份Nginx
- 【web前端】自己實現Array.reduce()Web前端
- wsl 2 unbuntu 部署 asp.net core 使用 nginx 做反向代理,除錯檔案上傳失敗ASP.NETNginx除錯
- 實現一個屬於自己的React框架(一)React框架
- nginx實現檔案伺服器Nginx伺服器
- nginx 反向代理 swoole 使用Nginx
- 論如何在伺服器上部署一個自己的web前端專案伺服器Web前端
- 如何自己實現一個 mobx – 原理解析
- 自己動手實現一個阻塞佇列佇列
- Pycharm連線遠端伺服器並實現遠端除錯PyCharm伺服器除錯
- Docker 中使用 Nginx 代理多個應用站點DockerNginx