Nginx 代理 MySQL 连接,并限制可访问IP

1.前言

我们的生产环境基本上都部署在云服务器上,例如应用服务器、MySQL服务器等。如果MySQL服务器直接暴露在公网,就会存在很大的风险,为了保证数据安全,MySQL服务器的端口是不对外开放的。

好巧不巧,线上业务遇到bug了,开发的小伙伴需要远程连接MySQL来查看数据,那应该怎么办呢?

我们可以通过Nginx代理(“跳板机”)来进行连接。

2.Nginx代理连接

要实现对连接的代理转发,我们需要一台服务器并安装Nginx,且与MySQL服务器处于一个内网之中,内网之间可以访问。

其次,我们需要用到ngx_stream_core_module模块,该模块不是默认构建的,我们需要在configure时添加--with-stream来进行构建。

既然要用到ngx_stream_core_module模块,先看看其提供的指令,我们才知道怎么来进行配置。

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(单机环境)

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

MySQL服务器,端口3306(集群环境)

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

此时,我们就可以通过例如Navicat等客户端进行连接。

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.254
 allow 192.168.110.0/16;
 
 # 允许192.168.110.1到192.168.110.254
 allow 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.254
 deny 192.168.110.0/16;
 
 # 禁止192.168.110.1到192.168.110.254
 deny 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;
     }
 }

文章来源:https://www.cnaaa.net,转载请注明出处:https://www.cnaaa.net/archives/9563

赞 (0)
郭靖的头像郭靖
上一篇 2023年8月17日 下午5:35
下一篇 2023年8月22日 下午10:35

相关推荐

  • IIS php网站 无法在<fastCGI>应用程序配置中找到<handler> scriptProcessor

    打开后会发现,根目录里面会自动生成的多出来的这个文件【web.config】直接删除掉,然后再去刷新一下你的页面就可以正常显示了 改你的路径。

    2023年4月6日
    2.1K00
  • IIS导入证书

    步骤一:导入证书 步骤二:为网站绑定证书 步骤三:验证证书是否安装成功 打开计算机的浏览器,在地址栏输入安装的证书所绑定的域名,验证证书在IIS服务器上是否安装成功。 如果您能够获得响应且地址栏的前部出现图标(如下图所示),表示成功建立了HTTPS连接,证书已经安装成功。

    2023年2月24日
    1.8K00
  • LNMP黄金架构的搭建

    LNMP组合工作流程 LNMP工作流是用户通过浏览器输入域名访问Nginx web服务,Nginx判断请求是静态请求则由Nginx返回给用户。如果是动态请求(如.php结尾),那么Nginx会将该请求通过FastCGI接口发送给PHP引擎(php-fpm进程)进行解析,如果该动态请求需要读取mysql数据库,php会继续向后读取数据库,最终Nginx将获取的…

    2022年7月7日
    2.3K00
  • 解决discuz论坛搬家:“Table ‘common_syscache’ is read only”问题

    网站搬家采用直接打包mysql数据库和网页文件的形式进行迁移,上传好mysql data目录里面的网站数据库至mysql存放数据库的目录里面,解压就行,我的存放数据库的路径是 /usr/local/mysql/var,上传好网站数据,解压,配置好数据库链接参数就行,网站就能正常连接上了,我本以为这已经是顺利迁移完成了,但后来操作的时候,发现只能读取数据库的内…

    2023年2月15日
    1.6K00
  • 蓝科模板网站迁移打开空白问题解决

    现象:网站迁移后,发现网站打开空白,原网页能正常打开 分析处理过程:首页进行环境检测,使用php测试页<?php phpinfo(); ?>测试 发现php默认页是能够正常打开的,同时发现网站后台能够正常登录,通过百度发现需要清除缓存才可显示正常首页。 点击清理缓存 这样首页就能够打开了,首页正常打开后可能会遇到一些图片显示不全的问题,可以在后台网站管…

    2022年12月22日
    1.7K00

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

在线咨询: QQ交谈

邮件:712342017@qq.com

工作时间:周一至周五,8:30-17:30,节假日休息

关注微信