AWS Elastic Beanstalk部署Django遇502 提示无application模块
报错ModuleNotFoundError: No module named 'application'会直接导致Gunicorn worker进程启动失败,Nginx反向代理没有可用的后端服务就返回502错误,最终触发环境状态降级。
这个问题不是wsgi.py的代码逻辑有问题,本质是Amazon Linux 2版本Elastic Beanstalk Python平台的默认入口加载逻辑,和旧版平台存在适配差异:
平台默认启动Gunicorn时,会优先尝试加载项目根目录下application.py文件中的WSGI实例,不会自动将项目代码目录加入Python模块搜索路径,也不能正确解析todo.wsgi这类点分格式的WSGI路径配置,最终因为找不到名为application的模块导致启动崩溃。
校验项目目录结构
确认部署包内的文件层级符合要求,不要出现文件位置错位:项目根目录(部署时上传的最外层文件夹) ├── manage.py ├── requirements.txt ├── django.config └── todo/ # Django项目配置目录 ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py # 现有的wsgi.py文件必须存放在这个目录下只要
wsgi.py没有放在todo子目录里,对应的模块路径就肯定匹配失败。修正
django.config的WSGI配置写法
旧版平台下写WSGIPath: todo.wsgi可以正常工作,但在Amazon Linux 2平台,需要明确指定要加载的callable对象,调整后的配置内容:option_settings: aws:elasticbeanstalk:container:python: WSGIPath: todo.wsgi:application这种带冒号的写法会直接告诉Gunicorn,加载
todo/wsgi.py文件里名为application的实例作为WSGI入口,从根源上避免Gunicorn默认去找根目录下不存在的application.py文件。确认部署包没有遗漏必要文件
检查.gitignore或.ebignore的规则,不要把todo目录下的wsgi.py、__init__.py这类基础文件排除在部署包外。可以在本地执行eb deploy --dry-run,核对打包的文件列表,确认todo/wsgi.py确实在待上传的文件里。重新部署验证
执行eb deploy上传修改后的配置,等环境状态从“Degraded”恢复为“Ok”之后,再执行eb open访问页面。
如果调整配置后仍然报同样的错,可以通过eb ssh登录到运行的EC2实例,进入代码存放目录/var/app/current/,执行命令:python -c "from todo.wsgi import application"
如果这个命令执行报导入错误,就直接说明是文件缺失或者路径写错;如果命令执行正常,就检查环境变量里的Python路径配置有没有问题。
内容的提问来源于stack exchange,提问作者NatalieLes

