1、前言
在生产环境中,我们的应用服务器、mysql服务器等通常都部署在云服务器上。为了数据安全,mysql服务器的端口一般不会对外开放,因为直接暴露在公网会带来很大的风险。然而,线上业务出现bug时,开发人员需要远程连接mysql来查看数据。这时,我们可以通过nginx代理(俗称“跳板机”)来实现安全连接。
2、nginx代理连接
要实现对mysql连接的代理转发,我们需要一台安装了nginx的服务器,并且这台服务器要与mysql服务器处于一个内网中,以便它们之间可以相互访问。此外,我们还需要用到ngx_stream_core_module模块,该模块不是默认构建的,需要在nginx配置时添加--with-stream选项来进行构建。
2.1 指令介绍
1)stream
- 作用:定义stream服务器,与http块平级,定义在main块中。
- 作用域:main
- 语法:
stream {...} - 示例:
stream {
# 配置内容
}
2)server
- 作用:定义一个虚拟主机,与http块中的server类似。可以在stream块中定义多个server块。
- 作用域:stream
- 语法:
server {...} - 示例:
stream {
server {
# 配置内容
}
}
3)listen
- 作用:定义虚拟主机server要监听的socket的地址和端口。
- 作用域:server
- 语法:
listen address:port; - 示例:
stream {
server {
listen 127.0.0.1:3306;
# 其他配置
}
}
2.2 配置示例
假设我们的mysql服务器ip为192.168.110.101,端口为3306。
单机环境配置
stream {
server {
listen 3306;
proxy_pass 192.168.110.101:3306;
}
}
集群环境配置(假设有多个mysql实例)
这里只是一个示例,实际配置可能需要根据具体的负载均衡策略来调整。
stream {
upstream mysql_cluster {
server 192.168.110.101:3306;
server 192.168.110.102:3306;
# 更多服务器...
}
server {
listen 3306;
proxy_pass mysql_cluster;
}
}
配置完成后,我们就可以通过例如navicat等客户端连接到nginx的3306端口,由nginx代理连接到mysql服务器。
3、限制访问ip
实现了连接代理后,任何人只要能访问nginx就能连接mysql服务器。为了更进一步缩小访问范围,保证数据安全,我们可以限制只有公司网络的ip地址可以通过nginx进行连接。
nginx提供了ngx_stream_access_module模块,其指令非常简单,仅包含allow和deny指令。
3.1 指令介绍
1)allow
- 作用:设置指定的ip允许访问。可以和
deny指令配合使用。 - 作用域:stream, server
- 语法:
allow address | cidr | unix: | all; - 示例:
# 允许192.168.110.1访问 allow 192.168.110.1; # 允许192.168.110.0/16网段的ip访问 allow 192.168.110.0/16; # 允许所有ip访问 allow all;
2)deny
- 作用:设置指定的ip禁止访问。可以和
allow指令配合使用。 - 作用域:stream, server
- 语法:
deny address | cidr | unix: | all; - 示例:
# 禁止192.168.110.1访问 deny 192.168.110.1; # 禁止192.168.110.0/16网段的ip访问 deny 192.168.110.0/16; # 禁止所有ip访问 deny all;
3.2 配置示例
禁止所有的ip访问,除192.168.110.100外。
stream {
allow 192.168.110.100;
deny all;
server {
listen 3306;
proxy_pass 192.168.110.101:3306;
}
}
tips:如果指定了allow,一定要配合deny使用,否则就是允许所有的ip地址访问。
4、综合案例
只允许192.168.110.100通过nginx连接mysql服务器。
nginx配置
stream {
allow 192.168.110.100;
deny all;
server {
listen 3306;
proxy_pass 192.168.110.101:3306;
}
}
运行结果
配置前:
- 从任意ip尝试连接nginx的3306端口,都能成功连接到mysql服务器。
配置后:
- 只有从
192.168.110.100这个ip尝试连接nginx的3306端口时,才能成功连接到mysql服务器。 - 从其他ip尝试连接时,会被nginx拒绝。
通过这样的配置,我们可以有效地控制能够访问mysql服务器的ip范围,从而提高数据的安全性。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论