1. 程式人生 > >Nginx TCP/UDP 代理

Nginx TCP/UDP 代理

這個模組可以實現基於TCP、UDP和Unix域的socket的協議的代理服務。這個 模組是在nginx-1.9 以後版本才新增的模組,如果要使用這個模組的話,要重新編譯這個原始碼,參考之前的的部落格nginx安裝,新增編譯選項--with-stream。就可以使用 這個模組

配置基於TCP連線和UDP的資料報的反向代理

  • 1.建立最頂層的stream {}
stream{
....
}
  • 2.可以在stream {}塊中建立一個或多個的server {}配置項
  • 3.在每個server {}配置塊中,要填寫listen目標(IP+埠或是埠),如果是UDP協議還要包括 udp引數。在stream
    TCP是 預設 的協議。如果不進行 設定,系統預設是TCP協議 去 監聽。
stream {
    server {
        listen 12345;
        ...
    }
    server {
        listen 53 udp;
        ...
    }
    ...
}
  • 4.利用proxy_pass選項定義被代理的 伺服器或是上游組
stream {
    server {
        listen     12345;

        #TCP traffic will be proxied to the "stream_backend" upstream group
proxy_pass stream_backend; } server { listen 12346; #TCP traffic will be proxied a proxied server proxy_pass backend.example.com:12346; } server { listen 53 udp; #UDP traffic will be proxied to the "dns_servers" upstream group
proxy_pass dns_servers; } ... }
  • 5.如果代理伺服器有幾個 網路介面,可以固定一個源IP和源埠去連線上游的伺服器,可以選擇proxy_bind欄位去繫結的特定的IP和埠去連線上游的伺服器(這個欄位是可選的)
  stream {
    ...
    server {
        listen     127.0.0.1:12345;
        proxy_pass backend.example.com:12345;
        proxy_bind 127.0.0.1:12345;
    }
}

這個 選項很可能需 要管理員使用者的許可權去 配置路由表截斷來源被代理伺服器的網路流量 。
+ 6.(這個欄位是可選的),可以調整用來 傳輸代理伺服器和上游組連線資料的雙向記憶體快取區的大小,根據實際傳輸的資料大小進行調整,如果傳輸資料比較少,這樣做可以節省空間,如果資料量 大的可以減少socket read/write的次數

stream {
    ...
    server {
        listen            127.0.0.1:12345;
        proxy_pass        backend.example.com:12345;
        proxy_buffer_size 16k;
    }
}

配置TCP和UDP負載均衡

  • 1.在 top-level stream{}區塊 裡面可以新增一個或多個upstream{}的配置項,例如:stream_backend面向TCP servers和dns_server面向 的 是UDP_servers。
stream {
    upstream stream_backend {
        ...    
    }

    upstream dns_servers {
        ...    
    }
    ...
}

注意:upstream group一定要在之前 定義proxy_pass
+ 2.在upstream模組,使用server指令定義每一個upstream。包括它的域名或是IP地址加上必要的埠號。

stream {
    upstream stream_backend {
        server backend1.example.com:12345;
        server backend2.example.com:12345;
        server backend3.example.com:12346;
        ...
    }
    upstream dns_servers {
        server 192.168.136.130:53;
        server 192.168.136.131:53;
        ...
    }
    ...
}
  • 3.配置負載均衡的方法使用的是上游組,可以指定以下的一種方法:

    • round-robin(預設)
    • least-conn Nginx選擇當前連線數最少的伺服器
    • least_time Nginx選擇最小延時時間和連線數最少的伺服器。最小延時時間是基於以下引數進行運算的
      • connect-連線上游伺服器的時間
      • first_byte 收到第一位元組的最短時間
      • last_byte 收到伺服器的響應

      upstream stream_backend {
      least_time first_byte;
      
      server backend1.example.com:12345;
      server backend2.example.com:12345;
      server backend3.example.com:12346;
      }
    • hash的方法,伺服器基於使用者定義值,例如:源IP地址($remote_addr)

 upstream stream_backend {
    hash $remote_addr;

    server backend1.example.com:12345;
    server backend2.example.com:12345;
    server backend3.example.com:12346;
}
  • 4.(可選的)針對每一個上游伺服器 設定固定引數,包括最大連線數,伺服器的權重。
upstream stream_backend {
    hash   $remote_addr consistent;
    server backend1.example.com:12345 weight=5;
    server backend2.example.com:12345;
    server backend3.example.com:12346 max_conns=3;
}

    upstream dns_servers {
        least_conn;
        server 192.168.136.130:53;
        server 192.168.136.131:53;
        ...
    }