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协议是无状态的
相关推荐
方便面不加香菜9 小时前
Docker Container --容器及容器的操作案例详解
运维·docker·容器
没差c12 小时前
winsw将jar、nginx等注册为Windows服务
windows·nginx·jar
AR-26710-12 小时前
Linux Day32——实操五类资源告急排查
linux·运维
skywalk816313 小时前
hive 常驻集群:像 OSPF 一样在线,像 git 一样可信
运维·人工智能·hive
景煜拾年14 小时前
InnoAI SQL 助手
运维·数据库·笔记·sql
无人生还别怕15 小时前
如何搭建docker仓库(轻量级)registry
linux·运维·docker·云原生·容器·registry·openanolisos
分布式存储与RustFS15 小时前
Hudi 表想摆脱 HDFS 绑定?用 Spark + Hudi 直接写进 RustFS
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
zhengfei61116 小时前
CVE-2026-98432:Linux 内核 TCP 释放后重用漏洞,CVSS 9.8 但补丁覆盖极不均衡
linux·运维·tcp/ip
逐流人16 小时前
DevOps 入门实战(一):从 CI/CD 概念到 Jenkins 自动构建部署
运维·云原生·云计算·jenkins·devops
xyzzklk16 小时前
变相解决华为Mate 8锁屏后无法建立入站网络连接
linux·运维·服务器·网络·华为·go·安卓