EC2上Django+Nginx+uWSGI重启后出现500内部服务器错误求助
我在EC2上部署了基于Django的Web应用,搭配Nginx和uWSGI。开发React前端时,向服务器公网IPv4发送HTTP请求,初期响应正常,数据可正常传输至http://localhost:3000。但重启EC2实例后,Nginx返回500 (Internal Server Error),具体信息如下:
日志信息
/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" "-"
/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 nginxsudo systemctl restart nginx.servicesudo systemctl restart uwsgi(Django服务器通过此命令自动启动)sudo systemctl restart uwsgi.service
额外测试
- Postman请求返回同样的500错误
- EC2实例终端内curl请求也返回500错误
需求:恢复服务器正常运行,并掌握此类错误的调试方法。
紧急恢复步骤
修复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定位Django/uWSGI层面错误
Nginx error.log为空,说明错误出在后端服务。检查以下日志:# 查看uWSGI系统服务日志 sudo journalctl -u uwsgi.service # 查看Django自定义日志(若配置) cat /home/ec2-user/cury_engine/django.log常见错误包括:数据库服务未启动、静态文件缺失、环境变量未加载、依赖包异常等。
临时开启DEBUG模式排查
在Django的settings.py中临时设置DEBUG = True,重启uWSGI:sudo systemctl restart uwsgi此时访问错误页面会显示详细的Django报错栈,定位问题后立即关闭DEBUG模式。
检查依赖服务状态
若应用依赖数据库,确认数据库服务是否启动:# 以PostgreSQL为例 sudo systemctl status postgresql # 未启动则启动 sudo systemctl start postgresql
长期调试与预防方法
完善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, }, }, }配置uWSGI自动管理Socket权限
在uWSGI配置文件中添加以下参数,避免重启后权限问题:chmod-socket = 666 # 或指定Socket所属用户组 gid = nginx设置服务启动顺序
编辑uWSGI服务文件(如/etc/systemd/system/uwsgi.service),确保依赖服务就绪后再启动uWSGI:After=postgresql.service # 根据数据库类型调整重新加载systemd配置:
sudo systemctl daemon-reload确保环境变量加载
重启EC2后用户环境变量可能未加载,需在uWSGI服务文件中指定环境变量,或使用python-dotenv加载项目根目录的.env文件。
内容的提问来源于stack exchange,提问作者huni1023

