在AWS Elastic Beanstalk上设置Django:找不到WSGIPath

29

我已经试了几天时间在亚马逊网络服务的弹性 Beanstalk 下安装 Django。 我认为我遇到的问题是这个:

ERROR - Your WSGIPath refers to a file that does not exist.

我按照这里的教程操作,一切进行得很顺利,直到第6步结束,但是我无论如何都无法在页面上显示除了第5步#2中的通用Elastic Beanstalk页面之外的任何内容。当我运行时:

./manage.py runserver

在我的本地机器上,一切都按照预期工作,但是我无法部署该页面。我首先尝试了一个我自己编写的小型Django网站。它没有起作用,所以我删除了我所做的一切然后再试一次,但是还是不行,于是我删除了所有内容,然后用全新的Django安装再试了一次。我尝试了很多次微调小细节,但我认为我遗漏了一些重要的东西。

我按照此教程中所述添加了一个python.config文件。

这是我的文件结构:

-.git/
-.mysite/
    -myapp/
        -__init__.py
        -models.py
        -tests.py
        -views.py
    -mysite/
        -__init__.py
        -settings.py
        -urls.py
        -wsgi.py
    -.ebextensions/
        -python.config
    -manage.py
    -mysite.db
    -requirements.txt

从我的settings.py文件中:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'mysite.db',
        'USER': '',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
    }
}

这是 python.config:

container_commands:   01_syncdb:    
    command: "django-admin.py syncdb --noinput"
    leader_only: true

option_settings:
    - namespace: aws:elasticbeanstalk:container:python
      option_name: WSGIPath
      value: mysite/wsgi.py
    - option_name: DJANGO_SETTINGS_MODULE
      value: mysite.settings
    - option_name: AWS_SECRET_KEY
      value: <This is my secret key>
    - option_name: AWS_ACCESS_KEY_ID
      value: <This is my access key>

我需要在其他地方定义我的WSGI路径吗?有没有通过AWS控制台进行此操作的方法?我应该直接跳过EB,直接使用EC2吗?


6
这个问题已经在这里详细解决了。我之前把所有代码都存储在一个目录中,然后压缩(并上传)整个目录。我应该做的是压缩该目录中所有相关文件而不是目录本身,这样解压后所有文件将在网站根目录中。希望这能帮助遇到同样问题的人。我认为我使用GUI和git上传时遇到了相同的问题。 - Xephryous
2
你不应该编辑问题,而是添加自己的答案并接受它。 - bikeshedder
请注意,未提交的更改不会被部署,因此您应该将所有更改提交到“.ebextensions”文件夹中,以便使用EB CLI进行部署。 - nisevi
6个回答

14

来自 https://forums.aws.amazon.com/thread.jspa?messageID=396656&#396656

".ebextensions" 目录必须位于您的应用程序的根目录中,但从日志输出来看,该目录实际上位于 "mysite/.ebextensions" 目录中。例如,按照文档中的 Django 教程操作后,当您运行 "git aws.push" 时,您的根目录将如下所示:

.
├── .ebextensions
│   └── python.config
├── .elasticbeanstalk
│   ├── config
├── .git
├── .gitignore
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── requirements.txt

不要这样:

.
└── mysite
    ├── .ebextensions
    ├── .elasticbeanstalk
    ├── .git
    ├── .gitignore
    ├── manage.py
    ├── mysite
    └── requirements.txt

1
我们遇到了 psycopg2 未安装的问题。将以下行添加到我们的 .ebextensions/01-app.config 文件中即可解决: packages: yum: postgresql93-devel: [] - Gal Bracha

8
在你的应用程序根目录中找到.elasticbeanstalk/optionsettings.your-app-name。搜索WSGIPath并确保它是你想要的路径。默认情况下,它似乎是application.py

相对于什么路径?此外,eb脚本似乎一直在覆盖我输入的值。 - Mikhail

3
我遇到了同样的问题(“Your WSGIPath refers to a file that does not exist”),最终找到了解决方法:
问题:我直接从GitHub下载项目的捆绑包(“Download Zip”),可能结构不正确。
解决方案:我使用压缩命令正确地压缩文件,不包含主文件夹。(参见http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.deployment.source.html)。
注意:起初,我搜索方向错误,因为EB还显示了这个消息:“Error occurred during build: Command 01_migrate failed.”。所以我认为文件,包括*.config,已经被正确定位。

3
解决方案:使用EBCLI
打开eb config命令。 对于我来说,它显示了WSGIPath: application.py。 现在将其更改为:
WSGIPath: my_app/wsgi.py

保存并部署。

请参考此链接:https://dev59.com/nF0Z5IYBdhLWcg3wtSA8 - Arun K
这是唯一对我有效的解决方案,即使使用了他们的文档示例:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-django.html#python-django-configure-for-eb如果您正在使用 Amazon Linux AMI Python 平台版本(Amazon Linux 2 之前的版本),请将 WSGIPath 的值替换为 ebdjango/wsgi.py。示例中的值适用于 Gunicorn WSGI 服务器,在 Amazon Linux AMI 平台版本上不受支持,这很令人困惑,因为我正在使用当前的 Amazon Linux 2。这是他们文档中的错误吗? - JohnZaj

2

好的,我试过了很多方法,以下是对我有效的方法。您需要运行eb update以更新环境。

因此,请确保.elasticbeanstalk/optionsettings.whatever-env中的WSGIPath设置为所需内容,并确保.ebextensions/whatever.config包含以下内容:

option_settings:
  - namespace: aws:elasticbeanstalk:container:python
    option_name: WSGIPath
    value: whatever/wsgi.py

然后运行eb update,它应该可以工作。记得要设置别名以确保你的eb命令实际上可以工作。例如:

alias eb="python2.7 ../AWS-ElasticBeanstalk-CLI-2.6.3/eb/linux/python2.7/eb"

3
我相信最近eb update已经改成了eb deploy。对于寻找此类信息的人来说,这可能很有用,尤其是在2016年 :) - Vladimir

2
我曾经遇到了同样的问题,按照AWS文档一步步操作后仍然无法解决。我采用了EB CLI逐步初始化应用程序,并避免使用AWS文档指定的命令(~/ebdjango$ eb init -p python2.7 django-tutorial),同样逐步创建环境。我在EB CLI中执行的步骤如下:
  1. 初始化应用程序
    1. eb init
    2. 选择默认区域
    3. 输入应用程序名称(按Enter键使用默认值)
    4. 确认我正在使用Python
    5. 选择与本地环境兼容的Python版本
    6. 设置SSH
  2. 创建环境
    1. eb create
    2. 输入环境名称(按Enter键使用默认值)
    3. 输入DNS CNAME前缀(按Enter键使用默认值)
    4. 选择负载均衡器类型(我选择了经典模式,输入1)

创建环境后,我使用eb config打开EB的配置文件,确认我的WSGI路径是否正确:

aws:elasticbeanstalk:container:python:
  NumProcesses: '1'
  NumThreads: '15'
  StaticFiles: /static/=static/
  WSGIPath: path/to/wsgi.py

如果进行了任何更改,请确保保存文件并确认一切都已完整,通过在终端中输入eb open来使用之前指定的域名打开浏览器窗口。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接