Debian 上 Nginx 日志出现乱码,通常不是 Nginx 本身“坏了”,而是字符编码不一致或写日志的内容本身就不是 UTF‑8。下面按常见原因给你梳理一下。
Debian 默认应该是 UTF‑8,但有时:
C / POSIX检查:
locale
正常应看到:
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
如果不是:
sudo dpkg-reconfigure locales
选 en_US.UTF-8
例如:
cat 正常less 乱码(less 没识别 UTF‑8)解决:
less -r /var/log/nginx/access.log
或用:
vim
Vim 一般能正确识别 UTF‑8
例如:
Nginx 会原样记录,于是日志里就是乱码。
典型现象:
/api?name=%E5%BC%A0%E4%B8%89 <- 正常 UTF‑8
/api?name=å¼ ä¸‰ <- 已解码但编码错
✅ 这不是 Nginx 问题,是客户端问题
$request_body 里出现乱码如果你在日志里记录了:
log_format main '$remote_addr $request_body';
而 body 是:
那日志一定乱码。
重要结论:
Nginx 不负责字符编码转换
它只负责“原样写入字节”
所以:
例如:
LANG=C
可能导致某些模块输出异常字符。
✅ 建议统一为 UTF‑8
file -i /var/log/nginx/access.log
输出示例:
access.log: text/plain; charset=utf-8
如果不是 utf‑8,说明写入内容就不是 UTF‑8
✅ 推荐做法:
$request_body(尤其是表单)❌ 不推荐:
如果你愿意,可以把一段乱码日志贴出来(脱敏后),我可以直接帮你判断是 GBK / UTF‑8 / 二进制 / URL 编码问题。