Nginx TCP 负载均衡:stream 模块配置

工作上遇到需要用nginx做负载均衡,参考了前同事留下的作业顺利搞定,感觉这块很有意义写篇文档记录。

参考:[nginx tcp负载均衡(Stream模块)配置说明]( https://blog.csdn.net/fuck487/article/details/106287710#:~:text=创建最高级别的stream(与http同一级别),定义一个upstream组 名称为kevin,由多个服务组成达到负载均衡 ,%E5%AE%9A%E4%B9%89%E4%B8%80%E4%B8%AA%E6%9C%8D%E5%8A%A1%E7%94%A8%E6%9D%A5%E7%9B%91%E5%90%ACTCP%E8%BF%9E%E6%8E%A5%EF%BC%88%E5%A6%82%EF%BC%9A8081%E7%AB%AF%E5%8F%A3%EF%BC%89%EF%BC%8C%20%E5%B9%B6%E4%B8%94%E6%8A%8A%E4%BB%96%E4%BB%AC%E4%BB%A3%E7%90%86%E5%88%B0%E4%B8%80%E4%B8%AAupstream%E7%BB%84%E7%9A%84kevin%E4%B8%AD%EF%BC%8C%E9%85%8D%E7%BD%AE%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E7%9A%84%E6%96%B9%E6%B3%95%E5%92%8C%E5%8F%82%E6%95%B0%E4%B8%BA%E6%AF%8F%E4%B8%AAserver%EF%BC%9B%E9%85%8D%E7%BD%AE%E4%BA%9B%E5%A6%82%EF%BC%9A%E8%BF%9E%E6%8E%A5%E6%95%B0%E3%80%81%E6%9D%83%E9%87%8D%E7%AD%89%E7%AD%89%E3%80%82)
参考:利用nginx进行TCP负载均衡实战

直接上配置

user  nginx;
worker_processes  2;

error_log  /var/log/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

stream {
        log_format proxy '$remote_addr [$time_local] '
                 '$protocol $status $bytes_sent $bytes_received '
                 '$session_time "$upstream_addr" '
                 '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';

        access_log /var/log/nginx/access.log proxy;


        upstream stream_backend {
                least_conn;    ## 默认是轮询算法,这里修改为:least-connected :对于每个请求,nginx选择当前连接数最少的server来处理

                server 192.168.230.25:10014 max_fails=2 fail_timeout=30s;
                server 192.168.230.61:10014 max_fails=2 fail_timeout=30s;

        server {
                listen          443 ssl;
                proxy_protocol on;
                ssl_certificate        keys/xx.pem;
                ssl_certificate_key    keys/xx.pem;
                proxy_pass    stream_backend;
                proxy_timeout 3600s;
                proxy_connect_timeout 10s;
        }
}

这个配置比较好理解,项目上有需要也可以直接用。

stream 模块介绍

参考:NGINX Stream模块原理及代码分析

从1.9.0开始,NGINX增加了stream模块用来实现四层协议的转发、代理和负载均衡。

与著名的四层LB软件lvs相比,stream 模块(开源版)无论从功能还是性能上,都有一定的差距,实现也相对简单。从性能上来说,stream模块在应用层实现四层的转发,需要与两端建立起socket连接,然后两端的数据收发进行代理转发。因此,大量的数据从内核态到用户态再从用户态到内核态传递。这些数据copy加上系统调度的开销,使得它的性能与纯内核态转发的lvs相比,有一定差距。

在用户态做四层的proxy,从原理上讲主要有如下步骤:

  • 创建一个socket 监听client连接。

  • Client连接到来以后,使用load balancer算法选取一个正确的upstream 服务器并且建立socket连接。

  • 把从client收到的数据转发给upstream server,同时把upstream server收到的数据转发给client。

日志格式解释

$remote_addr:客户端的IP地址。
$time_local:请求的时间和日期。
$protocol:请求使用的协议(例如HTTP/1.1)。
$status:响应的状态码。
$bytes_sent:发送给客户端的字节数。
$bytes_received:从客户端接收的字节数。
$session_time:请求的处理时间。
$upstream_addr:后端服务器的IP地址和端口号。
$upstream_bytes_sent:发送给后端服务器的字节数。
$upstream_bytes_received:从后端服务器接收的字节数。
$upstream_connect_time:与后端服务器建立连接的时间。

posted @ 2023-07-07 16:55  武平宁  阅读(4016)  评论(0)    收藏  举报