nginx实现负载均衡的代理转发

nginx做服务接口的负载均衡代理

最近在部署客户环境时,遇到一个配置问题,需要做两个服务的整体代理转发,两台服务器上有完全的相同的两个后台服务,实现的是完全一样的功能,但是提供给第三方的接口,只能有一个服务器的IP地址,于是就想到了nginx代理做负载均衡代理

服务两台服务器的情况如下:

节点A:10.186.2.96 后台服务的端口20228

节点B:10.186.2.95 后台服务的端口20228

nginx代理服务器的IP:10.133.2.111

三台服务器都在已经局域网内,相互主键没有端口访问限制,于是我在nginx所在的服务器的配置文件nginx.conf中,增加一个端口20229,做两台服务器的代理转发,把外部所有的接口请求都转发到节点A和节点B,简单的配置项如下所示:

bash 复制代码
server {
    listen       20229;
    server_name  10.133.2.111:20229;    #定义检测20229端口的名字,自定义

    location / {
        proxy_pass     http://galaxe;#这里的galaxy和底部的upstream的值一致
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_next_upstream http_502 http_504 error timeout invalid_header;
    }
}
upstream galaxe{
    ip_hash;#具体转发到那一台机器,通过请求客户端的IP地址来分配,hash算法来匹配决定
    server 10.186.2.96:20228 fail_timeout=20s;  #请求超时时长定义为20秒
    server 10.186.2.95:20228 fail_timeout=20s;
}

备注说明:这里的负载方式,采用ip地址的hash算法来决定,外部访问的IP定了以后,就会固定转发到具体的某一台服务器

配置完成后,使用命令重启nginx服务

bash 复制代码
docker restart nginx

使用postman调用一下20229端口服务的的接口,看看能正常得到请求结果

随便试了一个接口,发现20229端口调用成功了,接口返回的数据和调用20228的返回完全一致,如下图所示:

nginx的负载均衡能否用到数据库mysql上

对于接口调用成功后,我就思考了一波,既然针对接口的数据都能请求成功,base64这么大的图片都能转发请求得到,想mysql这种数据请求的连接,能不能也能正常处理呢,于是出于好奇和喜欢试错的心态,又试了一次做pxc数据库集群3306的代理,配置的内容项大致如下:

pxc集群的三个节点为

节点N:10.135.8.161

节点M:10.135.8.162

节点K:10.135.8.163

nginx服务在三个节点都部署,在nginx的配置文件中增加一个3305的端口来代理原本mysql的3306的服务,如下图

配置完成后,由于我们的nginx是部署在容器内部的,所以我们需要把容器内部的端口3305映射到容器外部,修改nginx服务的docker-compose.xml文件,如下图所示:

重启了nginx服务:

bash 复制代码
docker-compose down
docker-compose up -d
```![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/437fb033e120431283e91988fe23f21e.png)
启动成功后,看到3305端口的映射成功如下:
然后修改我们很多java服务的mysql配置端口,看看能不能正常启动,结果失败了,服务日志提示,无法和mysql服务建立长久的socket连接(JDBC(‌Java Database Connectivity)‌是一种执行SQL语句的Java API,‌用于连接和操作数据库。‌当使用JDBC连接MySQL数据库时,‌实际上是通过Socket连接实现的),jdbc连接超时,无法收到mysql服务的包,如下图所示:
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6a52dea142f2435c9c1792ab4fc43b6e.png)
最终得到了结论,nginx的负载均衡服务无法正常对mysql进行代理,只能做http接口的代理,因为HTTP协议是无状态的
相关推荐
钰爱&3 小时前
【操作系统】Linux之线程同步二(头歌作业)
linux·运维·算法
gsls2008085 小时前
docker打包nginx版wordpress
nginx·docker·wordpress
white.tie8 小时前
linux配置nginx
linux·运维·nginx
dessler8 小时前
云计算&虚拟化-kvm创建网桥(bridge)
linux·运维·云计算
何曾参静谧8 小时前
「Py」模块篇 之 PyAutoGUI库自动化图形用户界面库
运维·python·自动化
一只哒布刘9 小时前
RHCE-DNS域名解析服务器
运维·服务器
致宏Rex10 小时前
Nginx 负载均衡详解 x Shell 脚本实战
nginx·负载均衡·运维开发
sss-web122610 小时前
4.远程访问及控制
运维·服务器
moneyxjj10 小时前
Linux各种解压命令汇总
linux·运维·服务器
陈yanyu11 小时前
Linux - 弯路系列3:安装和编译libvirt-4.5.0及虚拟网卡virbr0(virbr0-nic)创建
linux·运维·服务器