Nginx系列教程(13) - TCP反向代理实现

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: Nginx系列教程(13) - TCP反向代理实现

Nginx在1.9.0的时候,增加了一个 stream 模块,用来实现四层协议(网络层和传输层)的转发、代理、负载均衡等。stream模块的用法跟http的用法类似,允许我们配置一组TCP或者UDP等协议的监听,然后通过proxy_pass来转发我们的请求,通过upstream添加多个后端服务,实现负载均衡,下面我们从基础网络模型讲起:

1.网络模型

在前面的章节中,我们知道,网络的七层协议是这样的,详细的内容可以参考文章:《网络七层协议,四层协议,五层协议?》

OSI中的层 功能 TCP/IP协议族
应用层 文件传输、电子邮件、文件服务、虚拟终端 TFTP、HTTP、SNMP、FTP、SMTP、DNS、RIP、Telnet
表示层 数据格式化、代码转换、数据加密 没有协议
会话层 接触或建立与别的节点联系 没有协议
传输层 提供端对端的接口 TCP、UDP
网络层 为数据包选择路由 IP、ICMP、OSPF、BGP、IGMP、ARP、RARP
数据链路层 传输有地址的帧以及错误检测功能 SLIP、CSLIP、PPP、MTU、ARP、RARP
物理层 以二进制数据形式在物理媒体上传输数据 ISO2110、IEEE802、IEEE802.2

说到网络协议,很容易就会抛出一个问题,这些网络服务通过什么机制去实现的?

答:Socket

  1. Socket就是为网络服务提供的一种机制。
  2. 通讯的两端都有Sokcet
  3. 网络通讯其实就是Sokcet间的通讯
  4. 数据在两个Sokcet间通过IO传输。

既然端对端的网络通讯是通过Socket IO传输的,那么它们是通过什么传输的呢?没错就是通过TCP或者UDP传输的:

UDP:

  1. 是面向无连接, 将数据及源的封装成数据包中,不需要建立连接。
  2. 每个数据报的大小在限制64k内。
  3. 因无连接,是不可靠协议。
  4. 不需要建立连接,速度快。

TCP:

  1. 建议连接,形成传输数据的通道。
  2. 在连接中进行大数据量传输,以字节流方式。
  3. 通过三次握手完成连接,是可靠协议。
  4. 必须建立连接效率会稍低。

从网络的七层协议中,可以看到TCP和UDP使用用于传输层的,而HTTP是用于应用层的。可以看出HTTP协议是基于TCP协议封装成超文本传输协议,HTTP分为请求和响应,HTTP协议分为请求参数和方法类型、请求头、请求体,响应分为 响应状态、响应头、响应体等。(HTTP我们常用到,此处就不再详细讲解了)。


到这里,要回归到本文的主题了,本文主要讲解的是如何基于Nginx1.9实现四层负载均衡

先理解两个概念"四层负载均衡"和"七层负载均衡":

四层负载均衡: 在网络模型中的传输层中,基于主要是基于tcp协议报文实现负载均衡(比如LVShaproxy就是四层负载均衡器),使用改写报文的源地址和目的地址。

七层负载均衡: 在网络模型中应用层中,基于URL或者HTTP协议实现负载均衡,Web服务器。

其它:《Nginx、HAProxy、LVS三者的优缺点》

2.环境安装

1.下载Nginx( 作用:实现反向代理、负载负载库)

wget http://nginx.org/download/nginx-1.9.10.tar.gz

2.下载nginx_tcp_proxy_module 插件 (nginx 支持TCP转发和负载均衡的支持)

wget https://github.com/yaoweibin/nginx_tcp_proxy_module/tarball/master

3.解压Nginx

tar -zxvf nginx-1.9.10.tar.gz

4.解压nginx_tcp_proxy_module 插件

tar -zxvf master

5.进入Nginx解压目录,下载tcp.patch最新补丁

cd nginx-1.9.10
patch -p1 < ../yaoweibin-nginx_tcp_proxy_module-b8a3028/tcp.patch

如果报错:"-bash: patch: 未找到命令" 执行:

yum -y install patch

5.配置Nginx

./configure --add-module=../yaoweibin-nginx_tcp_proxy_module-b8a3028

6.编译Nginx

make && make install

如果报错:

In file included from …/nginx_tcp_proxy_module-master/ngx_tcp.h:32,

from …/nginx_tcp_proxy_module-master/ngx_tcp.c:5:

…/nginx_tcp_proxy_module-master/ngx_tcp_upstream.h:144: error: expected specifier-qualifier-list before ‘ngx_resolver_addr_t’

