实战-使用NGINX实现4层的负载均衡
前言
我们通常所说的三层、四层、七层,这些概念是针对网络结构来划分的,用以指明负载均衡是在网络七层架构中的哪一层次上实现的。在本文中,我们将为大家进行一次实战演练,具体操作将通过使用nginx软件来演示如何实现四层的负载均衡。

四层负载均衡技术主要在传输层发挥作用,鉴于传输层仅支持TCP/UDP协议,这两种协议除了记录源IP地址和目标IP地址外,还涵盖了源端口号和目的端口号。当四层负载均衡服务器接收到客户端的请求后,它会通过调整数据包的地址信息(包括IP地址和端口号)来实现流量的转发,从而将请求发送至应用服务器。
Nginx在网页服务领域应用广泛,尤其在网页层扮演着前端代理和负载均衡的角色。自版本.9起,它引入了新的支持机制,能够通过特定方法实现TCP/UCP层的负载均衡功能;在本例中,我们正是采用了这种方法进行实施。
安装Nginx
使用安装即可
docker image pull nginx
查看是否启动
在执行命令时,用户root在名为c6461d00cb4c的容器内部,进入了/etc/nginx目录,随后运行了nginx -V指令来查看nginx软件的版本信息。
nginx version: nginx/1.21.5
由gcc 10.2.1版本编译,构建日期为2021年1月10日,适用于Debian 10.2.1-6发行版。
该软件系采用OpenSSL 1.1.1k版本构建,构建日期为2021年3月25日。
TLS SNI support enabled
配置参数:指定安装路径为 /etc/nginx 目录
--sbin-path=/usr/sbin/nginx
指定模块路径为/usr/lib/nginx/modules,不得更改。
请指定配置文件路径为/etc/nginx/nginx.conf文件。
错误日志的存储路径设置为:/var/log/nginx/error.log。
请确保将Nginx的访问日志保存至位于“/var/log/nginx/”目录下的“access.log”文件中。
设置nginx进程ID文件路径为/var/run/nginx.pid,并将锁定文件路径指定为/var/run/nginx.lock。
客户端临时存储路径设置为nginx的缓存目录中的client_temp子目录。
请设置Nginx的临时代理路径为:/var/cache/nginx/proxy_temp。
限制访问路径为:http-fastcgi-temp-path, 设定在,/var/cache/nginx/fastcgi_temp, 这一地址。
请确保配置文件中指定了以下路径,用于存储由Nginx和uWSGI共同使用的临时文件:/var/cache/nginx/uwsgi_temp。
禁止设置http-scgi临时路径为/var/cache/nginx/scgi_temp。
--user=nginx --group=nginx
启用兼容模式,配置文件异步处理,支持多线程功能。
--with-http_addition_module
启用http认证请求模块,同时激活http分布式版本控制模块。
--with-http_flv_module
启用http_gunzip模块,同时激活http_gzip_static模块。
--with-http_mp4_module
启用http随机索引模块,以及http真实IP模块。
启用http_secure_link模块,以及http_slice模块。
启用http_ssl模块,以及http_stub_status模块。
启用http子模块功能,同时激活http版本2模块,并配置邮件服务模块。
--with-mail_ssl_module
启用流式传输支持,激活真实IP模块,以及开启流式SSL模块。
启用流式SSL预读模块,同时配置编译器选项为“-g -O2”。
设置文件前缀映射为/data/builder/debuild/nginx-1.21.5/debian/debuild-base/,其中nginx-1.21.5对应映射值为“.”。
启用强栈保护功能,开启格式检查警告,设置格式错误为错误,并启用参数-Wp,。
-D_FORTIFY_SOURCE=2
启用-fPIC选项,同时设置链接器选项为-Wl,-z,relro,-Wl,-z,now,-Wl,--as-needed,并采用-pie模式。
--with- 表示已经支持到了模块
修改/etc/nginx/nginx.conf
stream{
upstream netty_test{
服务器地址为192.168.56.1,端口号为6666,权重设置为1。
服务器地址为192.168.56.1,端口号为7777,权重设置为1。
}
server {
listen 6665;
proxy_pass netty_test;
}
}
注意这里有一个搞了好久的坑
此部分内容与http处于同等层级,因此不宜直接存入conf.d目录,否则在启动时将会出现错误提示。
错误如下:
nginx报错:此处不允许使用"stream"指令。
nginx在测试配置文件时,发现位于/etc/nginx目录下的nginx.conf文件存在错误,导致测试失败。
将HTTP的定义置于同等地位,可参照nginx.conf文件中的编写方式。
把这块直接放到nginx.conf的http段的上方
user nginx;
worker_processes auto;
错误日志位于 /var/log/nginx/error.log 文件中,并设置为通知级别。
禁止对nginx进程标识符进行修改,其位置设定为/var/run目录下的nginx.pid文件。
events {
worker_connections 1024;
}
stream{
upstream netty_test{
服务器地址为192.168.85.1,端口号为6666,权重设置为1。
服务器地址为192.168.85.1,端口号为7777,权重设置为1。
}
server {
listen 6555;
proxy_pass netty_test;
}
}
http {
引入文件 /etc/nginx/mime.types;
默认类型为,应用数据流格式;
主要日志格式为:记录远程地址、用户信息、本地时间以及请求内容。
禁止对状态码、传输字节数以及HTTP引用进行修改。
禁止使用"http_user_agent"和"http_x_forwarded_for"这两个标识符。
配置访问日志路径为 /var/log/nginx/access.log,并设置为主要日志记录模式。
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
包含/etc/nginx/conf.d目录下的所有.conf配置文件。
}
重新加载配置
在执行命令之前,用户root登录到了名为c6461d00cb4c的容器中,接着他进入了/etc/nginx目录,并输入了nginx -t指令以进行测试。
nginx配置文件位于/etc/nginx目录下的nginx.conf,其语法正确无误。
nginx的配置文件位于/etc/nginx目录下的nginx.conf,经过测试,其配置正确无误。
TCP服务器代码
代码
使用netty写的简单的服务端程序
运行服务端程序


重现启动容器
启动后台服务,指定端口映射80和6555,将nginx容器挂载到宿主机的/etc/nginx目录,并命名为nginx。
b31d
负载均衡测试



重新建立连接

结束语
Nginx在网页服务领域应用广泛,尤其在网页层面,它主要充当前端代理和负载均衡的角色。自版本.9起,它引入了新的支持机制,通过特定方法实现了TCP/UCP层的负载均衡功能。在本文中,我们采用了一种快速构建Nginx负载均衡环境的方法,并利用tcp客户端对负载均衡进行了测试。Nginx的架构为层式结构,并且它本身还支持七层负载均衡,即通过简单的代理反向代理方式实现,这部分内容此处不予展开。
接下来的一篇文章将详细阐述如何通过环境配置来实现四层负载均衡的机制。敬请各位读者关注。
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。


客服1