AWS Elastic Beanstalk Python 3.6 平台上的 mod_wsgi“调用‘site.addsitedir()’失败”

Dav*_*Eyk 6 mod-wsgi amazon-web-services elastic-beanstalk

在AWS Elastic Beanstalk上,在“64bit Amazon Linux 2017.09 v2.6.0 running Python 3.6”平台上,好像是mod_wsgi配置有问题。我在/etc/httpd/conf.d/wsgi.conf

WSGIDaemonProcess wsgi processes=1 threads=15 display-name=%{GROUP} \
  python-home=/opt/python/run/venv/ \
  python-path=/opt/python/current/app:/opt/python/run/venv/lib64/python3.6/site-packages:/opt/python/run/venv/lib/python3.6/site-packages user=wsgi group=wsgi \
  home=/opt/python/current/app
Run Code Online (Sandbox Code Playgroud)

但是,我得到了这个/var/log/httpd/error_log

[Mon Nov 20 19:54:44.565076 2017] [:error] [pid 32080] mod_wsgi (pid=32080): Call to 'site.addsitedir()' failed for '(null)', stopping.
[Mon Nov 20 19:54:44.565444 2017] [:error] [pid 32080] mod_wsgi (pid=32080): Call to 'site.addsitedir()' failed for '/opt/python/run/venv/lib64/python3.6/site-packages:/opt/python/run/venv/lib/python3.6/site-packages'.
Run Code Online (Sandbox Code Playgroud)

尝试访问该站点会导致此错误:

[Mon Nov 20 21:21:21.304605 2017] [:error] [pid 2886] [remote 71.236.217.102:39802] ModuleNotFoundError: No module named 'myappname'
Run Code Online (Sandbox Code Playgroud)

如果我将WSGIDaemonProcess指令更改为以下内容(从而删除以冒号分隔的路径):

WSGIDaemonProcess wsgi processes=1 threads=15 display-name=%{GROUP} \
  python-home=/opt/python/run/venv/ \
  python-path=/opt/python/current/app user=wsgi group=wsgi \
  home=/opt/python/current/app
Run Code Online (Sandbox Code Playgroud)

然后我不再得到ModuleNotFoundError.

这似乎与https://github.com/GrahamDumpleton/mod_wsgi/issues/92中概述的错误相同,该错误已在mod_wsgi4.4.15中修复。但是,AMI 预装了mod24_wsgi-python36.x86_64==3.5-1.24.amzn1.

如果我尝试WSGIDaemonProces使用 .ebextensions 脚本修复s,则它不会被内置部署挂钩之一修复,无论如何,默认情况下烘焙的默认值似乎已被破坏。我到底该如何解决这个问题?

小智 6

我今天遇到了同样的问题(“64bit Amazon Linux 2017.09 v2.6.0 running Python 3.6”,mod_wsgi 错误)。

我有一个解决方法,但我不确定它是一个合适的还是最直接的解决方案。

简而言之

安装最新的mod_wsgi.

更长的解释...

手动检查它是否有效

首先,我手动执行以下操作以检查它是否有效,然后我编写了它的脚本,这样它就不会在以后的部署中被破坏。

安装mod_wsgi将需要apxs,因此请转到实例并找到包:

eb ssh
yum provides apxs
Run Code Online (Sandbox Code Playgroud)

就我而言,有 3 个。最老的在 ssh 控制台上工作,所以我添加到.ebextensions/01_packages.config

packages:
  yum:
    ...
    httpd24-devel-2.4.27-3.75.amzn1.x86_64: []
Run Code Online (Sandbox Code Playgroud)

然后在 ssh 中,我按照这个顺序来测试手动构建的版本 od mod_wsgi(我无法让任何yum包工作 - 尽管它可能可以完成)。

sudo -s  # become root
cd /tmp
wget -q "https://github.com/GrahamDumpleton/mod_wsgi/archive/4.4.21.tar.gz"
tar -xzf '4.4.21.tar.gz'
cd ./mod_wsgi-4.4.21
./configure --with-python=/usr/bin/python3.6
make
make install
Run Code Online (Sandbox Code Playgroud)

假设到目前为止一切正常,重新启动 Apache:

service httpd restart
Run Code Online (Sandbox Code Playgroud)

然后往里看,var/log/httpd/error_log希望你会看到:

... [pid 2088] AH00163: Apache/2.4.27 (Amazon) mod_wsgi/4.4.21 Python/3.6.2 configured -- resuming normal operations
Run Code Online (Sandbox Code Playgroud)

我重新加载了 Python 应用程序页面并且它正在工作(它有一个不同的错误但mod_wsgi正在工作)。

现在进行部署的这部分。

脚本编写

经过几次迭代,我在.ebextensions/...文件中解决了这个问题:

packages:
  yum:
    git: []
    gcc-c++: []
    httpd24-devel-2.4.27-3.75.amzn1.x86_64: []

files:
  "/tmp/update-wsgi.sh" :
    mode: "000755"
    owner: root
    group: root
    content: |
      # update mod_wsgi
      cd /tmp
      wget -q "https://github.com/GrahamDumpleton/mod_wsgi/archive/4.4.21.tar.gz" && \
      tar -xzf '4.4.21.tar.gz' && \
      cd ./mod_wsgi-4.4.21 && \
      sudo ./configure --with-python=/usr/bin/python3.6 && \
      sudo make && \
      sudo make install && \
      sudo service httpd restart

commands:
  mod_wsgi_update:
    command: /tmp/update-wsgi.sh
    cwd: /tmp
Run Code Online (Sandbox Code Playgroud)

一些注意事项:

  • gcc需要依赖的mod_wsgi构建
  • httpd24-devel依赖性的apsx工具


归档时间:

查看次数:

3623 次

最近记录:

7 年,3 月 前