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协议是无状态的
相关推荐
虎头金猫4 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
还是大剑师兰特4 天前
解决nginx错误:http://localhost:7000正常,http://localhost:7000/map 报错404
nginx·大剑师
AI职业加油站4 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
此冬歌咏4 天前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s
xing-xing4 天前
Docker容器中Nginx站点根目录网页配置访问
nginx·docker
-梅4 天前
linux(8) 软硬链接
linux·运维·服务器
张洛闻Eren4 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
其实防守也摸鱼4 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
布裘4 天前
【银河麒麟】V4桌面图标消失,右击鼠标没反应排查
运维·银河麒麟·桌面环境
懂软件的胡子个哥4 天前
微信机器人为什么需要“回复候选”而不是所有 AI 内容直接发送
运维·微信·自动化·wechatapi·个人微信号二次开发