Nginx 日志出现乱码,通常不是 Nginx 本身“坏了”,而是字符编码不一致或数据来源编码异常导致的。常见原因和对应排查方向如下:
一、最常见原因:客户端 / 上游编码不是 UTF-8
1. URL 或请求参数中有非 UTF-8 编码
- 浏览器或客户端用了 GBK / GB2312
- Nginx 默认按字节记录,日志里就变成乱码
表现:
/log?name=涓€浜╃
解决:
- 前端统一使用 UTF-8
- 对参数做 URL 编码(encodeURIComponent)
二、Nginx 日志格式中记录了非文本字段
2. 记录了 body 或二进制数据
如果在日志中打印了:
$request_body
- 上传文件内容
- 二进制协议数据
就会出现乱码。
建议:
- 不要记录
$request_body 到 access log
- 或用
lua 做截断 / 过滤
三、终端 / 查看工具编码不对
3. 日志本身是 UTF-8,但你看的地方不是
例如:
- SecureCRT / Xshell 编码不是 UTF-8
- Windows 记事本默认 GBK
验证方法:
file access.log
解决:
- 终端设置为 UTF-8
- 用
less、vim(set encoding=utf-8)
四、error.log 中的中文乱码
4. 系统 locale 不支持中文
locale
如果不是:
LANG=zh_CN.UTF-8
Nginx 报错信息中的中文会乱。
解决:
export LANG=zh_CN.UTF-8
五、反向代理 / 上游返回内容乱码
5. 后端返回编码和 Nginx 不一致
- 后端是 GBK
- Nginx / 前端当 UTF-8
虽然一般不影响 access log,但如果你记录了:
$upstream_response
- 自定义 header
就会乱。
六、特殊字符被转义(不是真乱码)
例如:
\xE4\xB8\xAD
这是 十六进制转义,不是乱码。
快速自查清单 ✅
- 是否记录了 body?
- 请求参数是否 UTF-8?
- 查看工具编码对吗?
- 系统 locale 正常吗?
- 是 access.log 还是 error.log?
如果你愿意,可以:
- 贴一段具体乱码日志
- 说明是 access.log 还是 error.log
- 是否用了
lua / proxy / 自定义 log_format
我可以直接帮你定位是哪一类问题。