首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >使用nginx代理mysql

使用nginx代理mysql

作者头像
叔牙
发布2023-06-21 11:13:49
发布2023-06-21 11:13:49
7.8K0
举报

一、为什么需要代理

1.端口转义

通常看到3306就知道是mysql专用端口,通过转义,客户端只能看到nginx监听的端口,看不出来是代表什么程序和协议,当然也是一种浅层防护方式。

2.防护

内网访问通过内网ip和端口,公网访问通过nginx代理,如果公网访问有风险可以配置,可以基于limit_conn_module 和 limit_req_module模块实现限流和限制客户端连接。并且在极端情况下可以关停代理,断开公网访问,从而不影响mysql实例运行和内网访问。

3.动态负载

在客户端不感知的情况下可以动态替换代理的mysql实例,也可以在集群情况下实现请求负载和路由分发,从而提高服务的可用性。

4.屏蔽真实mysql服务器

通过 Nginx,可以屏蔽 MySQL 服务器的真实 IP 地址,防止攻击者利用暴力破解等方式攻击 MySQL 服务器。

二、如何实现nginx代理mysql

nginx默认代理七层协议,而mysql是四层协议,所以使用http模块无法实现反向代理,需要四层tcp协议模块的支撑。

1.安装nginx四层协议支撑
代码语言:javascript
复制
yum -y install nginx
yum -y install nginx-all-modules.noarch
2.配置mysql代理
代码语言:javascript
复制
server {
    listen 3388;
    proxy_pass host:3306;
}

nginx监听并暴露3388端口,mysql实例端口不对内网开放,nginx将3388端口通过tcp协议转成3306端口。

在nginx主配置文件nginx.conf中添加stream配置:

代码语言:javascript
复制
stream {
        include /etc/nginx/tcp.protocol/*.conf;
}
3.启动测试
代码语言:javascript
复制
nginx -t
nginx

现在只能证明网络和端口通了,但是未必nginx代理的mysql协议没问题,需要使用命令或者客户端工具验证:

三、扩展

1.不止mysql

既然nginx可以支持tcp协议的代理,那么除了代理mysql,同样可以代理redis、nacos以及其他的常用四层协议。 redis:

代码语言:javascript
复制
server {
        listen 6388;
        proxy_pass host:6379;
}

nacos:

代码语言:javascript
复制
server {
        listen 8188;
        proxy_pass host:8848;
}
2.其他类似四层代理

亚马逊NLB

其实简单来讲,对于一些简单场景,NLB提供的代理能力和nginx类似,只不过NLB是一种成熟的产品解决方案,有很多周边产品能力支撑,比如WAF和Shield等。

阿里云NLB

和aws的NLB类似,阿里云SLB产品簇也提供了NLB负载均衡器来支持四层协议代理转发。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PersistentCoder 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.端口转义
  • 2.防护
  • 3.动态负载
  • 4.屏蔽真实mysql服务器
  • 二、如何实现nginx代理mysql
    • 1.安装nginx四层协议支撑
    • 2.配置mysql代理
    • 3.启动测试
  • 三、扩展
    • 1.不止mysql
    • 2.其他类似四层代理
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档