Elastic Beanstalk部署Django报502及wsgi模块找不到错误
502 Bad Gateway的直接原因是Gunicorn服务启动失败,8000端口无进程监听,Nginx转发请求时被拒绝。日志中ModuleNotFoundError: No module named 'mysite.wsgi'是Gunicorn启动失败的核心原因,由部署包结构错误、平台配置不兼容、参数冲突共同导致。
修正部署包结构
EB要求.ebextensions目录必须位于部署压缩包的最外层根目录,不能嵌套。根据你给出的本地路径,如果打包时选中的是repos/mydjangoproject整个目录,部署到服务器后文件结构为:/var/app/current/ └── mysite/ ├── .ebextensions/ ├── mysite/ │ ├── wsgi.py │ └── settings.py └── manage.py这种情况下你设置的
PYTHONPATH=/var/app/current下无法找到mysite.wsgi模块,wsgi.py实际路径为/var/app/current/mysite/mysite/wsgi.py,不在Python搜索路径内。
正确打包方式:进入repos/mydjangoproject/mysite目录(即包含manage.py和内层mysite项目包的层级),选中该目录下所有文件(包含.ebextensions、manage.py、内层mysite文件夹)打包为zip,确保解压后.ebextensions直接位于根目录,和内层mysite文件夹同级。适配Amazon Linux 2平台配置规则
你使用的Python 3.8 running on 64bit Amazon Linux 2/3.3.14平台不再支持老版本Amazon Linux 1的aws:elasticbeanstalk:container:python命名空间配置,你写在django.config里的WSGIPath参数不会生效。AL2平台默认使用Gunicorn,优先读取根目录下的Procfile配置启动服务。
首先修正.ebextensions/django.config内容,修正错误的DJANGO_SETTINGS_MODULE值,删除不生效的WSGIPath配置:aws:elasticbeanstalk:application:environment: DJANGO_SETTINGS_MODULE: "mysite.settings" PYTHONPATH: "/var/app/current:$PYTHONPATH"然后在项目根目录(和.ebextensions、manage.py同级)新建无后缀名的
Procfile文件,写入启动命令:web: gunicorn mysite.wsgi:application校验现有配置正确性
你当前的wsgi.py中DJANGO_SETTINGS_MODULE配置为mysite.settings,和环境变量值一致,这部分无需修改,只需确认内层mysite目录下确实存在settings.py文件,没有放错路径。验证修复结果
重新部署后如果仍有问题,可以通过SSH连接到EB实例,执行以下命令手动启动Gunicorn验证模块路径是否正确:cd /var/app/current source /var/app/venv/*/bin/activate gunicorn mysite.wsgi:application如果手动启动无报错,说明配置已经正确,重启服务即可恢复正常。另外确认打包时没有将虚拟环境目录、.git目录、__pycache__等冗余文件打入压缩包,避免文件结构异常。
内容的提问来源于stack exchange,提问作者user2154589

