thinkphp二级域名监控需统一采集并按应用名、子域名、http方法、状态码三重打标,避免指标混淆;通过中间件自动提取应用名打标,/metrics端点独立轻量暴露,告警规则按应用分级配置。

ThinkPHP 配置二级域名绑定后做监控告警,关键不是给每个子域名单独装一套 Prometheus,而是统一采集 + 分维度打标。多应用结构下,指标需按 应用名(如 index/admin/api)、子域名、HTTP 方法、状态码 三重隔离,否则 QPS 和响应时间会混在一起,告警失真。
一、确保多应用与域名绑定已正确生效
这是监控准确的前提。若 domain_bind 或 Route::domain 配置错误,所有请求都落到 index 应用,后续指标全无区分度:
- 检查 config/app.php 中 'auto_multi_app' => true 且 'domain_bind' 数组完整(含端口,如
'localhost:8000'=>'index') - 确认未遗漏 www.example.com 和 example.com 的显式绑定(它们是两个不同 Host)
- 验证 Nginx/Apache 正确透传
HTTP_HOST:Nginx 需加fastcgi_param HTTP_HOST $host; - 用 curl -H "Host: admin.example.com" http://127.0.0.1 访问,确认返回的是 admin 应用内容
二、中间件层统一打点,按应用名自动分标
不要在每个应用的控制器里分别埋点。应在全局 PSR-15 中间件中,根据当前应用上下文动态提取应用名,作为 label 写入指标:
- 在 handle() 开头获取当前应用名:
$app = hinkApp::getAppNamespace();(返回 'app\index\' → 提取 'index') - QPS 计数器使用三维度 label:
$counter->inc([$method, $status, $app]); - 响应时间直方图同样带上应用名:
$histogram->observe($duration, [$method, $app]); - 避免硬编码应用名,防止新增应用时漏改指标逻辑
三、/metrics 端点独立暴露,禁用业务中间件
该接口必须轻量、稳定、不依赖数据库或缓存,否则会影响 Prometheus 抓取:
- 路由单独注册:
Route::get('/metrics', 'MetricsController@index')->middleware('allow_cross_origin')->withoutMiddleware(['check_auth', 'log_request']); - 控制器内只调用
$registry->getMetricFamilySamples(),不做任何 DB 查询或 Redis 操作 - 确保该路由不经过多应用识别逻辑(即不走 domain_bind 路由链),直接响应
- 生产环境建议用 Nginx 限制访问 IP,仅允许 Prometheus Server 抓取
四、告警规则按应用分级配置
不同应用容忍度不同,不能共用一套阈值。例如 admin 后台错误率 > 1% 就该告警,而 api 接口可设为 3%:
- Prometheus rules 示例:
alert: AdminAppHighErrorRate<br>expr: sum(rate(tp_http_requests_total{app="admin", code=~"5.."}[5m])) by (app) / sum(rate(tp_http_requests_total{app="admin"}[5m])) > 0.01<br>for: 3m - 在 Alertmanager 中按 app label 路由:将 admin 告警发给运维群,api 告警发给研发群
- Grafana 看板按 app 分 Tab,每个子域名对应一个应用面板,便于快速定位问题域
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











