Nginx + FastCGI + Django 架构下错误日志在哪里找?
Nginx 错误日志默认在 /var/log/nginx/error.log,Django 应用日志取决于 settings.py 的 LOGGING 配置与进程管理方式。本文给出三层日志的定位方法与配置示例。
排查顺序:这套架构的错误分布在三层——Nginx 层默认在 /var/log/nginx/error.log(配置与反代问题);Django 应用层位置由 settings.py 的 LOGGING 配置决定,未配置时走运行容器的 stderr(systemd journal、supervisor 或容器日志);数据库慢查询另有自己的日志。先看 Nginx 日志判断请求是否到达上游,再看应用日志。
第一层:Nginx 日志
Ubuntu/Debian 与 CentOS 默认位置一致:
- 错误日志:
/var/log/nginx/error.log - 访问日志:
/var/log/nginx/access.log
实际路径以配置为准,查 /etc/nginx/nginx.conf 与 /etc/nginx/sites-enabled/ 下的站点配置:
server {
listen 80;
server_name example.com;
error_log /var/log/nginx/example-error.log warn;
access_log /var/log/nginx/example-access.log;
location / {
include fastcgi_params;
fastcgi_pass 127.0.0.1:8000;
}
}
502 Bad Gateway 说明 Nginx 连不上 FastCGI 进程;504 是上游超时——这两类问题在 Nginx 日志里定界,再到应用层定位。
第二层:Django 应用日志
Django 默认只把 ERROR 级日志发给管理员邮件,写文件需要在 settings.py 配置:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/var/log/django/app.log',
'maxBytes': 10 * 1024 * 1024,
'backupCount': 5,
},
},
'root': {'handlers': ['file'], 'level': 'WARNING'},
}
没配置文件处理器时,日志输出到进程 stderr:supervisor 托管看在 supervisord.conf 配的 stderr_logfile;systemd 托管用 journalctl -u django-app;uWSGI/gunicorn 各自有 --error-logfile 参数。
第三层:FastCGI 进程日志
如果通过 manage.py runfcgi 或 flup 跑 FastCGI,进程自身也有错误输出参数;现代部署更推荐 gunicorn/uWSGI + unix socket 替代 FastCGI,日志体系更清晰。
观测云对照
三层日志一个平台看。 DataKit 的 Nginx 集成采集访问/错误日志并解析成字段,Django 应用日志按文件或容器采集;配合 APM 探针,从 Nginx 的 502 一路追到 Django 里具体哪行代码报错。
常见问题(FAQ)
Q:页面 500 但 Django 日志什么都没有?
A:DEBUG = False 时 Django 默认只发邮件不写文件,务必配置文件处理器;也检查日志目录对应用用户可写。
Q:fastcgi_pass 报 connect() failed 怎么查?
A:先确认 FastCGI 进程在跑(ss -ltnp | grep 8000),再看 Nginx error.log 的具体报错,多半是进程挂了或端口/socket 不匹配。
Q:能在 Nginx 日志里看到请求耗时吗?
A:在 log_format 里加 $request_time 与 $upstream_response_time,可区分网络耗时与应用耗时。