Nginx代理MySQL端口并配置SSL加密连接怎么做

 更新时间:2026年07月29日 10:52:14   作者:Rewloc  
想知道如何通过Nginx代理MySQL端口并强制SSL加密吗?本文手把手教你配置stream模块、开启MySQL SSL、设置用户SSL访问,并调整JDBC连接参数和客户端工具,确保数据库连接安全无虞

Nginx代理Mysql端口并开启SSL

第一步:配置nginx的stream

  1. 在安装nginx时需要安装stream模块,stream配置如下:
#> ./configure --prefix=/usr/local/nginx --with-http_ssl_module  --with-stream --with-stream_ssl_module

注:stream模块只有nginx1.9之后的版本才支持

  1. nginx安装完成后stream模块的配置信息如下:
stream {
    # 负载均衡
    upstream mysqlBackend {
        hash $remote_addr consistent;
        server 127.0.0.1:61666;
        # server 192.168.0.10:3306 weight=5;
        # server 192.168.0.11:3306 max_fails=3 fail_timeout=30s;
    }
    
    # 对外提供端口映射的服务配置,同时也支持SSL数据加密传输
    server {
        # 监听端口,可自定义
        listen 56789;
        # 反向代理,负载均衡
        proxy_pass mysqlBackend;
        # 其他配置根据需要添加
	}
}

注:stream和http同级,stream中的配置可参考http的部分配置。

第二步:开启Mysql的SSL

  1. 登陆Mysql检查是否开启SSL
#> mysql -uroot -p   # 直接回车
mysql> show variables like '%ssl%';  # 查看mysql是否开启ssl
+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_openssl  | DISABLED |
| have_ssl      | DISABLED |
| ssl_ca        |          |
| ssl_capath    |          |
| ssl_cert      |          |
| ssl_cipher    |          |
| ssl_crl       |          |
| ssl_crlpath   |          |
| ssl_key       |          |
+---------------+----------+
9 rows in set (0.00 sec)

注:当have_opensslhe have_ssl为“DISABLED”时,表示当前Mysql未开启SSL

  1. 如果没有开启SSL,开启SSL
#> cd /usr/local/mysql/bin  # 进入mysql的bin路径
#> ./mysql_ssl_rsa_setup    # 执行mysql开启SSL证书
Generating a 2048 bit RSA private key
.......................+++
............................................................................+++
writing new private key to 'ca-key.pem'
-----
Generating a 2048 bit RSA private key
...............................................+++
.....+++
writing new private key to 'server-key.pem'
-----
Generating a 2048 bit RSA private key
.............+++
...................................+++
writing new private key to 'client-key.pem'
-----
#> chown -R mysql:mysql *.pem  # 给mysql生成的证书更换用户组

注:证书生成路径为:mysql安装路径下的data目录中,后缀为pem的文件

  1. Mysql生成的pem文件说明
ca.pem               Self-signed CA certificate
ca-key.pem           CA private key
server-cert.pem      Server certificate
server-key.pem       Server private key
client-cert.pem      Client certificate
client-key.pem       Client private key
启动时产生RSA密钥对
private_key.pem      Private member of private/public key pair
public_key.pem       Public member of private/public key pair
参考http://dev.mysql.com/doc/refman/5.7/en/creating-ssl-rsa-files-using-mysql.html
使用ssl连接http://dev.mysql.com/doc/refman/5.7/en/using-ssl-connections.html

客户端证书导出
# sz ca.pem
# sz client-cert.pem
# sz client-key.pem
  1. 在my.cnf文件中配置SSL
[mysqld]
ssl-ca=/usr/local/mysql/data/ca.pem
ssl-cert=/usr/local/mysql/data/server-cert.pem
ssl-key=/usr/local/mysql/data/server-key.pem

[client]
ssl-ca=/usr/local/mysql/data/ca.pem
ssl-cert=/usr/local/mysql/data/client-cert.pem
ssl-key=/usr/local/mysql/data/client-key.pem

5.重新启动mysql服务,并查看mysql的SSL开启情况

#> systemctl start mysqld   # 重启mysql服务器
#> mysql -uroot -p           # 登陆mysql数据库
mysql> show variables like '%ssl%';     # 查询mysql的ssl是否开启
+---------------+---------------------------------------+
| Variable_name | Value                                 |
+---------------+---------------------------------------+
| have_openssl  | YES                                   |
| have_ssl      | YES                                   |
| ssl_ca        | /usr/local/mysql/data/ca.pem          |
| ssl_capath    |                                       |
| ssl_cert      | /usr/local/mysql/data/server-cert.pem |
| ssl_cipher    |                                       |
| ssl_crl       |                                       |
| ssl_crlpath   |                                       |
| ssl_key       | /usr/local/mysql/data/server-key.pem |
+---------------+---------------------------------------+
9 rows in set (0.00 sec)

