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协议是无状态的
相关推荐
yuanmenghao4 分钟前
Linux 配置Samba,Windows登录,开机自动映射登录
linux·运维·windows·操作系统·samba
秋天枫叶357 分钟前
【k8s集群Docker + cri-dockerd】服务器重启或关机后 apiserver/controller/scheduler 无法自动恢复
linux·运维·服务器·容器·kubernetes·bug
赋创小助手8 分钟前
超微2U高密度服务器AS-2126HS-TN评测(双AMD EPYC 9005 Turin)
运维·服务器·人工智能·深度学习·神经网络·自然语言处理·架构
狂放不羁霸33 分钟前
Tailscale | 校园网外笔记本借助校园网内主机连接实验室服务器
运维·服务器·vscode
shughui40 分钟前
最新版Jenkins下载、安装、配置项目路径、集成Allure、
运维·jenkins
Apifox.44 分钟前
测试用例越堆越多?用 Apifox 测试套件让自动化回归更易维护
运维·前端·后端·测试工具·单元测试·自动化·测试用例
Curvatureflight1 小时前
Docker容器化部署实战指南:从入门到生产环境
运维·docker·容器
数字化转型20251 小时前
SAP 实施项目乙方因甲方逾期付款单方面中途离场的风险处理方案
运维·人工智能·机器学习
爱吃生蚝的于勒1 小时前
【Linux】零基础学习命名管道-共享内存
android·linux·运维·服务器·c语言·c++·学习
济6171 小时前
Linux内核---vmlinux、zImage、uImage区别
linux·运维·服务器