使用 AWS Elasticstalk 部署 Django 应用程序

Posted

技术标签:

【中文标题】使用 AWS Elasticstalk 部署 Django 应用程序【英文标题】:Deploy Django App using AWS Elasticstalk 【发布时间】:2016-04-20 22:21:50 【问题描述】:

我正在尝试使用 Elastic Beanstalks 在 AWS 上部署我的 Django 项目。我正在关注此链接进行部署:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-django.html

文件夹结构:

Project
├── logs.txt
├── requirements.txt
└── project
    ├── db.sqlite3
    ├── manage.py
    ├── miscellaneousConfig
    ├── README.md
    ├── static
    │   ├── css
    │   ├── img
    │   ├── js
    ├── abc1
    │   ├── admin.py
    │   ├── __init__.py
    │   ├── migrations
    │   │   └── __init__.py
    │   ├── models.py
    │   ├── templates
    │   │   ├── file1.html
    │   │   └── file2.html
    │   ├── tests.py
    │   ├── urls.py
    │   └── views.py
    └── abc
        ├── functions.py
        ├── __init__.py
        ├── settings.py
        ├── urls.py
        ├── views.py
        └── wsgi.py

文件:.ebextensions/01-project.config[更新]:

option_settings:
  "aws:elasticbeanstalk:application:environment":
    DJANGO_SETTINGS_MODULE: "abc.settings"
    PYTHONPATH: "./project:$PYTHONPATH"
  "aws:elasticbeanstalk:container:python":
    WSGIPath: "project/abc/wsgi.py"

文件:.elasticbeanstalk/config.yml

branch-defaults:
  default:
    environment: project-dev
    group_suffix: null
global:
  application_name: project
  default_ec2_keyname: project_ec2_key
  default_platform: Python 3.4
  default_region: us-east-1
  profile: eb-cli
  sc: null

文件wsgi.py:

import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "abc.settings")

application = get_wsgi_application()

命令:

1) 'eb 创建'

INFO:成功启动环境:

2) 电子打开

内部服务器错误(在浏览器上)

日志:(通过运行:eb logs > logs.txt)

-------------------------------------
/var/log/httpd/error_log
-------------------------------------
[remote xx.xx.xx.xx:0] ImportError: No module named 'abc'
[remote xx.xx.xx.xx:0] mod_wsgi (pid=2857): Target WSGI script '/opt/python/current/app/project/abc/wsgi.py' cannot be loaded as Python module.
[remote xx.xx.xx.xx:0] mod_wsgi (pid=2857): Exception occurred processing WSGI script '/opt/python/current/app/project/abc/wsgi.py'.
[remote xx.x.xx.xx:0] Traceback (most recent call last):
[remote xx.xx.xx.xx:0]   File "/opt/python/current/app/project/abc/wsgi.py", line 16, in <module>
[remote xx.xx.xx.xx:0]     application = get_wsgi_application()
[remote xx.xx.xx.xx:0]   File "/opt/python/run/venv/lib/python3.4/site-packages/django/core/wsgi.py", line 13, in get_wsgi_application
[remote xx.xx.xx.xx:0]     django.setup()
[remote xx.xx.xx.xx:0]   File "/opt/python/run/venv/lib/python3.4/site-packages/django/__init__.py", line 17, in setup
[remote xx.xx.xx.xx:0]     configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
[remote xx.xx.xx.xx:0]   File "/opt/python/run/venv/lib/python3.4/site-packages/django/conf/__init__.py", line 55, in __getattr__
[remote xx.xx.xx.xx:0]     self._setup(name)
[remote xx.xx.xx.xx:0]   File "/opt/python/run/venv/lib/python3.4/site-packages/django/conf/__init__.py", line 43, in _setup
[remote xx.xx.xx.xx:0]     self._wrapped = Settings(settings_module)

有人可以建议如何解决这个问题吗?

谢谢,

【问题讨论】:

@Baterson 请提供您的意见。自 3 天以来一直坚持这一点。 你的reqiurements.txt是什么样的? 【参考方案1】:

你试过这个吗

import os, sys    
sys.path.append('path/to/abc')

from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "abc.settings")

application = get_wsgi_application()

更改 ebextensions/01-project.config:

option_settings:
"aws:elasticbeanstalk:application:environment": 
DJANGO_SETTINGS_MODULE: "abc.settings" 
PYTHONPATH: "./project:$PYTHONPATH"  
"aws:elasticbeanstalk:container:python": 
WSGIPath: "project/abc/wsgi.py" 

我认为最好将完整路径提供为“PYTHONPATH”

【讨论】:

在文件中添加了以下行: sys.path.append(os.path.dirname(os.path.abspath(file)) + '/..' ) sys.path.append(os.path.dirname(os.path.abspath(file)) + '/../project') 输出仍然没有变化。是否需要“eb 部署”以使更改得到反映?如果是,那么我收到以下错误: ImportError: 没有名为“abc”的模块。 .ebextensions/01-project.config 中的 container_command 01_migrate 失败。有关更多详细信息,请使用控制台或 EB CLI 检查 /var/log/eb-activity.log。 你能告诉我如何给出 PYTHONPATH 变量的完整路径吗? (目前,代码位于我的本地路径中) cd 进入项目文件夹并运行pwd,你会得到路径【参考方案2】:

刚刚改过

PYTHONPATH: "./project/abc:$PYTHONPATH"

PYTHONPATH: "./project:$PYTHONPATH"

在 .ebextensions/01-project.config 文件中,它起作用了。 :)

【讨论】:

【参考方案3】:

确保 INSTALLED_APPS = "abc" 存在于您的 settings.py 文件中

【讨论】:

INSTALLED_APPS = ('django.contrib.staticfiles', 'project', ) 你的文件夹结构是什么? abc 在哪里? 在问题中添加了文件夹结构。 尝试将 abc 添加到 INSTALLED APPS 列表中 在 ebextensions->config 文件中将 .project/abc 更改为 ./project 并且它起作用了。谢谢。

以上是关于使用 AWS Elasticstalk 部署 Django 应用程序的主要内容,如果未能解决你的问题,请参考以下文章