make[1]: *** [objs/addon/nginx_tcp_proxy_module-master/ngx_tcp.o] Error 1

make[1]: Leaving directory `/opt/apps_install/nginx-1.9.9’

make: *** [build] Error 2

修改第三方模块包里的头文件,ngx_tcp_upstream.h 144 行将ngx_resolver_addr_t 改为 ngx_addr_t

cd /usr/local/yaoweibin-nginx_tcp_proxy_module-b8a3028
vi ngx_tcp_upstream.h

7.继续 make && make install

这里的tcp_proxy_module好像出问题了,问题还没解决,如果解决了的小伙伴可以私信我 ! 为了不影响整体思路,直接看下一步:

8.修改nginx.conf配置文件

worker_processes  1;
events {
    worker_connections  1024;
}
### 修改为TCP模块
tcp {
   ### 定义多个上游服务器
   upstream  xxx{
      ### 定义TCP模块上游服务器
      server 192.168.5.165:80001;
    server 192.168.5.165:80002;
   }
    server {
        listen       9999;
        server_name  192.168.212.137;
    ### 反向代理upstream
        proxy_pass xxx;
    }
}

3.测试

1.启动Nginx服务器

./nginx

2.使用TCP/UDP测试工具(网上搜,这里使用的是myfiles_TCPUDPDebug102_Setup.exe)新增两个服务端,分别为192.168.5.165:80001和192.168.5.165:80002:

3.Ngxin连接反向代理TCP服务器

效果:

  • 连接Nginx服务器 192.168.212.138:9999,会立刻反向代理给192.168.5.165:8001,8001会自动连接连接的时候进行反向代理。
  • 断开连接后,连接Nginx服务器 192.168.212.138:9999,会立刻反向代理给192.168.5.165:8002
  • 断开连接192.168.212.138:9999轮流操作,8001和8002也会轮流连接(轮询算法)

    自动连接到192.168.5.165:8002:

    连接成功后就可以相互的发送消息了。

总结

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
2月前
|
负载均衡 监控 应用服务中间件
配置Nginx反向代理时如何指定后端服务器的权重?
配置Nginx反向代理时如何指定后端服务器的权重?
155 61
|
14天前
|
缓存 Java 应用服务中间件
nginx的正向代理和反向代理以及tomcat
Nginx的正向代理和反向代理功能在不同的场景中具有重要作用,正向代理主要用于客户端访问控制和匿名浏览,而反向代理则用于负载均衡和高可用性服务。Tomcat作为Java Web应用服务器,与Nginx结合使用,可以显著提升Web应用的性能和稳定性。通过合理配置Nginx和Tomcat,可以构建高效、稳定和可扩展的Web服务架构。
90 11
|
23天前
|
存储 应用服务中间件 nginx
nginx反向代理bucket目录配置
该配置实现通过Nginx代理访问阿里云OSS存储桶中的图片资源。当用户访问代理域名下的图片URL(如 `http://代理域名/123.png`)时,Nginx会将请求转发到指定的OSS存储桶地址,并重写路径为 `/prod/files/2024/12/12/123.png`。
60 5
|
2月前
|
缓存 负载均衡 算法
如何配置Nginx反向代理以实现负载均衡?
如何配置Nginx反向代理以实现负载均衡?
|
2月前
|
安全 应用服务中间件 网络安全
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
95 3
|
2月前
|
安全 应用服务中间件 网络安全
配置Nginx反向代理实现SSL加密访问的步骤是什么?
我们可以成功地配置 Nginx 反向代理实现 SSL 加密访问,为用户提供更安全、可靠的网络服务。同时,在实际应用中,还需要根据具体情况进行进一步的优化和调整,以满足不同的需求。SSL 加密是网络安全的重要保障,合理配置和维护是确保系统安全稳定运行的关键。
165 3
|
2月前
|
缓存 负载均衡 安全
Nginx的反向代理具体是如何实现的?
Nginx的反向代理具体是如何实现的?
|
Web App开发 前端开发 应用服务中间件
|
Web App开发 前端开发 应用服务中间件
nginx简易教程
Nginx 本文是一个 Nginx 极简教程,目的在于帮助新手快速入门 Nginx。 我在 Github 上创建了一个 Nginx 教程项目: Nginx。 教程中提供了一些常用场景的 Nginx 示例,示例可以通过脚本一键式启动,方便新手学习。
1232 0
|
2月前
|
缓存 应用服务中间件 网络安全
Nginx中配置HTTP2协议的方法
Nginx中配置HTTP2协议的方法
146 7
下一篇
开通oss服务