概述
這兩天在寫 go 項目, 一個 HTTP 服務器. 之前寫的是 php 項目, Nginx 監(jiān)聽80端口, 根據域名將請求分配給不同項目. 現在換了 go, 自然也想延續(xù)這個操作, 畢竟都是跑在同一臺服務器上. 那么問題來了, 我的nginx 監(jiān)聽80端口的同時, go 服務器是無法同樣監(jiān)聽80端口的. 這該如何是好啊, 給我整的一臉懵逼.
nginx 轉發(fā) go 服務
不過想了一下, 發(fā)現自己進入了思維誤區(qū). 為什么都要監(jiān)聽80端口呢? go 服務監(jiān)聽其他端口, 然后 nginx 將請求進行端口的轉發(fā)不就可以了么. 真是個傻子. 搜了一下 nginx 的配置, 確實有端口轉發(fā)的配置. 如下:
#配置負載均衡池
upstream test_go_pool{
server 127.0.0.1:8090;
}
#Demo2端口轉發(fā)
server {
listen 80;
server_name test.go.com;
error_log /var/log/nginx/test_go.error.log;
access_log /var/log/nginx/test_go.access.log;
#將所有請求轉發(fā)給均衡池的應用處理
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://test_go_pool;
}
}
到這里, 如果 go 服務已經啟動了, 應該就沒有問題了. (如果是線上, go 服務的端口不用對外開放, 僅供內部 nginx 訪問即可)
Docker 訪問宿主網絡
但是我的環(huán)境訪問失敗了. 究其原因, 我的 nginx 是跑在 docker 中的, go 服務是跑在宿主主機上的. 所以在對127.0.0.1回環(huán)地址訪問的時候, 沒有訪問的宿主主機. 解決的方向也很清晰, 只要能夠訪問到宿主主機的網絡就行了.
方案一
最先想到的方案, 就是將127.0.0.1更換成宿主主機的 IP. mac 下執(zhí)行 ifconfig, 可以找到本機的 IP 地址. 將地址更換之后, 就可以了. 但是如果是移動網絡等, IP 經常換的話, 就很難受了.
方案二
更改網絡鏈接方式. 虛擬機網絡的鏈接方式有: bridge(橋接網絡), host(共用網絡), 以及無網絡.
docker 默認使用的是橋接的形式, 如果換成host, 就沒有訪問不到的問題了.更改之后, 可以直接通過127.0.0.1回環(huán)地址訪問, 就沒有 IP 更換的問題了. 但同時的, host 方式會將虛擬機的所有端口全都與主機共用, 隔離性太差.
方案三
經過一番摸索, 找到了宿主主機的名字: docker.for.mac.host.internal. 將地址更換成這個, docker 會自動映射到宿主主機上.
至此, 我的問題已經解決了. 不過就在我準備收手的時候, 又讓我找到了另外一個.
方案四
方案三的方式, 看名字也知道, 這個映射是針對 mac 的. 如果不是在 mac 上裝的 docker 怎么辦呢?
host.docker.internal
這個DNS 名稱, 可以直接映射到宿主主機. 完美解決. 同時: gateway.docker.internal 是網關的名稱.
結束.... 簡單記錄以下.