这是一个基于 Hyperf 框架的 MySQL 协议代理服务,支持 TLS/SSL 连接和代理层认证。客户端使用代理内配置的账号连接代理,代理使用写死的后端 MySQL 账号执行 SQL 并返回结果。
- ✅ TLS/SSL 支持: 支持客户端通过
sslmode=require或sslmode=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)
# 创建证书目录
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'编辑 config/autoload/proxy.php:
'proxy_accounts' => [
[
'username' => 'root',
'password' => 'root',
'database' => '', // 空表示不限制数据库
],
],
'backend_mysql' => [
'host' => 'mysql57',
'port' => 3306,
'username' => 'root',
'password' => 'root',
'database' => '',
],# 测试 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 的账号:
'backend_mysql' => [
'host' => 'mysql-server',
'port' => 3306,
'username' => 'service_account',
'password' => 'service_password',
'database' => '', // 默认数据库,可为空
'charset' => 'utf8mb4',
'tls' => false, // 是否对后端使用 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 服务器
-
检查服务状态:
php bin/hyperf.php status
-
查看日志:
tail -f runtime/logs/hyperf.log tail -f runtime/logs/connection.log
-
测试证书:
openssl s_client -connect 127.0.0.1:3317 -servername localhost
-
SSL 连接失败: 检查证书文件是否存在且可读
-
认证失败: 确认代理账号配置正确
-
后端连接失败: 检查后端 MySQL 服务器可访问性
-
连接池耗尽: 调整
pool.size配置 -
"2013 - Lost connection to MySQL server during query" 错误:
可能原因:
- 连接超时时间过短
- 查询执行时间过长
- 网络连接不稳定
- 连接池连接被意外关闭
- USE命令响应包格式不正确(缺少状态标志)
解决方案:
- 检查并调整超时配置(已在最新版本中优化)
- 修复USE命令响应包格式,添加SERVER_STATUS_AUTOCOMMIT标志
- 监控连接池状态和系统资源
- 调整MySQL服务器的超时参数
- 重启代理服务以应用修复
修改配置或代码后,需要重启代理服务:
# 如果使用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/- 测试脚本