场景
Nginx配置实例-负载均衡实例:平均访问多台服务器:
Nginx配置实例-负载均衡实例:平均访问多台服务器_我想访问五个服务器的信息用nginx怎么做-CSDN博客
以上实现Nginx的http协议的负载均衡,如果使用Nginx实现TCP协议的负载均衡比如配置Mysql的连接,可使用如下方式。
首先搭建两台mysql和一台nginx的测试环境。这里使用Docker Compose搭建。
注:
博客:
霸道流氓气质-CSDN博客
实现
1、测试环境搭建
Docker Compose中编排Nginx时yml的写法
nginx:image: nginx:latestprivileged: trueports:- 100:100volumes:- ./nginx/etc/nginx.conf:/etc/nginx/nginx.conf- ./nginx/logs:/var/log/nginx- ./nginx/etc/conf.d:/etc/nginx/conf.d
注意这里在docker-compose.yml所在的路径下新建nginx目录,并在目录下新建etc和logs目录
另外注意nginx做数据卷映射时不要直接讲以上nginx的配置文件ngin.conf进行映射,另外两个目录logs和conf.d可以直接进行映射。
需要先手动将nginx.conf配置文件上传至宿主机目录下再启动容器。
原因是不支持直接挂载文件,只能挂载文件夹,想要挂载文件,必须宿主机也要有对应的同名文件。
如果强行直接挂载,则启动容器后会提示
mounting "/root/nginx.conf" to rootfs at "/etc/nginx/nginx.conf" caused: mount through procfd: not a directory: unknown:
Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.
那么如何获取nginx.conf数据卷映射的配置文件?
先使用docker命令运行一个nginx容器,然后进入容器内部,将配置文件复制出来即可。
docker中拉取nginx镜像
docker pull nginx
docker中启动nginx容器
docker run -d --name nginx nginx
docker中复制nginx容器内配置文件到当前目录
docker cp nginx:/etc/nginx/nginx.conf $PWD/
执行效果
配置文件复制成功后就可以停掉并删除容器了。
docker中停掉并删除nginx容器
docker container stop nginxdocker container rm nginx
上面nginx.conf复制到nginx/etc目录下之后,需要授予权限
chmod 777 nginx.conf
Docker Compose编排mysql时yml的写法
mysql1:image: mysql:8.0command: --lower_case_table_names=1environment:MYSQL_DATABASE: testMYSQL_ROOT_PASSWORD: ABC@123!MYSQL_ROOT_HOST: '%'TZ: Asia/Shanghaiports:- "301:3306"volumes:- ./mysql1/data:/var/lib/mysql
这里设置root密码,并允许远程连接,然后端口映射为301到容器内3306
同理再搭建一个mysql,映射端口302
mysql2:image: mysql:8.0command: --lower_case_table_names=1environment:MYSQL_DATABASE: testMYSQL_ROOT_PASSWORD: ABC@123!MYSQL_ROOT_HOST: '%'TZ: Asia/Shanghaiports:- "302:3306"volumes:- ./mysql2/data:/var/lib/mysql
2、使nginx与两个mysql使用自定义网络方式互通
完整yml配置文件
version: "3.8"services:mysql1:image: mysql:8.0command: --lower_case_table_names=1environment:MYSQL_DATABASE: testMYSQL_ROOT_PASSWORD: ABC@123!MYSQL_ROOT_HOST: '%'TZ: Asia/Shanghaiports:- "301:3306"volumes:- ./mysql1/data:/var/lib/mysqlnetworks:balancenet:ipv4_address: 192.128.0.11mysql2:image: mysql:8.0command: --lower_case_table_names=1environment:MYSQL_DATABASE: testMYSQL_ROOT_PASSWORD: ABC@123!MYSQL_ROOT_HOST: '%'TZ: Asia/Shanghaiports:- "302:3306"volumes:- ./mysql2/data:/var/lib/mysqlnetworks:balancenet:ipv4_address: 192.128.0.12nginx:image: nginx:latestprivileged: trueports:- 100:100volumes:- ./nginx/etc/nginx.conf:/etc/nginx/nginx.conf- ./nginx/logs:/var/log/nginx- ./nginx/etc/conf.d:/etc/nginx/conf.dnetworks:balancenet:ipv4_address: 192.128.0.13networks:balancenet:ipam:config:- subnet: 192.128.0.0/24
3、启动测试环境
docker compose up
这里不添加-d,便于查看日志。
确保无报错,三个容器启动成功
4、nginx配置修改实现tcp协议负载均衡
分别连接上面启动的301和302的mysql,建立不同的数据库名称为301和302。
要实现连接nginx代理的100端口的mysql时,负载均衡的连接到两个数据库,可以通过查看数据库名称进行结果验证。
在 NGINX 的 stream 模块内使用 upstream 代码块对 TCP 服务器实施负载均衡。
上面容器内复制出来的nginx.conf的文件未修改之前为
添加如下配置
stream{upstream mysql{server 192.128.0.11:3306 weight=1;server 192.128.0.12:3306 weight=1;} server {listen 100;server_name 192.128.0.13;proxy_pass mysql;}
}
添加之后完整的nginx.conf文件
user nginx;
worker_processes auto;error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;events {worker_connections 1024;
}http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;sendfile on;#tcp_nopush on;keepalive_timeout 65;#gzip on;include /etc/nginx/conf.d/*.conf;
}stream{upstream mysql{server 192.128.0.11:3306 weight=1;server 192.128.0.12:3306 weight=1;} server {listen 100;server_name 192.128.0.13;proxy_pass mysql;}
}
上面的配置的 server 代码块指示 NGINX 侦听 TCP 端口 100,并在两个 MySQL 数据库读取副本之间实施负载均衡。
上面两个mysql的root密码是一致,下面用mysql客户端工具比如Navicat等使用同样的密码连接和关闭数据库,验证是否显示不同
的数据库名称。
总结:
http 和 stream 上下文之间的主要区别在于它们在 OSI 模型的不同层上运行。
http 上下文在应用层(七层)运行,stream 在传输层(四层)运行。
这并不意味着 stream 上下文不能通过一些巧妙的脚本获得应用感知能力,
而是说 http 上下文是专门为了完全理解 HTTP 协议而设计的,
stream 上下文默认情况下只能对数据包进行路由和负载均衡。
TCP 负载均衡由 NGINX 的 stream 模块定义。
stream 模块与 HTTP 模块一样,允许您定义上游(upstream)服务器池并配置侦听服务器。
在配置服务器侦听给定端口时,您必须定义待侦听的端口或者地址加端口(可选)。
然后您必须配置目标服务,无论这是连接另一个地址的直接反向代理还是上游资源池。
配置中有许多选项可以改变 TCP 连接反向代理的属性,包括 SSL/TLS 验证限制、超时和 keepalive 等。
这些代理选项的一些值可以是(或者包含)变量,例如下载速率、验证 SSL/TLS 证书时使用的名称等。
TCP 与 HTTP 负载均衡中的 upstream 指令非常相似,它们均将上游资源定义为服务器,
配置格式同样为 Unix 套接字、IP 或 FQDN,此外服务器 weight 参数、最大连接数、DNS 解析器、
连接数缓增期以及判断服务器是激活状态、故障状态还是备用模式的参数也都相似。