部署在AWS Elastic Beanstalk的Django项目HTTPS访问报错求助
问题到底出在哪?
这个错误的核心很明确:当你开启HTTPS后,Apache的HTTPS虚拟主机配置没跟上HTTP的节奏。Elastic Beanstalk默认禁用了mod_wsgi的嵌入式模式,要求用守护进程模式跑Django,但你的HTTPS配置里没设置这个,导致访问HTTPS时Apache试图用被禁用的嵌入式模式加载WSGI脚本,直接触发报错。
为啥HTTP正常?因为HTTP的虚拟主机配置(就是wsgi.conf)已经正确设置了守护进程模式,HTTPS那边没同步,自然就出问题了。
一步步解决:调整wsgi.conf并同步HTTPS配置
别慌,按下面的步骤来就能搞定:
先登录到你的EB实例(用EB CLI的
eb ssh命令,或者AWS控制台的实例连接都可以)。打开
/opt/httpd/conf.d/wsgi.conf编辑:sudo nano /opt/httpd/conf.d/wsgi.conf确保文件里有这些关键配置(没有就加上,已有就核对调整):
# 配置WSGI守护进程,指定Python路径、虚拟环境、运行用户等 WSGIDaemonProcess wsgi process-group=wsgi application-group=%{GLOBAL} \ python-path=/opt/python/current/app \ home=/opt/python/run/venv \ user=wsgi group=wsgi \ threads=15 maximum-requests=10000 # 指定所有WSGI请求用这个守护进程组 WSGIProcessGroup wsgi # 把根路径映射到你的Django WSGI脚本,同时指定进程组 WSGIScriptAlias / /opt/python/current/app/connectshops/wsgi.py process-group=wsgi application-group=%{GLOBAL} # 静态文件的配置(如果你的项目用了静态文件,这部分不能少) Alias /static/ /opt/python/current/app/static/ <Directory /opt/python/current/app/static/> Require all granted </Directory> # 确保WSGI脚本所在目录的权限正确 <Directory /opt/python/current/app/connectshops/> <Files wsgi.py> Require all granted </Files> </Directory>重点就是
WSGIDaemonProcess和WSGIProcessGroup这两行,它们强制Apache用守护进程模式运行你的Django应用,避开被禁用的嵌入式模式。接下来检查
/opt/httpd/conf.d/ssl.conf,在它的<VirtualHost _default_:443>块里加上一行:WSGIProcessGroup wsgi这行的作用是让HTTPS请求也使用上面配置好的守护进程组,不会自己瞎用嵌入式模式。
保存所有修改后,重启Apache生效:
sudo service httpd restart
重要提醒:别直接改实例配置!
直接在实例上改配置文件的话,下次EB环境更新或者重新部署,这些修改会被覆盖得一干二净。正确的姿势是用.ebextensions来持久化配置:
在你的Django项目根目录创建.ebextensions/httpd/conf.d/wsgi.conf文件,把上面的Apache配置内容放进去,这样每次部署时EB都会自动把这个配置应用到实例上,一劳永逸。
另外别忘了确认你的EB环境已经正确配置了SSL证书:通过AWS Certificate Manager上传证书,然后在EB环境的负载均衡器设置里开启HTTPS监听,不然就算配置对了,HTTPS也没法正常工作。
内容的提问来源于stack exchange,提问作者Jay P.




