Nginx 日志出现乱码,通常不是 Nginx 本身的问题,而是字符编码不一致导致的。下面按常见原因和处理方法来说明。
$request / $args$request 记录的是原始请求行proxy_pass + log_subrequest)file access.log
UTF-8 → 可能是客户端问题ISO-8859 / GBK → 编码问题用 UTF-8 方式查看:
LESSCHARSET=utf-8 less access.log
避免直接记录原始请求行
❌ 不推荐:
log_format main '$remote_addr - $request';
✅ 推荐(拆解字段):
log_format main '$remote_addr - $time_local '
'$request_method $uri $args '
'$status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
$uri 是解码后的 URI(UTF-8)$args 是参数(可再处理)如果是自有系统:
encodeURIComponentNginx 原生不支持编码转换,但可用:
local args = ngx.unescape_uri(ngx.var.args)
-- 可转码为 UTF-8
export LANG=en_US.UTF-8
tail -f access.log
| 场景 | 建议 |
|---|---|
| 只是显示乱码 | 用 UTF-8 终端查看 |
| URL 中文乱码 | 改日志格式,用 $uri |
| 客户端 GBK | 前端改 UTF-8 |
| 必须保留原始请求 | 日志采集端转码 |
如果你愿意,可以:
我可以帮你精确分析是哪一层的问题。