Nginx

ngx_stream_core_module 和最終使用者 ip

  • August 17, 2016

假設我有一些服務在原始 TCP 級別上工作,我想為其添加負載平衡。我試過用ngx_stream_core_module. 雖然 TCP 流確實代理到後端伺服器,但我發現了一些我無法解決的問題。

  1. 我的服務寫在 node.js 中,這是設置程序管理器的常用技術,如 pm2,它會重新啟動節點以防它消耗太多記憶體。但這顯然會終止所有連接的客戶端。我的期望是 nginx 將使用者連接到上游的下一個伺服器(嗯,也許它太 > 2016,但是),但我的連接剛剛關閉。
  2. 我的服務需要最終使用者 ip 和遠端埠才能執行,但在應用程序套接字的 remoteAddress 和 remotePort 中指向本地 nginx 實例。即,當我將其列印到緩衝區時,我在代理連接時看到 127.0.0.1,當我直接連接到節點時看到我的真實 IP。我看到 nginx 支持一些配置變數(從 v.1.11.2 開始),其中 $remote_addr 就是其中之一。但我沒有看到任何資訊如何將此變數轉發到上游。proxy_set_header指令在流中不可用,並且看起來沒問題,因為 TCP 中沒有任何“標頭”。這甚至可能嗎?
  3. 我不是開發人員,而是編碼員,所以我聽說過 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

這是模組文件

  1. 這不適用於 TCP,因為它肯定會破壞幾乎所有在上面工作的協議。例如,如果在某些消息或命令的中間斷開連接怎麼辦?
  2. 您可以使用代理協議傳輸原始IP,但需要您的後端支持。

或者您可以配置綁定到客戶端 IP

proxy_bind $remote_addr transparent;

引用自:https://serverfault.com/questions/797449