Debian 上 Nginx 日志出现“乱码”,通常不是 Nginx 本身把日志写错了,而是字符编码不一致或终端/查看工具编码不对导致的。下面按常见原因逐一说明。
Nginx 访问日志里会记录:
如果客户端发送的是:
Nginx 原样记录字节,不做转码,于是你看到“乱码”。
✅ 这是正常现象
❌ 不是 Nginx bug
Debian 某些最小化安装默认是:
LANG=C
LC_ALL=C
这会导致:
locale
如果看到:
LANG=C
sudo dpkg-reconfigure locales
# 选择 en_US.UTF-8 或 zh_CN.UTF-8
然后:
export LANG=en_US.UTF-8
比如:
cat + 非 UTF-8 终端less -Riconv 转换示例:
iconv -f GBK -t UTF-8 access.log
$request / $args这些字段:
log_format main '$remote_addr - $request';
$request 包含原始请求行,可能含编码后的参数(如 %E4%B8%AD)。
你看到:
/%E4%B8%AD%E6%96%87
这不是乱码,而是 URL 编码
解码即可:
python3 -c "import urllib.parse;print(urllib.parse.unquote('%E4%B8%AD%E6%96%87'))"
有时你看到的是:
实际是:
charset utf-8;
未设置,或后端返回 GBK。
重要事实:
Nginx 不会把请求参数转成 UTF-8 再写日志
所以:
# 1. 看系统编码
locale
# 2. 看日志原始字节
xxd /var/log/nginx/access.log | head
# 3. 判断是否 URL 编码
grep '%' /var/log/nginx/access.log
# 4. 尝试转码
iconv -f GBK -t UTF-8 access.log
Debian + Nginx 日志“乱码”,99% 是因为:请求不是 UTF-8,或你用非 UTF-8 方式看日志。
如果你愿意,可以把一段日志贴出来,我可以直接告诉你它是: