nginx tcp负载均衡,替换阿里云slb

原创
2020/03/28 17:56
阅读数 1.3K

  我们知道nginx以前只用来做http的负载均衡,tcp,udp的负载均衡是用lvs或者haproxy,但是这两个软件都需要绑定逻辑地址,那么问题来了,使用公有云主机是不能绑定逻辑地址的,所以只能用阿里云提供的SLB(负载均衡),那么就会有两个问题出现了。

1.多花一笔钱用来支付SLB消费。

2.开启负载均衡SLB后ECS存在大量TIMEWAIT的内网端口连接,负载均衡默认会抹除 tcp 连接的 timestamp 属性,linux协议栈的 tw_reuse(time_wait 状态连接复用)无法生效,time_wait 状态连接堆积导致客户端端口不足  

所以今天来介绍下nginx实现tcp负载均衡

The ngx_stream_core_module module is available since version 1.9.0. This module is not built by default, it should be enabled with the --with-stream configuration parameter.

官方这么说的 ,1.9.0以后开始有这个功能的,编译的时候需要启用--with-stream选项。

e.g:

 ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' --add-module=../naxsi/naxsi_src/ --add-module=../ngx_dynamic_limit_req_module/ --with-stream

nginx.conf

user  nginx;
worker_processes  4;

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


events {
    worker_connections  1024;
}

stream {
    upstream v3_slb_order {
       server 172.16.230.49:8080 max_fails=3 fail_timeout=3s;
       server 172.16.230.50:8080 max_fails=3 fail_timeout=3s;
    }
    upstream v3_slb_member {
       server 172.16.230.49:9090 max_fails=3 fail_timeout=3s;
       server 172.16.230.50:9090 max_fails=3 fail_timeout=3s;
    }
    upstream v3_slb_goods {
       server 172.16.230.49:7070 max_fails=3 fail_timeout=3s;
       server 172.16.230.50:7070 max_fails=3 fail_timeout=3s;
    }

    server {
        listen 8080;
        proxy_connect_timeout 1s;
        proxy_timeout 10s;
        proxy_pass v3_slb_order;
    }
    server {
        listen 9090;
        proxy_connect_timeout 1s;
        proxy_timeout 10s;
        proxy_pass v3_slb_member;
    }
    server {
        listen 7070;
        proxy_connect_timeout 1s;
        proxy_timeout 10s;
        proxy_pass v3_slb_goods;
    }

}
http {
    include       /etc/nginx/mime.types;
....

....

}

这个时候只需要请求nginx的端口就能达到负载的目的了

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部