Nginx
ngx_stream_core_module 和最終使用者 ip
假設我有一些服務在原始 TCP 級別上工作,我想為其添加負載平衡。我試過用
ngx_stream_core_module
. 雖然 TCP 流確實代理到後端伺服器,但我發現了一些我無法解決的問題。
- 我的服務寫在 node.js 中,這是設置程序管理器的常用技術,如 pm2,它會重新啟動節點以防它消耗太多記憶體。但這顯然會終止所有連接的客戶端。我的期望是 nginx 將使用者連接到上游的下一個伺服器(嗯,也許它太 > 2016,但是),但我的連接剛剛關閉。
- 我的服務需要最終使用者 ip 和遠端埠才能執行,但在應用程序套接字的 remoteAddress 和 remotePort 中指向本地 nginx 實例。即,當我將其列印到緩衝區時,我在代理連接時看到 127.0.0.1,當我直接連接到節點時看到我的真實 IP。我看到 nginx 支持一些配置變數(從 v.1.11.2 開始),其中 $remote_addr 就是其中之一。但我沒有看到任何資訊如何將此變數轉發到上游。
proxy_set_header
指令在流中不可用,並且看起來沒問題,因為 TCP 中沒有任何“標頭”。這甚至可能嗎?- 我不是開發人員,而是編碼員,所以我聽說過 haproxy,但我不知道它是否可以解決這兩個問題。它可以?
對於測試,我使用了啞 echo node.js 伺服器,所有工作部分都縮小到
server.on('connection', socket => { socket.write(`Hello from ${instance}, ${socket.remoteAddress}:${socket.remotePort}\n`); });
我的 nginx 配置的相關部分是
stream { upstream echo { server localhost:9000; server localhost:9001; } server { listen 8080; proxy_connect_timeout 1s; proxy_timeout 2h; proxy_pass echo; } }
最後我用netcat檢查了一些東西。
// direct connect ~|⇒ nc 95.85.15.120 9000 Hello, ::ffff:86.110.174.98:65408 // proxied connect ~|⇒ nc 95.85.15.120 8080 Hello, ::ffff:127.0.0.1:44056
這是模組文件。
- 這不適用於 TCP,因為它肯定會破壞幾乎所有在上面工作的協議。例如,如果在某些消息或命令的中間斷開連接怎麼辦?
- 您可以使用代理協議傳輸原始IP,但需要您的後端支持。
或者您可以配置綁定到客戶端 IP:
proxy_bind $remote_addr transparent;