Django + pipelinenv + Apache + mod_wsgi 在 ubuntu 上部署不加载模块

标签 django ubuntu virtualenv mod-wsgi pipenv

我正在尝试使用 apache 和 mod_wsgi 在 Ubuntu 服务器上部署 django 项目。

我使用 python3 和 pipelinev 来管理 venv。

环境变量PIPENV_VENV_IN_PROJECT=True,以便pipenv创建的venv位于项目文件夹内。

这是项目结构:

/srv/project
|
|-.venv # venv creted by pipenv
| |-bin
| |-...
|
|-Pipfile
|-Pipfile.lock
|
|-django_app
  |
  |-manage.py
  |-...
  |
  |-django_app
    |
    |-settings.py
    |-...
    |-wsgi.py

Apache VirtualHost 配置(/etc/apache2/sites-available/000-default.conf):

<VirtualHost *:80>
    <Directory /srv/project/django_app/django_app>
            <Files wsgi.py>
                    Require all granted
            </Files>
    </Directory>

    WSGIDaemonProcess django_app python-home=/srv/project/.venv python-path=/srv/project/django_app
    WSGIProcessGroup django_app
    WSGIScriptAlias / /srv/project/django_app/django_app/wsgi.py

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

Apache 工作正常并正确响应,直到我添加配置的 WSGI 部分。然后它停止响应(所有请求都处于待处理状态)。

同样的错误消息在 apache 错误日志 (/var/log/apache2/error.log) 中不断重复 - 即使没有请求发送到服务器:

Current thread 0x00007f300f446bc0 (most recent call first):
[Tue Jan 29 15:43:58.899091 2019] [core:notice] [pid 16407:tid 139844391300032] AH00051: child pid 22818 exit signal Aborted (6), possible coredump in /etc/apache2
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ModuleNotFoundError: No module named 'encodings'

该进程似乎无法加载模块,可能是由于 venv 配置不正确(没有真正使用 venv?)。但我尝试过的没有任何帮助。

我也将此代码添加到 wsgi.py,但没有帮助:

python_home = '/srv/project/.venv'

activate_this = python_home + '/bin/activate_this.py'
exec(open(activate_this).read(), dict(__file__=activate_this))

想法?谢谢!

最佳答案

问题已解决。我已经执行了几个步骤,但我不确定其中哪一个是至关重要的:

  1. 我注意到 venv 中的 Python 版本 (3.7.2) 与系统中安装的 Python 版本 (3.6.2) 不同。所以我将 Pipfile 中所需的版本降级到 3.6.7 - 现在它与系统 python 版本相同。
  2. 通过删除文件夹 (.venv) 然后运行 ​​pipenv --rm 来删除 .venv
  3. 通过运行 pipenv install 再次创建 venv。当然,这个新创建的venv是降级的python版本
  4. 重新启动 apache...瞧!

此外,wsgi.py 中的添加是不必要的,并且无助于解决问题:

python_home = '/srv/project/.venv'

activate_this = python_home + '/bin/activate_this.py'
exec(open(activate_this).read(), dict(__file__=activate_this))

希望这会对某人有所帮助。

关于Django + pipelinenv + Apache + mod_wsgi 在 ubuntu 上部署不加载模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54424856/

相关文章:

django - 如何使用 django 将表单数据从一个页面发送到另一个页面

django - 如何在 django 的管理界面中覆盖 help_text

linux - Linux中如何定义常量

linux - 在 ubuntu14 中使用 apt -get 安装期间获得 root 权限

Python在创建venv时设置环境变量

python - 使用 PyCharm 分析 Django

python - Django 网页上的两个 View

Mongodb 身份验证不适用于配置文件

python - 使用 VirtualEnv 集中安装 Django

python - pip 将新的 Python 包安装到所有现有的 virtualenvs