nginx 端口轉發

概述

這兩天在寫 go 項目, 一個 HTTP 服務器. 之前寫的是 php 項目, nginx 監聽80端口, 根據域名將請求分配給不同項目. 現在換了 go, 自然也想延續這個操作, 畢竟都是跑在同一臺服務器上. 那麼問題來了, 我的nginx 監聽80端口的同時, go 服務器是無法同樣監聽80端口的. 這該如何是好啊, 給我整的一臉懵逼.

nginx 轉發 go 服務

不過想了一下, 發現自己進入了思維誤區. 爲什麼都要監聽80端口呢? go 服務監聽其他端口, 然後 nginx 將請求進行端口的轉發不就可以了麼. 真是個傻子. 搜了一下 nginx 的配置, 確實有端口轉發的配置. 如下:

#配置負載均衡池
upstream test_go_pool{
    server 127.0.0.1:8090;
}

#Demo2端口轉發
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;
    
    #將所有請求轉發給均衡池的應用處理
    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 訪問宿主網絡

但是我的環境訪問失敗了. 究其原因, 我的 nginx 是跑在 docker 中的, go 服務是跑在宿主主機上的. 所以在對127.0.0.1迴環地址訪問的時候, 沒有訪問的宿主主機. 解決的方向也很清晰, 只要能夠訪問到宿主主機的網絡就行了.

方案一

最先想到的方案, 就是將127.0.0.1更換成宿主主機的 IP. mac 下執行 ifconfig, 可以找到本機的 IP 地址. 將地址更換之後, 就可以了. 但是如果是移動網絡等, IP 經常換的話, 就很難受了.

image-20200813233442407

方案二

更改網絡鏈接方式. 虛擬機網絡的鏈接方式有: bridge(橋接網絡), host(共用網絡), 以及無網絡.

docker 默認使用的是橋接的形式, 如果換成host, 就沒有訪問不到的問題了.更改之後, 可以直接通過127.0.0.1迴環地址訪問, 就沒有 IP 更換的問題了. 但同時的, host 方式會將虛擬機的所有端口全都與主機共用, 隔離性太差.

方案三

經過一番摸索, 找到了宿主主機的名字: docker.for.mac.host.internal. 將地址更換成這個, docker 會自動映射到宿主主機上.

至此, 我的問題已經解決了. 不過就在我準備收手的時候, 又讓我找到了另外一個.

方案四

方案三的方式, 看名字也知道, 這個映射是針對 mac 的. 如果不是在 mac 上裝的 docker 怎麼辦呢?

host.docker.internal

這個DNS 名稱, 可以直接映射到宿主主機. 完美解決. 同時: gateway.docker.internal 是網關的名稱.

結束.... 簡單記錄以下.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章