無涯教程:Nginx - TCP和UDP負載平衡介紹

無涯教程網:​Nginx Plus可以代理和負載平衡 TCP(傳輸控制協議)流量。TCP是許多流行的應用程序和服務的協議,例如MySQL,LDAP和RTMP。

同樣,Nginx Plus可以代理和負載均衡UDP流量。用戶數據報協議(UDP)是許多流行的非事務性應用程序(例如DNS,Syslog和RADIUS)的協議。

配置反向代理

首先,我們需要配置反向代理,以便Nginx開源或Nginx Plus可以將TCP連接或UDP數據報從客戶端轉發到upstream組或代理服務器。

使用Nginx配置文件並執行以下步驟:

1.創建一個stream{}塊。

stream {
    # ...
}

2.在stream{} 上下文中爲每個虛擬服務器定義一個或多個server{}配置塊。

3.在server{}配置塊中,包括每個服務器的listen指令,以定義服務器監聽的IP地址或端口。

對於UDP流量,還添加 UDP 參數。由於TCP是流上下文的默認協議,因此沒有要監聽指令的TCP參數:

stream {

    server {
        listen 12345;
        # ...
    }

    server {
        listen 53 udp;
        # ...
    }
    # ...
}

4.添加proxy pass指令以定義代理服務器或服務器將流量轉發到的upstream組:

stream {

    server {
        listen     12345;
        # traffic of TCP will be forwarded to the "stream_backend" upstream group
        proxy_pass stream_backend;
    }

    server {
        listen     12346;
        #traffic of TCP will be forwarded to the specified server
        proxy_pass backend.example.com:12346;
    }

    server {
        listen     53 udp;
        #traffic of UDP will be forwarded to the "dns_servers" upstream group
        proxy_pass dns_servers;
    }
    # ...
}

5.如果代理服務器具有多個不同的網絡接口,則可以選擇將Nginx配置爲在連接到upstream服務器時使用特定的源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.(可選)我們可以調整兩個內存緩衝區的大小,nginx可以在其中放置來自客戶端和upstream連接的數據。如果數據量少,則可以減少緩衝區,這樣可以節省內存資源。

如果有大量數據,則可以增加緩衝區的大小以減少套接字的讀寫操作次數。在一個連接上接收到數據後,Nginx將讀取該數據並通過另一連接轉發該數據。要控制緩衝區,請使用proxy_buffer_size指令:

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

配置TCP或UDP負載平衡

要配置TCP或UDP負載平衡:

1.首先,創建一組服務器或一個upstream組,其流量將進行負載均衡。在stream{}上下文中定義upstream{}的一個或多個配置塊,併爲upstream組設置名稱,例如,TCP服務器的 stream_backend  dns_servers 對於UDP服務器:

stream {

    upstream stream_backend {
        # ...
    }

    upstream dns_servers {
        # ...
    }

    # ...
}

2.用upstream服務器填充upstream組。在upstream塊中,爲每個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.配置upstream組使用的負載均衡方法。我們可以使用以下方法之一:

Round Robin              - 默認情況下,Nginx使用Round Robin算法來負載均衡流量,並將其順序引導到已配置的upstream組中的服務器。由於輪詢是默認方法,因此沒有指令,只需在stream{}上下文中創建一個upstream{}配置塊幷包含服務器指令。

Least Connections  - Nginx選擇當前活動連接數最少的服務器。

Least Time                 -  此方法僅適用於Nginx Plus。Nginx選擇具有最低平均延遲和最少活動連接數的服務器。參數爲:

  • connect     -   連接upstream服務器的時間

  • 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      -  Nginx根據用戶定義的鍵選擇服務器,例如源IP地址($remote_addr)。

upstream stream_backend {
    hash $remote_addr;
    server backend1.example.com:12345;
    server backend2.example.com:12345;
    server backend3.example.com:12346;
}

Random     -  在這種情況下,每個連接都會傳遞到隨機選擇的服務器。如果指定了參數 two ,則首先Nginx考慮服務器權重隨機選擇兩個服務器,然後使用指定的服務器選擇其中一個服務器。

  • Least_conn                    -  活動連接數最少。

  • least_time = header      -  從服務器接收響應標頭的最短平均時間。

  • Least_time = last_byte  -  從服務器接收完整響應的最短平均時間。

upstream stream_backend {
    random two least_time=last_byte;
    server backend1.example.com:12345;
    server backend2.example.com:12345;
    server backend3.example.com:12346;
    server backend4.example.com:12346;
}

4.(可選)爲每個upstream服務器定義服務器特定的參數,包括最大連接數,服務器權重等:

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;
    # ...
}

TCP和UDP負載平衡配置示例

讓我們看一下TCP和UDP負載平衡配置的示例:

stream {
    upstream stream_backend {
        least_conn;
        server backend1.example.com:12345 weight=5;
        server backend2.example.com:12345 max_fails=2 fail_timeout=30s;
        server backend3.example.com:12345 max_conns=3;
    }
    
    upstream dns_servers {
        least_conn;
        server 192.168.136.130:53;
        server 192.168.136.131:53;
        server 192.168.136.132:53;
    }
    
    server {
        listen        12345;
        proxy_pass    stream_backend;
        proxy_timeout 3s;
        proxy_connect_timeout 1s;
    }
    
    server {
        listen     53 udp;
        proxy_pass dns_servers;
    }
    
    server {
        listen     12346;
        proxy_pass backend4.example.com:12346;
    }
}

在以上示例中,所有與TCP和UDP代理相關的功能都在流的塊內進行配置。

有兩個名爲upstream的塊,每個塊包含三個託管彼此相同內容的服務器。在每個服務器的server中,服務器名稱後跟必需的端口號。根據最小連接負載平衡方法,連接在所有服務器之間分配:連接到具有較少活動連接的服務器。

https://www.learnfk.com/article-nginx-tcp-and-udp-load-balancing

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