Nginx + FastCGI + Django 架构下错误日志在哪里找?

Nginx 错误日志默认在 /var/log/nginx/error.log,Django 应用日志取决于 settings.py 的 LOGGING 配置与进程管理方式。本文给出三层日志的定位方法与配置示例。

最佳实践
Nginx + FastCGI + Django 架构下错误日志在哪里找?封面

排查顺序:这套架构的错误分布在三层——Nginx 层默认在 /var/log/nginx/error.log(配置与反代问题);Django 应用层位置由 settings.py 的 LOGGING 配置决定,默认输出受 DEBUG、logger 和 Django 默认配置影响,不能假定都写到 stderr;数据库慢查询另有自己的日志。先看 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 / {
        proxy_pass http://127.0.0.1:8000; # 此处假设后端为 Gunicorn HTTP
        proxy_set_header Host $host;
    }
}

上例是现代 HTTP 上游示意;遗留 FastCGI 必须使用 fastcgi_pass 并补齐应用所需参数,uWSGI 协议则使用 uwsgi_pass。502 可由上游连接失败、提前关闭或无效响应引起;504 是上游超时——这两类问题在 Nginx 日志里定界,再到应用层定位。

第二层:Django 应用日志

Django 默认日志路由随 DEBUG、logger 和邮件设置变化;并非所有错误都只发邮件。可在 settings.py 显式配置输出:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'file': {
            'class': 'logging.StreamHandler',
            'stream': 'ext://sys.stderr',
        },
    },
    'root': {'handlers': ['file'], 'level': 'WARNING'},
    'loggers': {
        'django': {'handlers': ['file'], 'level': 'INFO', 'propagate': False},
    },
}

上例显式替换 django logger 的处理器;需要管理员邮件时应另行配置。若已按上例输出到 stderr,supervisor 托管看在 supervisord.conf 配的 stderr_logfile;systemd 托管用 journalctl -u django-app;Gunicorn 可用 --error-logfile,uWSGI 则需核对其 logto 等参数,不能混用。标准 RotatingFileHandler 不适合多 worker 直接写同一个轮转文件。

第三层:FastCGI 进程日志

manage.py runfcgi 已从现代 Django 移除;遗留 flup 部署应按实际进程配置排查。现代 Gunicorn/uWSGI 部署要让 Nginx 指令匹配后端协议,Unix socket 只是传输方式,不等于 FastCGI。

多台机器上的错误难以对齐时,可以把 Nginx 与 Django 日志分别通过日志采集器送入观测云,设置来源和服务名。先按同一时间窗查 Nginx 错误中的上游地址,再核对对应 Django 进程的异常堆栈,避免只凭 502 判断应用出错。

常见问题(FAQ)

Q:页面 500 但 Django 日志什么都没有?
A:检查 Django logger、handler、过滤器与实际输出目的地;DEBUG=False 不意味着所有错误都只发邮件。如写文件还需核对目录权限。

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,可辅助定位阶段,但两者相减不能直接得到纯网络耗时或确定根因。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台