ubuntu上的Django + Pipenv + Apache + mod_wsgi部署未加载模块

时间:2019-01-29 15:53:15

标签: django ubuntu virtualenv mod-wsgi pipenv

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

我正在使用python3和pipenv管理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 个答案:

答案 0 :(得分:0)

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

  1. 我注意到venv中的Python版本(3.7.2)与系统中安装的Python版本(3.6.2)不同。因此,我将Pipfile中所需的版本降级为3.6.7-现在它与系统python版本相同。
  2. 通过删除文件夹(.venv)然后运行pipenv --rm
  3. 来删除.venv
  4. 通过运行pipenv install重新创建venv。当然,这个新创建的venv具有降级的python版本
  5. 重新启动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))

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