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

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模块,其指令非常简单,仅包含allowdeny指令。

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;
    }
}

运行结果

  1. 配置前

    • 从任意IP尝试连接Nginx的3306端口,都能成功连接到MySQL服务器。
  2. 配置后

    • 只有从192.168.110.100这个IP尝试连接Nginx的3306端口时,才能成功连接到MySQL服务器。
    • 从其他IP尝试连接时,会被Nginx拒绝。

通过这样的配置,我们可以有效地控制能够访问MySQL服务器的IP范围,从而提高数据的安全性。希望这篇文章对大家有所帮助,如果有任何问题或建议,欢迎留言交流!

<think>嗯,用户问的是如何配置Nginx代理MySQL,这个我得仔细想想。首先,Nginx通常用来代理HTTP流量,比如反向代理Web服务器,但MySQL使用的是自己的协议,属于TCP层,所以可能需要用Nginx的Stream模块来处理。 首先,用户可能对Nginx的模块不太熟悉,特别是stream模块,这个模块默认可能没有启用。所以需要确认他们的Nginx是否安装了with-stream模块。如果没有的话,可能需要重新编译Nginx或者安装包含该模块的版本。 然后,配置方面,用户需要在nginx.conf里添加stream块的配置,指定监听的端口,比如3307,然后代理到后端MySQL的3306端口。这里需要注意的是,stream块不能放在http块里,而是应该和http块平级,否则会出错。 另外,用户可能关心安全性,比如是否需要SSL/TLS加密传输。如果是的话,可以在stream的server配置里加入ssl_preread和代理MySQL的SSL端口,或者在Nginx这一层进行SSL终止。但MySQL的协议可能不支持直接在Nginx上终止SSL,所以可能需要透传到后端。 还有,用户可能会遇到连接问题,比如超时或者连接被拒绝。这时候需要检查防火墙设置,确保Nginx所在服务器的端口是开放的,且后端MySQL允许来自Nginx服务器的远程连接。同时,可能需要调整MySQL的bind-address为0.0.0.0,确保用户权限正确。 另外,用户可能想通过Nginx实现负载均衡,这时候可以在stream块里配置upstream,定义多个MySQL服务器,Nginx作为代理分发连接。不过,负载均衡MySQL需要注意状态同步的问题,比如主从复制是否已经配置好,否则可能导致数据不一致。 还有,测试配置是否正确,用户可能需要使用mysql客户端连接Nginx代理端口,检查是否能成功连接到后端MySQL。如果出现错误,可以查看Nginx的错误日志,排查配置问题。 总结一下,步骤大概是:确认Nginx支持stream模块,配置stream块代理TCP连接,处理SSL(如果需要),配置MySQL允许远程连接,测试连接,以及可能的负载均衡设置。同时要提醒用户注意安全,比如使用防火墙限制访问,定期更新软件等。</think>要使用 Nginx 代理 MySQL 连接,需通过 **Nginx 的 TCP/UDP 代理模块(`ngx_stream_core_module`)** 实现。由于 MySQL 使用 TCP 协议通信(默认端口 `3306`),而 Nginx 默认仅处理 HTTP 流量,因此需要以下配置步骤: --- ### 1. **确保 Nginx 支持 Stream 模块** - 检查 Nginx 是否已编译包含 `--with-stream` 参数: ```bash nginx -V 2>&1 | grep -o with-stream ``` - 若无输出,需重新编译 Nginx 添加 `--with-stream` 参数,或直接安装包含 Stream 模块的版本。 --- ### 2. **配置 Nginx 代理 MySQL** 在 Nginx 配置文件(如 `/etc/nginx/nginx.conf`)中添加 `stream` 块(**与 `http` 块平级**): ```nginx # 在 http 块外部添加 stream { # 定义后端 MySQL 服务器 upstream mysql_backend { server 192.168.1.100:3306; # 替换为实际 MySQL 地址 } # 代理配置 server { listen 3307; # Nginx 监听的代理端口(如 3307) proxy_pass mysql_backend; proxy_connect_timeout 10s; # 连接超时时间 proxy_timeout 12h; # 保持长连接(根据业务调整) } } ``` --- ### 3. **可选:SSL/TLS 加密** 若需加密 Nginx 与客户端之间的连接,可使用 **SSL 代理**: ```nginx stream { server { listen 3308 ssl; proxy_pass mysql_backend; # SSL 证书配置 ssl_certificate /path/to/ssl.crt; ssl_certificate_key /path/to/ssl.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; # 透传 SSL 到后端 MySQL(或由 Nginx 终止 SSL) proxy_ssl on; proxy_ssl_verify off; # 可选:不验证后端证书(测试环境) } } ``` --- ### 4. **配置 MySQL 允许远程连接** 确保后端 MySQL 允许从 Nginx 服务器的 IP 连接: 1. 修改 MySQL 配置文件(`my.cnf` 或 `my.ini`): ```ini bind-address = 0.0.0.0 # 允许所有 IP 连接 ``` 2. 创建远程访问用户授权: ```sql CREATE USER 'nginx_user'@'nginx_server_ip' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON *.* TO 'nginx_user'@'nginx_server_ip'; FLUSH PRIVILEGES; ``` --- ### 5. **测试连接** 使用 MySQL 客户端通过 Nginx 代理连接: ```bash mysql -u nginx_user -p -h nginx_server_ip -P 3307 ``` --- ### 6. **高级场景** - **负载均衡**:在 `upstream` 块中添加多个 MySQL 服务器(需确保数据一致性,如主从架构)。 ```nginx upstream mysql_cluster { server 192.168.1.101:3306; server 192.168.1.102:3306; } ``` - **IP 白名单**:通过 `allow/deny` 限制访问: ```nginx server { listen 3307; allow 192.168.1.0/24; deny all; proxy_pass mysql_backend; } ``` --- ### 注意事项 - **性能**:Nginx 代理会增加少量延迟,建议部署在与 MySQL 同内网的服务器。 - **安全性**:强烈建议启用 SSL 加密,避免明文传输敏感数据。 - **防火墙**:开放 Nginx 监听的端口(如 `3307`)。 --- 通过上述步骤,即可实现 NginxMySQL代理,适用于端口转发、负载均衡或安全隔离等场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值