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协议是无状态的
相关推荐
勤奋的凯尔森同学1 小时前
webmin配置终端显示样式,模仿UbuntuDesktop终端
linux·运维·服务器·ubuntu·webmin
技术小齐5 小时前
网络运维学习笔记 016网工初级(HCIA-Datacom与CCNA-EI)PPP点对点协议和PPPoE以太网上的点对点协议(此处只讲华为)
运维·网络·学习
ITPUB-微风5 小时前
Service Mesh在爱奇艺的落地实践:架构、运维与扩展
运维·架构·service_mesh
落幕5 小时前
C语言-进程
linux·运维·服务器
chenbin5206 小时前
Jenkins 自动构建Job
运维·jenkins
java 凯6 小时前
Jenkins插件管理切换国内源地址
运维·jenkins
AI服务老曹6 小时前
运用先进的智能算法和优化模型,进行科学合理调度的智慧园区开源了
运维·人工智能·安全·开源·音视频
sszdzq7 小时前
Docker
运维·docker·容器
book01217 小时前
MySql数据库运维学习笔记
运维·数据库·mysql
bugtraq20218 小时前
XiaoMi Mi5(gemini) 刷入Ubuntu Touch 16.04——安卓手机刷入Linux
linux·运维·ubuntu