首页 文章

在WSGI模式下在Apache中接收“无模块命名编码错误”

提问于
浏览
1

我遇到了“没有模块名为'编码'”的错误 . 在我看来,Python虚拟环境未正确加载 . 不过我还包括wsgi文件以防万一 .

0>我得到的错误:

[Mon Mar 12 16:49:44.919934 2018] [:info] [pid 6546] mod_wsgi (pid=6546): Starting process 'abcd_server' with uid=501, gid=501 and threads=5.
[Mon Mar 12 16:49:44.920494 2018] [:info] [pid 6546] mod_wsgi (pid=6546): Python home /var/www/m.abcd.com/venv.
[Mon Mar 12 16:49:44.920556 2018] [:info] [pid 6546] mod_wsgi (pid=6546): Initializing Python.
Fatal Python error: Py_Initialize: Unable to get the locale encoding
  ModuleNotFoundError: No module named 'encodings'

1>安装:

  • 亚马逊EC2 linux实例(CentOS);

  • 安装了Python 3.6: sudo yum install python36

  • 已安装wsgi: sudo yum install mod24_wsgi-python36.x86_64

2>验证:

  • httpd:Apache / 2.4.27(亚马逊)

  • python3:Python 3.6.2

  • httpd使用modules / wsgi.so ldd wsgi.so

linux-vdso.so.1 =>  (0x00007ffe71de8000)
libpython3.6m.so.1.0 => /usr/lib64/libpython3.6m.so.1.0 (0x00007f49a0ecf000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f49a0cb3000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f49a0aaf000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007f49a08ac000)
libm.so.6 => /lib64/libm.so.6 (0x00007f49a05aa000)
libc.so.6 => /lib64/libc.so.6 (0x00007f49a01e6000)
/lib64/ld-linux-x86-64.so.2 (0x00007f49a1616000)

3>网站设置:

  • 创建新用户"python_user:python_user"(uid = 501);

  • 创建目录/var/www/m.abcd.com并由python_user:python_user拥有 . 子目录也归python_user所有:python_user

  • 在/var/www/m.abcd.com下,创建python-src,venv,html,logs,applogs等 .

  • python-src包含setup.py和应用程序源文件
    通过运行 python3 -m venv venv (编辑:不是python 2 )设置

  • venv(设置虚拟环境)

  • 在python-src中, pip install -e . 将app依赖项添加到虚拟环境中 .

4> httpd配置:

<VirtualHost *:443>
  ......
  WSGIDaemonProcess abcd_server user=python_user group=python_user threads=5 python-home="/var/www/m.abcd.com/venv"
  WSGIProcessGroup abcd_server
  WSGIScriptAlias / "/var/www/m.abcd.com/python-src/src/abcd_server.wsgi"

  <Directory "/var/www/m.abcd.com/html">
    Require all granted
  </Directory>

  <Directory "/var/www/m.abcd.com/python-src/src">
    Require all granted
  </Directory>
  <Directory "/var/www/m.abcd.com/conf">
    Require all granted
  </Directory>
  <Directory "/var/www/m.abcd.com/applogs">
    Require all granted
  </Directory>
  <Directory "/var/www/m.abcd.com/data">
    Require all granted
  </Directory>

  ......
</VirtualHost>

5> abcd_server.wsgi

imort os
os.environ['P2SERVER_APP_CFG'] = '/var/www/m.abcd.com/conf/abcd_conf.yaml'
from p2events.app import app as application

6>(编辑)激活虚拟环境时,在交互式python会话中,sys.prefix = /var/www/m.abcd.com/venv . 所以这似乎没问题 .

7>(编辑,跟进Graham Dumpleton关于wsgi版本的评论) . WSGI版本似乎是个问题 . 它是3.5,当前版本是4.6.2 . Graham Dumpleton建议我会尝试安装新的 . 谢谢你,格雷厄姆!

[Sun Mar 11 22:16:55.898442 2018] [mpm_prefork:notice] [pid 2465] AH00163: Apache/2.4.27 (Amazon) OpenSSL/1.0.2k-fips mod_wsgi/3.5 Python/3.6.2 configured -- resuming normal operations

1 回答

  • 0

    以下是我在Graham Dumpleton的评论部分帮助中找到的内容 .

    问题是Amazon Linux的默认安装mod_wsgi是非常老的3.5 . 在installing mod_wsgi (currently 4.6.2) using pip-3.6之后并将其链接到httpd,问题得到了解决 .

相关问题