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

Posted

技术标签:

【中文标题】在 AWS Elastic Beanstalk 上设置 Django:未找到 WSGIPath【英文标题】:Setting up Django on AWS Elastic Beanstalk: WSGIPath not found 【发布时间】:2012-10-17 14:43:15 【问题描述】:

我几天来一直在尝试在 Amazon Web Services 的 Elastic Beanstalk 下设置 Django。我认为我遇到的问题是这个:

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

我按照教程 here 进行操作,直到第 6 步结束前一切顺利,但除了第 5 步 #2 中的通用 Elastic Beanstalk 页面外,我这辈子都无法显示任何内容。当我跑步时

./manage.py runserver

在我的本地计算机上,一切正常,但我无法部署该页面。我首先尝试使用我自己编写的一个小型 Django 站点。它没有用,所以我删除了我所做的所有内容并再次尝试,但没有成功,所以我删除了所有内容并再次尝试安装新的 django。我试过很多次摆弄小东西,但我想我错过了一些重要的东西。

我添加了一个 python.config 文件,如this tutorial 中所述。

这是我的文件结构:

-.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>

我需要在其他地方定义我的 WSGIPath 吗?有没有办法通过 AWS 控制台做到这一点?我应该完全跳过 EB 直接使用 EC2 吗?

【问题讨论】:

这个问题已经解决,详细here。我将所有代码存储在一个目录中,然后压缩(并上传)了整个目录。我应该做的是压缩该目录中的所有相关文件而不是目录本身,因此解压缩时文件将全部位于站点的根目录中。希望这可以帮助其他有同样问题的人。我想我在通过 GUI 和 git 上传时遇到了同样的问题。 您不应编辑问题,而应添加自己的答案并接受。 请注意不会部署未提交的更改,因此您应该提交对“.ebextensions”文件夹的所有更改,以便使用 EB CLI 进行部署。 【参考方案1】:

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

“.ebextensions”目录必须位于应用程序的根目录中,但从日志输出来看,该目录位于“mysite/.ebextensions”目录中。因此,例如,在运行“git aws.push”时遵循文档中的 django 教程后,您的根目录将如下所示:

.
├── .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

【讨论】:

就是这个!实际上,我在评论 here 中回答了我自己的问题。我认为我当时没有足够的声誉来回复或其他什么。总之,问题解决了。 我们遇到了未安装 psycopg2 的问题。将这些行添加到我们的 .ebextensions/01-app.config 文件中修复了它: packages: yum: postgresql93-devel: []【参考方案2】:

在您应用的根目录中找到.elasticbeanstalk/optionsettings.your-app-name。搜索 WSGIPath 并确保它是您想要的路径。看起来它默认为application.py

【讨论】:

相对路径是什么?此外,eb 脚本似乎一直在覆盖我输入的值。【参考方案3】:

我也遇到了同样的问题(“你的WSGIPath引用了一个不存在的文件”),终于找到了解决办法:

问题:我直接从 GitHub 下载项目包(“下载 Zip”),可能结构不正确。 解决方案:我使用 Compress 命令正确压缩文件,没有主文件夹。 (参见http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.deployment.source.html)。

注意:起初,我搜索的方向错误,因为 EB 也显示此消息:在构建期间发生错误:命令 01_migrate 失败。。所以我认为包括 *.config 在内的文件位置正确。

【讨论】:

【参考方案4】:

解决方案:使用 EBCLI

打开eb config 对我来说,它显示了WSGIPath: application.py 现在改成

WSGIPath: my_app/wsgi.py

保存并部署。

【讨论】:

参考这个***.com/questions/31169260/… 这是唯一对我有用的解决方案,即使使用他们的文档示例:docs.aws.amazon.com/elasticbeanstalk/latest/dg/…“如果您使用的是 Amazon Linux AMI Python 平台版本(在 Amazon Linux 2 之前),请将值替换为带有 ebdjango/wsgi.py 的 WSGIPath。示例中的值适用于 Gunicorn WSGI 服务器,Amazon Linux AMI 平台版本不支持该服务器。 【参考方案5】:

好的,这就是在尝试了一百万件事后对我有用的方法。您必须运行 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"

【讨论】:

我相信eb update 最近已更改为eb deploy。这对于在 2016 年寻找此类信息的人们可能很有用 :)【参考方案6】:

在关注 AWS 的文档后,我遇到了同样的问题。我为避免它所做的是通过 EB CLI 逐步初始化应用程序,而不使用 AWS 文档指示的命令(~/ebdjango$ eb init -p python2.7 django-tutorial),并逐步创建环境也是。我在 EB CLI 中采取的步骤如下:

    初始化应用程序
      eb init 选择默认区域 输入应用程序名称(按回车键使用默认值) 确认我正在使用 Python 所选 Python 版本与我的本地环境兼容 设置 SSH
    创建环境
      eb create 输入环境名称(按回车默认使用) 输入 DNS CNAME 前缀(按回车默认使用) 选择负载均衡器类型(我通过输入 1 选择了经典)

创建环境后,我使用eb config 打开 EB 的配置文件以确认我的 WSGI 的路径应该是什么:

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

如果进行了任何更改,请确保保存文件并通过在终端中输入 eb open 以使用前面步骤中指定的域名打开浏览器窗口来确认所有内容均已完成。

【讨论】:

以上是关于在 AWS Elastic Beanstalk 上设置 Django:未找到 WSGIPath的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS Elastic Beanstalk 上扩展 Magento

如何在 AWS Elastic Beanstalk 上设置 HTTPS

如何在 AWS Elastic Beanstalk 上设置 HTTPS

在 AWS Elastic Beanstalk 上运行节点和反应

如何使用 aws cli 在 Elastic Beanstalk 上上传和部署?

在aws elastic beanstalk上上传文件?