单台服务器用二级域名部署多个hyperf项目,核心是nginx反向代理按host头将请求分发至不同端口的hyperf实例(如admin→9502、api→9503),各项目独立监听端口并无需框架层域名路由。

单台服务器用二级域名部署多个 Hyperf 项目,核心是“隔离 + 路由 + 反向代理”。Hyperf 本身不直接处理二级域名分发,它只负责监听某个端口提供 HTTP 服务;真正的域名识别和请求分发,得靠 Nginx(或类似反向代理)完成。整个流程不依赖 Hyperf 框架内部路由做子域名判断,而是由 Web 服务器把不同子域名的请求,精准转发到对应 Hyperf 实例的监听端口。
确保每个 Hyperf 项目独立监听不同端口
Hyperf 默认启动在 9501 端口,多个项目必须错开端口,避免冲突。这是隔离的第一步:
- 修改各项目的
config/autoload/server.php中servers的port值,例如:
—admin.example.com→port => 9502
—api.example.com→port => 9503
—pay.example.com→port => 9504 - 每个项目启动后,应能通过
curl http://127.0.0.1:9502正常访问,说明服务已就绪 - 建议配合
systemd或supervisor守护进程,防止意外退出
Nginx 配置子域名反向代理
Nginx 是关键枢纽。它根据请求头中的 Host 字段,把流量分发到对应端口的 Hyperf 进程:
- 为每个子域名单独写一个
server块,例如:
/etc/nginx/conf.d/admin.example.com.conf
server {
listen 80;
server_name admin.example.com;
location / {
proxy_pass http://127.0.0.1:9502;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
- 同理配置
api.example.com指向9503,pay.example.com指向9504 - 务必检查
server_name是否与你实际申请的二级域名完全一致(区分大小写、无空格) - 测试配置:运行
sudo nginx -t,确认无误后再sudo systemctl reload nginx
域名解析与 HTTPS(可选但推荐)
用户能访问的前提是 DNS 正确指向你的服务器 IP:
- 在域名服务商后台(如阿里云、Cloudflare),为每个二级域名添加 A 记录:
—admin→ 指向服务器公网 IP
—api→ 同一 IP
—pay→ 同一 IP - 若需 HTTPS,可用 Certbot 自动申请泛域名证书(
*.example.com)或为每个子域名单独申请;Nginx 配置中启用listen 443 ssl并加载证书即可 - 注意:泛域名证书不覆盖根域(
example.com)和 www,如有需要需额外包含
补充:Hyperf 项目本身无需特殊路由配置
不同于 ThinkPHP 那类框架需要 Route::domain() 显式绑定,Hyperf 在这种部署模式下保持“无感”:
- 它只管处理自己端口上的所有请求,不关心 Host 是什么
- 业务逻辑、中间件、CORS 设置等,按单体应用方式开发即可
- 如果某项目需识别当前子域名(比如动态切换数据库或日志前缀),可通过
$request->header('host')获取原始 Host 值











