HAProxy代理MySQL需后端显式开放远程访问,关键包括:修改MySQL bind-address为0.0.0.0或HAProxy内网IP;创建专用健康检查用户并授权;防火墙与SELinux放行;phpMyAdmin配置host指向HAProxy地址而非后端节点;backend必须使用option mysql-check而非tcp-check,并配timeout check与inter参数。
HAProxy 后端 MySQL 实例必须显式开放远程访问
HAProxy 本身不处理 MySQL 认证或权限,它只做 TCP 层转发。如果后端 MySQL 实例 bind-address 仍是 127.0.0.1 或 ::1,HAProxy 的健康检查会失败,phpMyAdmin 连接时直接报 #2002 Cannot log in to the MySQL server。
关键动作有三件:
- 修改 MySQL 配置(如
/etc/mysql/mysql.conf.d/mysqld.cnf),将bind-address改为0.0.0.0或具体 HAProxy 机器的内网 IP - 为每个后端节点创建专用用户,并授权给 HAProxy 所在服务器的 IP,例如:
GRANT SELECT,INSERT,UPDATE,DELETE ON *.* TO 'haproxy_check'@'192.168.10.5' IDENTIFIED BY 'pass123'; - 确认防火墙放行对应端口(如
3306、3307),且 SELinux 不拦截(setsebool -P haproxy_connect_any on)
phpMyAdmin 配置里 host 必须填 HAProxy 地址,不是后端节点
你连的是集群入口,不是单个 MySQL。若在 config.inc.php 中把 $cfg['Servers'][$i]['host'] 写成 '192.168.10.10'(某个后端节点),就绕过了 HAProxy,失去负载均衡和故障转移能力。
正确写法是:
-
$cfg['Servers'][$i]['host'] = 'haproxy.internal';(DNS 可解析的域名) - 或
$cfg['Servers'][$i]['host'] = '192.168.10.20';(HAProxy 服务监听的 VIP 或物理 IP) -
$cfg['Servers'][$i]['port'] = '3306';(必须与 HAProxy frontend 监听端口一致) - 删掉或注释掉
$cfg['Servers'][$i]['socket']—— socket 路径在此场景下无效且会干扰 TCP 连接
HAProxy 的 health check 必须用 MySQL 协议,不能只靠 TCP
很多配置误用 option tcp-check 检查端口通不通,这会导致后端 MySQL 已宕机但 HAProxy 仍把流量打过去,phpMyAdmin 就卡在连接握手阶段,超时后报错 Connection refused 或 Lost connection to MySQL server。
应使用 MySQL-aware 检查:
- 在 backend 段启用
option mysql-check user haproxy_check - 确保该用户有
USAGE权限(无需数据库权限,仅用于握手) - 搭配
timeout check 5s和inter 3s,避免探测过频或过慢
示例 backend 片段:
backend mysql_cluster
mode tcp
option mysql-check user haproxy_check
timeout check 5s
server db1 192.168.10.101:3306 check inter 3s rise 2 fall 3
server db2 192.168.10.102:3306 check inter 3s rise 2 fall 3
phpMyAdmin 登录页看不到“当前连的是哪台”,得靠 SQL 查
HAProxy 是透明代理,phpMyAdmin 无法感知后端真实节点。你登录后看到的 Server: localhost via TCP/IP 是假的 —— 实际连接的是 HAProxy,它再转到某台 MySQL。
要确认当前请求落到哪台后端,执行:
SELECT @@hostname, @@server_id;
或者查状态变量:
SHOW STATUS LIKE 'Threads_connected';
注意:
- 不要依赖 phpMyAdmin 右上角显示的 host 名,那是配置里的
$cfg['Servers'][$i]['host'],不是真实后端 - 如果集群启用了读写分离(如主库写、从库读),HAProxy 通常按 ACL 分流,phpMyAdmin 发出的任意查询都可能被路由到不同节点,事务一致性需自行控制
最易被忽略的是:haproxy 默认不透传客户端源 ip 到 mysql,所以 show processlist 看到的 host 全是 haproxy 的 ip。如需审计来源,得在 haproxy 配置中加 tcp-request content set-src 并启用 mysql 的 proxy_protocol 支持。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











