nginx 基于tcp/udp代理

2023年 5月 4日 50.1k 0

nginx从1.9.0版本开始,新增了ngx_stream_core_module模块,使nginx支持四层负载均衡。默认编译的时候该模块并未编译进去,需要编译的时候添加--with-stream,使其支持stream代理。
Nginx 基于tcp/udp代理
标签(空格分隔): Nginx
博客地址:https://i4t.com
nginx从1.9.0版本开始,新增了ngx_stream_core_module模块,使nginx支持四层负载均衡。默认编译的时候该模块并未编译进去,需要编译的时候添加--with-stream,使其支持stream代理。
同时需要说明一点,nginx也可以代理tcp的正向代理和反向代理,我这里主要以反向代理为基础,需要正向代理可以参考 Nginx 反向代理与正向代理
官方文档stream模块地址:http://nginx.org/en/docs/stream/ngx_stream_core_module.html

因为手上没有合适的环境,我这里设置nginx代理smtp。使用腾讯的smtp服务进行代理演示

Nginx搭建

1.nginx版本没有太大要求,1.9以上即可
wget http://nginx.org/download/nginx-1.10.3.tar.gz

#按照依赖包
yum install -y gcc glibc gcc-c++ prce-devel openssl-devel pcre-devel
useradd -s /sbin/nologin nginx -M 
tar xf nginx-1.10.3.tar.gz && cd nginx-1.10.3

#编译
./configure --prefix=/usr/local/nginx-1.10.3 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-stream

make && make install

检查
/usr/local/nginx/sbin/nginx -t

启动
/usr/local/nginx/sbin/nginx

查看服务器是否启动
netstat -lntp|grep nginx
    tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      7058/nginx: master

配置Nginx

stream不可以配置在http标签,需要和events同级,我这里就单独写一份配置文件,也方便后期维护管理

1.首先需要修改nginx.conf,添加include 引用server标签
cat >/usr/local/nginx/conf/nginx.conf <<EOF
worker_processes  1;
events {
    worker_connections  1024;
}
include       i4t.conf;

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
  }
}
EOF

##我们这里只是引用了一行include i4t.conf
#在这里我们设置长连接为65s,默认时长

解释一下什么是长连接

长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。
而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。
总之,长连接和短连接的选择要视情况而定。
具体网络中的应用的话:http 1.0一般就指短连接,smtp,pop3,telnet这种就可以认为是长连接。一般的网络游戏应用都是长连接

添加配置文件

cat >/usr/local/nginx/conf/i4t.com <<EOF
stream {
      upstream abcdocker {
        server smtp.qq.com:25  weight=5 max_fails=3 fail_timeout=30s;
     }

     server {
            listen 1998;
            proxy_pass abcdocker;
            proxy_connect_timeout 10s;
            proxy_timeout 24h;
              }
  }
EOF

##参数说明
#stream是使用tcp的模块
#weight轮训  
#max_fails 连接探测,如果发现后端异常,在单位周期为fail_timeout设置的时间,中达到max_fails次数,这个周期次数内,如果后端同一个节点不可用,那么接将把节点标记为不可用,并等待下一个周期(同样时常为fail_timeout)再一次去请求,判断是否连接是否成功。如果成功,将恢复之前的轮询方式,如果不可用将在下一个周期(fail_timeout)再试一次。
#proxy_connect_timeout 后端服务器连接的超时时间_发起握手等候响应超时时间

温馨提示:tcp代理不支持配置server_name

修改完配置文件后,我们nginx -t检查一下语法是否有问题。顺便我们启动nginx

$/usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx-1.10.3/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx-1.10.3/conf/nginx.conf test is successful

#启动
/usr/local/nginx/sbin/nginx

#服务器检查
[root@abcdocker ~]# lsof -i:1998
COMMAND   PID  USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
nginx   24034  root    6u  IPv4 34775578      0t0  TCP *:x25-svc-port (LISTEN)
nginx   24035 nginx    6u  IPv4 34775578      0t0  TCP *:x25-svc-port (LISTEN)
[root@abcdocker ~]# ps -ef|grep nginx
root     24034     1  0 08:22 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx    24035 24034  0 08:22 ?        00:00:00 nginx: worker process
root     26095 24232  0 08:33 pts/2    00:00:00 grep --color=auto nginx

访问测试telnet没有问题~image_1dcelbph51b9g1q644ib17i317i09.png-62.7kB

相关文章:

  1. [Nginx] – 性能优化 – 配置文件优化 [一]
  2. Nginx 相关内容 [持续补充2017.09.06-更]
  3. 阿里云SLB场景使用Nginx封用户真实IP
  4. Nginx upstream_check_module模块实现后端节点健康检查功能

相关文章

LeaferJS 1.0 重磅发布:强悍的前端 Canvas 渲染引擎
10分钟搞定支持通配符的永久有效免费HTTPS证书
300 多个 Microsoft Excel 快捷方式
一步步配置基于kubeadmin的kubevip高可用
istio全链路传递cookie和header灰度
REST Web 服务版本控制

发布评论