thinkphp二级域名高可用部署需四者协同:域名识别(多应用+url_domain_deploy)、应用路由(route::domain)、流量分发(nginx按域upstream)、故障规避(健康检查+redis会话+共享存储)。

ThinkPHP 实现二级域名 + 高可用部署,关键不是堆服务器,而是让“域名识别”“应用路由”“流量分发”“故障规避”四者协同。二级域名负责逻辑隔离(如 admin.example.com → 后台应用),Nginx 负载均衡负责横向扩展与自动容错,二者结合才能真正落地高可用。
一、ThinkPHP 侧:二级域名绑定必须精准
多应用模式是前提,不能靠复制多套代码或改入口文件实现。需确保:
- 已执行
composer require topthink/think-multi-app,并删除根目录app/controller目录,触发框架识别多应用结构 - 用
php think build admin、php think build api创建了app/admin/、app/api/等独立应用目录 - 在
config/app.php中启用域名部署:'url_domain_deploy' => true(注意:不是APP_SUB_DOMAIN_DEPLOY,那是 TP5 旧配置) - 在
route/app.php中注册子域名规则,例如:Route::domain('admin', 'admin');→ 访问 admin.example.com 自动加载 app/admin/Route::domain('api', 'api');→ 访问 api.example.com 加载 app/api/Route::domain('*', 'index');→ 兜底,处理 www.example.com 或裸域
二、Nginx 侧:为每个二级域名配专属 upstream
不推荐所有子域名共用一个 upstream,而应按业务域划分集群,便于独立扩缩容与故障隔离。例如:
-
admin.example.com流量只打到 admin 后端组(含 2 台专用后台服务器) -
api.example.com流量只打到 api 后端组(含 3 台高性能 API 服务器) - 各组可启用不同策略:admin 组用
ip_hash保证登录态连续;api 组用least_conn应对长连接请求
配置示例(放在 /etc/nginx/nginx.conf 的 http 块内):
upstream admin_cluster {
ip_hash;
server 192.168.10.10:80 max_fails=3 fail_timeout=30s;
server 192.168.10.11:80 max_fails=3 fail_timeout=30s;
}
upstream api_cluster {
least_conn;
server 192.168.20.10:80 weight=2;
server 192.168.20.11:80 weight=1;
server 192.168.20.12:80 weight=1;
}
三、server 块按域名路由,同时注入关键头信息
每个二级域名对应一个 server 块,明确绑定 server_name,并使用 proxy_pass 指向对应 upstream。务必传递以下头字段:
-
proxy_set_header Host $host;:确保 ThinkPHP 能正确识别当前访问的子域名(用于Route::domain()匹配) -
proxy_set_header X-Real-IP $remote_addr;和X-Forwarded-For:保留真实客户端 IP,供日志、风控、限流使用 -
proxy_set_header X-Forwarded-Proto $scheme;:避免 HTTPS 下跳转回 HTTP
示例:
server {
listen 80;
server_name admin.example.com;
location / {
proxy_pass http://admin_cluster;
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;
}
}
四、高可用闭环:健康检查 + 故障转移 + 状态同步
仅靠轮询不够,必须构建自动恢复能力:
-
被动健康检查:依靠
max_fails和fail_timeout。某后端连续失败 3 次,Nginx 会将其临时剔除 30 秒,到期自动重试 -
会话一致性:后台应用必须禁用本地 session 文件,统一接入 Redis。在
config/cache.php和config/session.php中配置 Redis 驱动,确保用户在 admin 集群内任意节点登录后状态互通 -
静态资源与上传文件:所有后端节点不能各自存图。应对接 OSS、MinIO 或 NFS,让
public/uploads/实际指向共享存储,避免图片 404 -
数据库层保障:主库写 + 多从库读,ThinkPHP 配置
readwrite_type为random或balance,配合master_num控制写库数量
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











