以 WSGI 模式在 Apache 中接收 "No module named encodings error"
Receiving "No module named encodings error" in Apache in WSGI mode
我遇到 "No module named 'encodings'" 错误。在我看来,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、日志、applogs 等
- python-src 包含 setup.py 和应用程序源文件
- venv 由 运行
python3 -m venv venv
设置(编辑:不是 python2)(设置虚拟环境)
- 在 python-src 中,
pip install -e .
将应用程序依赖项添加到虚拟环境。
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
这是我在 Graham Dumpleton 的帮助下在评论部分找到的内容。
问题是 Amazon Linux mod_wsgi 的默认安装是非常旧的 3.5。在 installing mod_wsgi (currently 4.6.2) using pip-3.6 和 link 它到 httpd 之后,问题就解决了。
我遇到 "No module named 'encodings'" 错误。在我看来,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、日志、applogs 等
- python-src 包含 setup.py 和应用程序源文件
- venv 由 运行
python3 -m venv venv
设置(编辑:不是 python2)(设置虚拟环境) - 在 python-src 中,
pip install -e .
将应用程序依赖项添加到虚拟环境。
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
这是我在 Graham Dumpleton 的帮助下在评论部分找到的内容。
问题是 Amazon Linux mod_wsgi 的默认安装是非常旧的 3.5。在 installing mod_wsgi (currently 4.6.2) using pip-3.6 和 link 它到 httpd 之后,问题就解决了。