# 需求说明
- 存在同一个局域网下的两个服务器(其中一个通外网、一个不通外网)
- 不通外网的服务器部署mysql服务以及一些存储服务
- 外部网络可以实现访问MySQL服务
大致如下图所示
# 方案
首先通外网的服务器是完全可以访问内网中的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模块来实现
# 第一步:查看nginx是否有stream模块
默认情况下nginx是不自带stream模块的,高版本的没了解(可能会有)
如果执行了上述命令之后没有看到stream模块,需要加入该模块
# 注意一下这个/usr/local/nginx,这是你的编译后的文件指向
./configure --prefix=/usr/local/nginx --with-stream
1
2
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
2
3
4
5
6
7
8
9
10
这里外部就可以直接访问10002连接到mysql(前提是你的端口可达,且mysql允许所有ip进行连接,或者允许你指定的这个外网端口连接)
# 加餐
上面提到的都是一些常规操作,当然实现方案还是挺多的,并且单纯的将mysql暴露到公网还是不太合理的,下面给大家说一下更好的方案
- 如果是公司中开发人员进行测试,完全可以使用ssh的隧道服务只将内网的mysql映射到你的本地即可
- 如果公司有多的预算,可以使用vpn