如何用 Nginx 代理 MySQL 连接,并限制可访问 IP?

文章图片1

现阶段,对于一个互联网公司来讲,其生产环境基本上都是在云服务器上,例如常用的一些应用服务器、数据库服务器等等。但是在我们部署引用的时候,如果直接将数据库的链接暴露在公网上很明显不现实,存在很大的安全隐患。而一般情况下,数据库服务端口是不对外开放的。但是在生产环境出现问题之后,我们又需要通过数据库来查看问题。这个问题,一般的解决方案是使用VPN技术,或者是使用跳板机技术。下面我们就来看看如何使用Nginx来实现一个跳板机。

Nginx代理原理

既然要实现代理的请求转发,必不可少的就是需要一个Nginx服务器,并且要保证其与MySQL所在的服务器在同一个内网环境中,也就是说通过内网环境可以相互访问。

其次,需要我们去安装 ngx_stream_core_module模块 这个模块并不是默认构建的,而是需要我们在安装Nginx的时候通过 -with-stream 配置来进行构建。

Nginx的Stream模块主要是用来做四层的负载均衡,流量转发。它支持TCP和UDP流量的转发。相对于HTTP流量,TCP/UDP流量的负载均衡和处理更接近底层。 使用Nginx流代理可以极大的方便解决一些TCP/UDP流量管理的问题。

在这个模块安装好之后,有如下几个配置需要我们注意

stream

这个配置模块主要用来指定stream服务器的相关配置,是与HTTP模块平级的块。其定义在main模块中

stream {		server{    ……    }}

server

指定一个虚拟机,与http模块中的server功能类似,我们可以在stream中定义多个server如下所示。

stream {     server {         ......     }     server {         ......     } }

listen

这个指令定义了虚拟机server所监听的socket的地址端口。

listen 127.0.0.1:3306; listen *:3306; # 效果与listen *:3306一样 listen 3306; listen localhost:3306;

配置MySQL链接

以MySQL为例来进行配置,如果是在单机环境下则是通过如下的配置实现。

stream  {     server {         listen 3306;         proxy_pass 192.168.110.101:3306;     } }

如果是在集群的环境下我们可以通过如下的方式来进行配置。这个配置有点类似于我们通过Nginx配置反向代理的负载均衡的方式。

stream  {     upstream mysql_socket {         server 192.168.110.101:3306;     }     server {             listen 3306;             proxy_pass mysql_socket;     } }

完成上述配置之后,我们就可以通过MySQL的客户端工具来连接服务了。

对于IP访问的限制

配置完成之后,接下就需要对IP进行访问限制。为了保证安全Stream模块中还提供了如下的两条指令

  • allow:允许访问的IP
  • deny:禁止访问的IP

其配置如下。

 # 允许192.168.110.1访问 allow 192.168.110.1;  # 允许192.168.110.1到192.168.255.254 allow 192.168.110.0/16;  # 允许192.168.110.1到192.168.110.254 allow 192.168.110.0/24;  # 允许所有的IP访问 allow all;

禁止访问的配置如下

# 禁止192.168.110.1访问 deny 192.168.110.1;  # 禁止192.168.110.1到192.168.255.254 deny 192.168.110.0/16;  # 禁止192.168.110.1到192.168.110.254 deny 192.168.110.0/24;  # 禁止所有的IP访问 deny all;

我们可以通过如下的设置来限制IP的访问。

allow 192.168.110.100;deny all;

这里需要注意这两个指令是相互配合使用,如果只设置其中的一个选项,则另一个配置选项就成了默认值。

总结

通过下面这个配置,我们就可以实现一个MySQL数据库连接配置设置,允许192.168.110.100访问并且只允许192.168.110.100访问。

stream  {     allow 192.168.110.100;     deny all;     server {         listen 3306;         proxy_pass 192.168.110.101:3306;     } }

为什么程序员不能对代码终身负责?

Hello!这里是W3Cschool编程狮的小狮妹!在现代科技驱动的世界中,编程已经成为了无处不在的一项关键技能。程序员们的工作是创造、维护和改

36w字!腾讯高工甩出MySQL速成手册,基础架构调优三飞

想要精通MySQL你就必须知道如何设计一个高可用可扩展的企业级MySQL数据库集群以及高性能高可用MySQL调优方法。但大多数人对于MySQL的

PHP和Python哪个更适合Web开发?

在当今数字化的世界中,Web开发一直是无处不在的需求,而编程语言的选择则是这一过程中至关重要的决策之一。

产品经理必备知识——API接口

进入互联网时代之后,API接口的出现为不同应用程序搭建起了桥梁,那么,你是否真的了解API呢?这篇文章里,作者对API接口的分类、原理、API接

如何用 Nginx 代理 MySQL 连接,并限制可访问 IP?

现阶段,对于一个互联网公司来讲,其生产环境基本上都是在云服务器上,例如常用的一些应用服务器、数据库服务器等等。但是在我们部署引用的时候,如果直接