You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EC2上Django+Nginx+uWSGI重启后出现500内部服务器错误求助

问题描述

我在EC2上部署了基于Django的Web应用,搭配Nginx和uWSGI。开发React前端时,向服务器公网IPv4发送HTTP请求,初期响应正常,数据可正常传输至http://localhost:3000。但重启EC2实例后,Nginx返回500 (Internal Server Error),具体信息如下:

日志信息

  1. /var/nginx/access.log记录了多个请求的500错误:
3.21.102.102 - - [22/Dec/2022:04:07:08 +0000] "GET /beta/.env HTTP/1.1" 500 32 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246" "-"
3.21.102.102 - - [22/Dec/2022:04:07:08 +0000] "GET /beta/.env.local HTTP/1.1" 500 32 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246" "-"
3.21.102.102 - - [22/Dec/2022:04:07:09 +0000] "GET /beta/.env.production HTTP/1.1" 500 32 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246" "-"
3.21.102.102 - - [22/Dec/2022:04:07:09 +0000] "GET /beta/.env.staging HTTP/1.1" 500 32 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246" "-"
3.21.102.102 - - [22/Dec/2022:04:07:09 +0000] "GET /live/.env HTTP/1.1" 500 32 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246" "-"
  1. /var/nginx/error.log为空

配置文件与Django settings.py

Nginx配置

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80;
        listen       [::]:80;
        server_name  {{server_address_of_mine}};
        root         /home/ec2-user/cury_engine;

        include /etc/nginx/default.d/*.conf;

         location / {
                include         uwsgi_params;
                uwsgi_pass      unix:/home/ec2-user/cury.sock;
        }
    }

Django settings.py片段

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

WSGI_APPLICATION = 'cury_engine.wsgi.application'

CORS_ORIGIN_WHITELIST = [
    'http://localhost:3000',
    "http://localhost:8000",
    '{{my_domain}}',
    "http://127.0.0.1:8000",
]

已尝试操作

重启EC2实例后,执行了以下操作,且通过sudo systemctl status XXX确认Nginx和uWSGI运行正常:

  • sudo systemctl restart nginx
  • sudo systemctl restart nginx.service
  • sudo systemctl restart uwsgi(Django服务器通过此命令自动启动)
  • sudo systemctl restart uwsgi.service

额外测试

  • Postman请求返回同样的500错误
  • EC2实例终端内curl请求也返回500错误

需求:恢复服务器正常运行,并掌握此类错误的调试方法。


解决方案与调试方法

紧急恢复步骤

  1. 修复uWSGI Socket权限
    重启EC2后,uWSGI生成的sock文件权限可能异常,导致Nginx无法读写。执行以下命令:

    # 临时修复权限
    sudo chmod 666 /home/ec2-user/cury.sock
    # 更安全的长期方案:将Nginx用户加入uWSGI所属组
    sudo usermod -aG ec2-user nginx
    sudo systemctl restart nginx
    
  2. 定位Django/uWSGI层面错误
    Nginx error.log为空,说明错误出在后端服务。检查以下日志:

    # 查看uWSGI系统服务日志
    sudo journalctl -u uwsgi.service
    # 查看Django自定义日志(若配置)
    cat /home/ec2-user/cury_engine/django.log
    

    常见错误包括:数据库服务未启动、静态文件缺失、环境变量未加载、依赖包异常等。

  3. 临时开启DEBUG模式排查
    在Django的settings.py中临时设置DEBUG = True,重启uWSGI:

    sudo systemctl restart uwsgi
    

    此时访问错误页面会显示详细的Django报错栈,定位问题后立即关闭DEBUG模式。

  4. 检查依赖服务状态
    若应用依赖数据库,确认数据库服务是否启动:

    # 以PostgreSQL为例
    sudo systemctl status postgresql
    # 未启动则启动
    sudo systemctl start postgresql
    

长期调试与预防方法

  1. 完善Django日志配置
    在settings.py中添加详细日志配置,便于快速定位问题:

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'file': {
                'level': 'DEBUG',
                'class': 'logging.FileHandler',
                'filename': '/home/ec2-user/cury_engine/django.log',
            },
        },
        'loggers': {
            'django': {
                'handlers': ['file'],
                'level': 'DEBUG',
                'propagate': True,
            },
        },
    }
    
  2. 配置uWSGI自动管理Socket权限
    在uWSGI配置文件中添加以下参数,避免重启后权限问题:

    chmod-socket = 666
    # 或指定Socket所属用户组
    gid = nginx
    
  3. 设置服务启动顺序
    编辑uWSGI服务文件(如/etc/systemd/system/uwsgi.service),确保依赖服务就绪后再启动uWSGI:

    After=postgresql.service  # 根据数据库类型调整
    

    重新加载systemd配置:

    sudo systemctl daemon-reload
    
  4. 确保环境变量加载
    重启EC2后用户环境变量可能未加载,需在uWSGI服务文件中指定环境变量,或使用python-dotenv加载项目根目录的.env文件。

内容的提问来源于stack exchange,提问作者huni1023

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 03:45:48