【问题标题】:deploy django application with pipenv on apache在 apache 上使用 pipenv 部署 django 应用程序
【发布时间】:2018-11-01 01:08:36
【问题描述】:

我使用pipenv virtualenv 在Django 2.0 创建了一个python web 应用程序

现在,我必须将它托管在 apache 服务器上。我已经在服务器中安装了libapache2-mod-wsgi-py3python-setuptools

我的应用程序的结构是这样的

myapp_dir
 |- myapp
    |- settings
       |- __init__.py
       |- production.py
    |- __init__.py
    |- urls.py
    |- wsgi.py
 |- otherapp
 |- templates
 |- static_my_project
 |- manage.py
 |- Pipfile
 |- Pipfile.lock

应用的路径

/home/user/app.application.com/

我已将所有文件移动到该目录并通过在该目录中运行安装了来自Pipfile 的所有依赖项

pipenv install

这已经创建了一个virtualenv并安装了所有需要的模块和pipenv --venv给出的路径

# pipenv --venv
/home/user/.local/share/virtualenvs/app.application.com-IuTkL8w_

我的VirtualHost 配置看起来像

ServerName app.application.com
ServerAlias app.application.com

ErrorLog /home/user/error.log
CustomLog /home/user/custom.log combined

Alias /static /home/user/app.application.com/static_my_project
<Directory /home/user/app.application.com/static_my_project>
    Require all granted
</Directory>

<Directory /home/user/app.application.com/pricearbitrase>
    <Files wsgi.py>
        Require all granted
    </Files>
</Directory>

WSGIScriptAlias / /home/user/app.application.com/myapp/wsgi.py

VirtualInclude 包含

<IfModule mod_wsgi>

    WSGIPythonHome /home/user/.local/share/virtualenvs/app.application.com-IuTkL8w_

</IfModule>

但在访问http://app.application.com 时会给出Internal server error 并且生成的日志文件包含

[wsgi:error] [pid 60730] mod_wsgi (pid=60730): Target WSGI script '/home/amzitrage/app.amzitrage.com/pricearbitrase/wsgi.py' cannot be loaded as Python module.
[wsgi:error] [pid 60730] mod_wsgi (pid=60730): Exception occurred processing WSGI script '/home/amzitrage/app.amzitrage.com/pricearbitrase/wsgi.py'.
[wsgi:error] [pid 60730] Traceback (most recent call last):
[wsgi:error] [pid 60730]   File "/home/amzitrage/app.amzitrage.com/pricearbitrase/wsgi.py", line 12, in <module>
[wsgi:error] [pid 60730]     from django.core.wsgi import get_wsgi_application
[wsgi:error] [pid 60730] ImportError: No module named django.core.wsgi

编辑 2

app/wsgi.py 修改wsgi.py文件激活virtual environment

activate_this = '/home/user/.local/share/virtualenvs/app.application.com-IuTkL8w_/bin/activate_this.py'
exec(compile(open(activate_this,"rb").read(),activate_this, 'exec'), dict(__file__=activate_this))

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "application.settings")

application = get_wsgi_application()

另外,ls -l /path_to_pipenv_venv/bin 给了

【问题讨论】:

  • 删除 /bin 仍然是同样的错误
  • @Alasdair 删除 /bin 后是否需要重新运行服务器?
  • 您似乎还缺少WSGIPythonPath(参见Django docs 中的示例),但这会导致加载myapp 而不是django 时出现问题。
  • 如果我设置WSGIPythonPath 这个配置的路径是什么

标签: python django pipenv django-deployment


【解决方案1】:

首先,为了方便在 apache 文件中使用,我创建了指向 pipenv virtualenv 的符号链接到 myapp_dir/venv。 我遇到的主要问题是权限。

如果你的 virtualenv 路径是/home/user/.local/share/virtualenvs/app.application.com-IuTkL8w_,那么试试这个:

sudo -u www-data cat /home/user/.local/share/virtualenvs/app.application.com-IuTkL8w_/bin/activate_this.py`

www-data 是您的 apache 用户。

如果您的权限被拒绝,这可能是同样的问题。 只需尝试更改 apache 进程可以访问它们的 ~/.local~/.local/share 的权限。

请注意,这是一个开发设置,在生产中我不会使用 pipenv。我只会生成 requirements.txt 并设置一个普通的 virtualenv 或使用 gunicorn 或类似的东西。

【讨论】:

    猜你喜欢
    • 2012-12-20
    • 2010-10-04
    • 2017-08-11
    • 2012-07-15
    • 2017-10-21
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多