⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 www.toutiao.com/article/7234104886726705716 「fkjavaer」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

1.前言

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

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

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

2.Nginx代理连接

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

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

添加过程可以参照【Nginx基本命令&不停机版本升级】一文进行,我们这里不再赘述。

既然要用到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;
}
}

文章目录
  1. 1. 1.前言
  2. 2. 2.Nginx代理连接
    1. 2.1. 1)stream
    2. 2.2. 2)server
    3. 2.3. 3)listen
    4. 2.4. 4)配置示例
  3. 3. 3.限制访问IP
    1. 3.1. 1)allow
    2. 3.2. 2)deny
    3. 3.3. 3)配置示例
  4. 4. 4.综合案例