Skip to content

aogg/sqlLogProxy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

56 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MySQL TLS 代理服务

这是一个基于 Hyperf 框架的 MySQL 协议代理服务,支持 TLS/SSL 连接和代理层认证。客户端使用代理内配置的账号连接代理,代理使用写死的后端 MySQL 账号执行 SQL 并返回结果。

功能特性

  • TLS/SSL 支持: 支持客户端通过 sslmode=requiresslmode=verify-* 连接
  • 代理认证: 客户端使用代理配置的账号进行认证,不直接使用后端 MySQL 账号
  • 统一后端账号: 所有 SQL 都通过配置的固定 MySQL 账号执行
  • 连接池: 自动管理后端 MySQL 连接池,提高性能
  • SQL 日志: 完整的 SQL 执行日志记录
  • 协议兼容: 支持基本的 MySQL 协议,包括查询、预处理语句等
  • 连接稳定性: 自动连接恢复和超时处理,防止 "Lost connection" 错误

系统要求

  • PHP: >= 8.1
  • Swoole: >= 5.0,支持 SSL (编译时需开启 --enable-openssl)
  • 扩展: pdo_mysql, pcntl, json, openssl
  • 环境: Linux/Mac/Windows (Docker)

快速开始

2. 配置 SSL 证书

# 创建证书目录
mkdir -p runtime/certs

# 生成自签名证书(生产环境请使用正式证书)
openssl req -x509 -newkey rsa:4096 -keyout runtime/certs/server.key -out runtime/certs/server.crt -days 365 -nodes -subj '/CN=localhost'

3. 配置代理账号和后端 MySQL

编辑 config/autoload/proxy.php

'proxy_accounts' => [
    [
        'username' => 'root',
        'password' => 'root',
        'database' => '', // 空表示不限制数据库
    ],
],

'backend_mysql' => [
    'host' => 'mysql57',
    'port' => 3306,
    'username' => 'root',
    'password' => 'root',
    'database' => '',
],

5. 测试连接

# 测试 SSL 连接和代理认证
php test/ssl_test.php

# 或使用 mysql 客户端
mysql --ssl-mode=REQUIRED -h 127.0.0.1 -P 3317 -u proxy_user -p proxy_pass

配置说明

后端 MySQL 配置

配置代理用于连接真实 MySQL 的账号:

'backend_mysql' => [
    'host' => 'mysql-server',
    'port' => 3306,
    'username' => 'service_account',
    'password' => 'service_password',
    'database' => '', // 默认数据库,可为空
    'charset' => 'utf8mb4',
    'tls' => false, // 是否对后端使用 TLS
],

SSL/TLS 配置

'tls' => [
    'server_cert' => BASE_PATH . '/runtime/certs/server.crt',
    'server_key' => BASE_PATH . '/runtime/certs/server.key',
    'ca_cert' => null, // 用于客户端证书验证
    'require_client_cert' => false,
],

架构说明

客户端 (mysql --ssl-mode=REQUIRED)
    ↓ TLS 连接
MySQL 代理 (端口 3317)
├── 代理认证 (验证 proxy_accounts)
├── SQL 执行 (使用 backend_mysql 账号)
└── 结果返回 (MySQL 协议)
    ↓
真实 MySQL 服务器

故障排除

连接失败

  1. 检查服务状态:

    php bin/hyperf.php status
  2. 查看日志:

    tail -f runtime/logs/hyperf.log
    tail -f runtime/logs/connection.log
  3. 测试证书:

    openssl s_client -connect 127.0.0.1:3317 -servername localhost

常见问题

  • SSL 连接失败: 检查证书文件是否存在且可读

  • 认证失败: 确认代理账号配置正确

  • 后端连接失败: 检查后端 MySQL 服务器可访问性

  • 连接池耗尽: 调整 pool.size 配置

  • "2013 - Lost connection to MySQL server during query" 错误:

    可能原因

    • 连接超时时间过短
    • 查询执行时间过长
    • 网络连接不稳定
    • 连接池连接被意外关闭
    • USE命令响应包格式不正确(缺少状态标志)

    解决方案

    1. 检查并调整超时配置(已在最新版本中优化)
    2. 修复USE命令响应包格式,添加SERVER_STATUS_AUTOCOMMIT标志
    3. 监控连接池状态和系统资源
    4. 调整MySQL服务器的超时参数
    5. 重启代理服务以应用修复

服务重启

修改配置或代码后,需要重启代理服务:

# 如果使用Docker容器方式启动
docker restart temp-hyperf-sqlLogProxy

# 或者重新启动Hyperf服务
php bin/hyperf.php stop
php bin/hyperf.php start

开发说明

项目结构:

  • App/Proxy/Protocol/ - MySQL 协议处理
  • App/Proxy/Auth/ - 代理认证逻辑
  • App/Proxy/Executor/ - 后端执行器
  • App/Proxy/Pool/ - 连接池管理
  • config/autoload/proxy.php - 代理配置
  • test/ - 测试脚本

About

记录数据库的curd语句, 模拟mysql

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages