Nginx可通过map指令将$host映射为动态日志路径变量,在server块中用access_log $log_path main实现海量域名日志自动分类存储,需定义在http块、设default兜底、确保路径合法且目录预建。

可以通过 Nginx 的 map 指令将域名映射为日志路径变量,再在 server 块中引用该变量动态设置 access_log,从而实现海量域名各自独立日志文件的自动分类存储。
定义基于 host 的日志路径映射
在 http 块顶层使用 map 指令,根据 $host(或更稳妥的 $http_host)生成对应日志路径。注意:路径需为绝对路径,且目录需提前创建并确保 Nginx 工作进程有写权限。
示例:
map $http_host $log_path {
default /var/log/nginx/access_default.log;
example.com /var/log/nginx/example.com_access.log;
api.example.com /var/log/nginx/api.example.com_access.log;
~^(?<subdomain>[^.]+)\.example\.org$ /var/log/nginx/${subdomain}.example.org_access.log;
~^([a-z0-9\-]+)\.site\.net$ /var/log/nginx/site_net/$1_access.log;
}</subdomain>说明:
-
default是兜底路径,处理未匹配的请求(如非法 Host、IP 直连等) - 支持精确匹配与正则匹配;正则中可用命名捕获
(?或位置捕获...) $1构建动态路径 - 避免在
map中拼接复杂路径(如含空格、特殊字符),建议域名规范化(小写、去端口、去 www 等)可前置用map预处理
在 server 块中启用动态 access_log
无需为每个域名单独写 server 块,统一用泛域名配置(如 server_name _;),并在其中引用 $log_path 变量:
server {
listen 80;
server_name _;
root /var/www/html;
<pre class="brush:php;toolbar:false;">access_log $log_path main; # ← 关键:变量直接用于 access_log 指令
error_log /var/log/nginx/error.log warn;
location / {
try_files $uri $uri/ =404;
}
}
将 WCAG 2 AA 无障碍标准应用于设计系统、UI 组件和网页——通过可运行的验证器进行对比度计算,采用设计 token 模式使颜色天生可访问,设定排版和焦点状态规则,并提供语义检查清单。适用于构建或审查 UI。
注意:
-
access_log支持变量,但仅限于路径部分(格式名如main必须是静态字符串) - 变量值必须是合法文件路径;若为空或非法,Nginx 启动会报错或静默禁用该日志
- 不建议在
location块内重写access_log—— 它只在server或http级生效
配套运维要点
动态日志路径带来便利,也需配套管理:
-
目录预建与权限:所有可能生成的路径父目录(如
/var/log/nginx/site_net/)需存在,且属主为nginx用户(或运行用户),权限建议755 -
日志轮转:logrotate 需支持通配符或动态发现。推荐用
prerotate脚本扫描当前活跃域名,生成临时配置,或统一用/var/log/nginx/*_access.log匹配 -
防路径遍历:确保
$http_host不含../等恶意片段。可在map前加一层过滤,例如先用map清洗 Host(转小写、替换非法字符、截断过长值) - 性能影响极小:map 查找是哈希+正则缓存,百万级域名实测无压力;但正则不宜过多嵌套或回溯严重
进阶:按业务维度二次分类
可叠加多层 map 实现组合分类,例如先分客户组,再分环境:
map $http_host $customer {
~@client-a\.com$ client_a;
~@client-b\.org$ client_b;
default others;
}
<p>map $http_host $env {
~-staging. staging;
~-prod. production;
default default;
}</p><p>map "$customer.$env" $log_path {
client_a.production /var/log/nginx/client_a/prod_access.log;
client_a.staging /var/log/nginx/client_a/stage_access.log;
default /var/log/nginx/shared/default_access.log;
}</p>这样既保持配置清晰,又支撑多维日志治理,适合 SaaS 或托管平台场景。










