领导让我把内网服务器的mysql暴露到另一台服务器,我懵了

12/3/2024

# 需求说明

  • 存在同一个局域网下的两个服务器(其中一个通外网、一个不通外网)
  • 不通外网的服务器部署mysql服务以及一些存储服务
  • 外部网络可以实现访问MySQL服务

大致如下图所示

image-20241127101404835

# 方案

首先通外网的服务器是完全可以访问内网中的mysql的,所以就是一个反向代理的事情?

# mysql是什么协议

MySQL 使用的并不是 HTTP 或 HTTPS 协议,而是其自定义的 MySQL Client/Server Protocol。这个协议通常在 TCP 层通信,默认端口是 3306

​ • 协议:MySQL 自定义协议

​ • 通信方式:基于 TCP/IP 通信

​ • 端口:默认是 3306

​ • 适用场景:客户端(如 MySQL Workbench、DBeaver、JDBC 驱动)通过 MySQL 协议直接与 MySQL 数据库通信。

# 如何进行nginx转发

上面可以看出不可以使用https或http进行简单的反代,但是可以借助nginx中的stream模块来实现

image-20241127102910610

# 第一步:查看nginx是否有stream模块

默认情况下nginx是不自带stream模块的,高版本的没了解(可能会有)

image-20241127103349798

如果执行了上述命令之后没有看到stream模块,需要加入该模块

# 注意一下这个/usr/local/nginx,这是你的编译后的文件指向
./configure --prefix=/usr/local/nginx --with-stream
1
2

# 第二步:加入配置

nginx.conf文件中添加如下语句

stream {
    server {
        listen 10002;
        proxy_connect_timeout 5s;
        proxy_timeout 300s;
        proxy_pass 192.168.1.100:3306;
    }

}
#这里的stream要与http同级
1
2
3
4
5
6
7
8
9
10

这里外部就可以直接访问10002连接到mysql(前提是你的端口可达,且mysql允许所有ip进行连接,或者允许你指定的这个外网端口连接)

# 加餐

上面提到的都是一些常规操作,当然实现方案还是挺多的,并且单纯的将mysql暴露到公网还是不太合理的,下面给大家说一下更好的方案

  • 如果是公司中开发人员进行测试,完全可以使用ssh的隧道服务只将内网的mysql映射到你的本地即可
  • 如果公司有多的预算,可以使用vpn
Last Updated: 12/19/2024, 3:29:07 PM