1、前言
生产环境基本上都部署在云服务器上,例如应用服务器、MySQL服务器等。如果MySQL服务器直接暴露在公网,就会存在很大的风险,为了保证数据安全,MySQL服务器的端口是不对外开放的。 线上业务遇到bug了,开发的小伙伴需要远程连接MySQL来查看数据,那应该怎么办呢? 可以通过Nginx代理(“跳板机”)来进行连接。2、Nginx代理连接
要实现对连接的代理转发,需要一台服务器并安装Nginx,且与MySQL服务器处于一个内网之中,内网之间可以访问。 其次,需要用到<font style="color:rgb(233, 105, 0);background-color:rgb(248, 248, 248);">ngx_stream_core_module</font>模块,该模块不是默认构建的,需要在configure时添加<font style="color:rgb(233, 105, 0);background-color:rgb(248, 248, 248);">--with-stream</font>来进行构建。
既然要用到<font style="color:rgb(233, 105, 0);background-color:rgb(248, 248, 248);">ngx_stream_core_module</font>模块,首当其冲,是看看其提供的指令,才知道怎么来进行配置。
1)stream
该指令定义了stream服务器。与http块平级,定义在main块中。
作用域:main
语法:stream {...}
示例:
stream {server {......}}
2)server
该指令定义一个虚拟主机,与http块中的server类似。可以在stream块中定义多个server块。作用域:stream
语法:server {...}
stream {server {......}server {......}}
3)listen
该指令定义虚拟主机server要监听的socket的地址和端口。作用域:server
语法:listen address:port;
示例:
listen 127.0.0.1:3306;listen *:3306;# 效果与listen *:3306一样listen 3306;listen localhost:3306;
4)配置示例
MySQL服务器,端口3306(单机环境)MySQL服务器,端口3306(集群环境)
stream {server {listen 3306;proxy_pass 192.168.110.101:3306;}}
此时,就可以通过例如Navicat等客户端进行连接。
stream {upstream mysql_socket {server 192.168.110.101:3306;}server {listen 3306;proxy_pass mysql_socket;}}
3、限制访问IP
实现了对连接的代理,所有人都可以通过访问Nginx来连接MySQL服务器,解决了外网无法连接的问题。 为了更进一步的缩小访问范围,保证数据安全,可以限制只有公司网络的IP地址可以通过Nginx进行连接。 Nginx提供了ngx_stream_access_module模块,其指令非常简单,仅包含allow和deny指令。1)allow
该指令设置指定的IP允许访问。可以和deny指令配合使用作用域:stream, server
语法:allow address | CIDR | unix: | all;
示例:
# 允许192.168.110.1访问allow 192.168.110.1;# 允许192.168.110.1到192.168.255.254allow 192.168.110.0/16;# 允许192.168.110.1到192.168.110.254allow 192.168.110.0/24;# 允许所有的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.1到192.168.255.254deny 192.168.110.0/16;# 禁止192.168.110.1到192.168.110.254deny 192.168.110.0/24;# 禁止所有的IP访问deny all;
3)配置示例
禁止所有的IP访问,192.168.110.100除外。
allow 192.168.110.100;deny all;
Tips:如果指定了allow,需要配合deny使用,否则就是允许所有的IP地址访问。
4、综合案例
只允许192.168.110.100通过Nginx连接MySQL服务器。
stream {allow 192.168.110.100;deny all;server {listen 3306;proxy_pass 192.168.110.101:3306;}}