第三步:指定Mysql用户使用SSL访问

#> GRANT ALL PRIVILEGES ON *.* TO '用户名'@'%' IDENTIFIED BY '密码' REQUIRE SSL;  # 创建只能用ssl访问的用户
#> FLUSH PRIVILEGES;    # 刷新数据,使其生效

客户端验证

λ mysql -h172.16.8.244 -P61666 -ussltest -p                                                                              
Enter password: ********                                                                                                 
Welcome to the MySQL monitor.  Commands end with ; or \g.                                                                
Your MySQL connection id is 3                                                                                            
Server version: 5.7.27-log MySQL Community Server (GPL)                                                                  
                                                                                                                         
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.                                             
                                                                                                                         
Oracle is a registered trademark of Oracle Corporation and/or its                                                        
affiliates. Other names may be trademarks of their respective                                                            
owners.                                                                                                                  
                                                                                                                         
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.                                           
                                                                                                                         
mysql> status;                                                                                                           
--------------                                                                                                           
mysql  Ver 14.14 Distrib 5.7.28, for Win64 (x86_64)                                                                      
                                                                                                                         
Connection id:          3                                                                                                
Current database:                                                                                                        
Current user:           ssltest@172.16.8.18                                                                              
SSL:                    Cipher in use is DHE-RSA-AES256-SHA                                                              
Using delimiter:        ;                                                                                                
Server version:         5.7.27-log MySQL Community Server (GPL)                                                          
Protocol version:       10                                                                                               
Connection:             172.16.8.244 via TCP/IP                                                                          
Server characterset:    utf8mb4                                                                                          
Db     characterset:    utf8mb4                                                                                          
Client characterset:    gbk                                                                                              
Conn.  characterset:    gbk                                                                                              
TCP port:               61666                                                                                            
Uptime:                 18 min 11 sec                                                       
Threads: 1  Questions: 10  Slow queries: 0  Opens: 116  Flush tables: 1  Open tables: 109  Queries per second avg: 0.009 
-------------- 

第四步:在应用中配置JDBC连接

指定用户使用SSL进行数据库连接后,需要在对应的JDBC连接上增加“ &useSSL=true ”配置,否则mysql将拒绝连接。例如:

 jdbc:mysql://127.0.0.1:3306/[数据用户名]?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false&failOverReadOnly=false&autoReconnect=true&roundRobinLoadBalance=true&nullCatalogMeansCurrent=true

第五步:Mysql客户端工具

需要在客户端工具类上设置上【使用SSL】连接数据库,如Navicat工具上如下图:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Nginx中break与last的区别详析

    Nginx中break与last的区别详析

    这篇文章主要给大家介绍了关于Nginx中break与last区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Nginx1.21.6生产环境升级步骤

    Nginx1.21.6生产环境升级步骤

    这篇文章主要介绍了Nginx1.21.6生产环境升级步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • nginx负载均衡下的webshell上传的实现

    nginx负载均衡下的webshell上传的实现

    本文主要介绍了nginx负载均衡下的webshell上传的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Nginx四层负载均衡配置以及Stream模块使用

    Nginx四层负载均衡配置以及Stream模块使用

    文章介绍了如何在Nginx中配置四层负载均衡,包括stream块的使用、upstream和server的定义,以及与七层负载均衡的对比,文章还详细讲解了负载均衡的算法、配置参数、实际应用场景以及一些优化建议,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • Nginx配置SSL证书的方法步骤

    Nginx配置SSL证书的方法步骤

    本文主要介绍了Nginx配置SSL证书,成功配置SSL证书后,您将能够通过HTTPS加密通道安全访问Nginx服务器,感兴趣的可以了解一下
    2024-02-02
  • windows下安装nginx的方法(图文)

    windows下安装nginx的方法(图文)

    这篇文章主要介绍了windows下安装nginx的方法(图文),需要的朋友可以参考下
    2016-09-09
  • windows下Nginx多域名简单配置教程

    windows下Nginx多域名简单配置教程

    这篇文章主要为大家详细介绍了windows下Nginx多域名简单配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • nginx部署vue项目的详细图文教程

    nginx部署vue项目的详细图文教程

    很多小伙伴在做完Vue项目之后,想要部署到服务器上自己运行试试,下面这篇文章主要给大家介绍了关于nginx部署vue项目的详细图文教程,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • nginx的限流配置的几种方法实现

    nginx的限流配置的几种方法实现

    Nginx限流功能主要通过漏桶算法实现,包含两个核心模块:limit_req_module限制请求速率,limit_conn_module限制并发连接数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-04-04
  • nginx屏蔽指定接口(URL)的操作方式

    nginx屏蔽指定接口(URL)的操作方式

    这篇文章主要介绍了nginx屏蔽指定接口(URL)的操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05

最新评论