mysql不支持虚拟主机功能,需通过grant权限控制和数据库命名隔离实现租户隔离:为各租户创建独立用户并限定其仅能访问指定数据库,如create user 'site_a_user'@'%'并grant select,insert,update,delete on site_a_db.*;数据库前缀(如alice_wordpress)仅辅助管理,非权限机制;host字段影响权限匹配,'user'@'localhost'与'user'@'127.0.0.1'视为不同账号。

MySQL 里没有“虚拟主机”这个概念
MySQL 本身不提供类似 Web 服务器(如 Apache/Nginx)中 VirtualHost 那样的“虚拟主机”功能。你无法通过配置让同一个 MySQL 实例监听不同域名或子域名并自动路由到不同数据库或用户空间。所谓“MySQL 虚拟主机”,通常是应用层或运维层的模拟方案,核心依赖的是 GRANT 权限控制 + 数据库命名隔离。
用 GRANT 实现按用户隔离数据库访问
真实可行的做法是:为每个租户(或站点)创建独立的 MySQL 用户,并只授予其对特定数据库的权限。这样即使所有数据库都在同一个 MySQL 实例里,用户 A 也无法看到、访问用户 B 的库。
- 创建数据库:
CREATE DATABASE `site_a_db` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 创建用户并授权:
CREATE USER 'site_a_user'@'%' IDENTIFIED BY 'strong_pass_123';<br>GRANT SELECT, INSERT, UPDATE, DELETE ON `site_a_db`.* TO 'site_a_user'@'%';<br>FLUSH PRIVILEGES;
- 禁止跨库访问:
site_a_user默认无法USE site_b_db,也无法执行SELECT * FROM site_b_db.users—— 除非显式授予权限
数据库名前缀不是权限,但能辅助管理
有些面板(如 cPanel)或脚本会强制要求数据库名带前缀,比如 user1_site1、user2_site2。这本身不构成权限控制,但有实际好处:
WOC是基于zend framework1.6框架所开发的一款开源简易网站运营管理系统。它允许进行网站管理、主机管理、域名管理、数据库管理、邮箱管理以及用户管理、角色管理、权限管理等一系列功能,适合中小企业进行网站运营管理。目前版本为V1.2,新版本正在开发中,同时欢迎大家参与到开发中来! WOC升级说明: 1.1在1.0的基础上进行了代码规范并增加了配置数据缓存,以提高访问速度 注意:升级时要重
- 避免命名冲突:多个用户都能建
wordpress库,加前缀后变成alice_wordpress和bob_wordpress - 便于批量回收:
DROP DATABASE前可先SHOW DATABASES LIKE 'alice_%' - 配合
GRANT使用时更清晰:GRANT ALL ON `alice_%`.* TO 'alice'@'%'是合法语法(通配符匹配库名),但需注意安全风险
⚠️ 注意:GRANT ... ON `prefix_%`.* 允许用户操作所有匹配前缀的库,一旦新增库未严格审计,可能造成越权。
连接时指定 host 参数影响权限判定
MySQL 的权限记录在 mysql.user 表中,其中 Host 字段决定该用户能从哪连进来。常见误区:
-
'user'@'localhost'和'user'@'127.0.0.1'是两个不同账号,权限需分别授予 - 使用 Unix socket 连接(如本地 CLI)走
localhost;TCP 连接(如 PHPmysqli_connect('127.0.0.1'))走127.0.0.1 - 生产环境建议禁用
'root'@'%',改用'admin'@'192.168.10.%'这类受限网段
权限生效顺序是:先匹配最具体的 Host + User 组合,再 fallback 到通配符。别指望靠改 my.cnf 的 bind-address 来“隔离虚拟主机”——它只管监听地址,不管逻辑隔离。









