这是一个最小的 WSGI 脚本,导入自定义的 python 模块。
它在开发环境(Mint 18.1、Apache 2.4.18、libapache2-mod-wsgi-py3)上运行良好,但在部署到测试服务器(RHEL 8.0、Httpd/Apache 2.4.37、python3-mod_wsgi)时失败。
这是 apache 配置块:
<VirtualHost *:80>
ServerName localhost
ServerAdmin admin@localhost
WSGIDaemonProcess MyApp
WSGIProcessGroup MyApp
WSGIScriptAlias /test /var/www/wsgi/wsgiapp.wsgi
<Directory /var/www/wsgi/>
Require all granted
</Directory>
LogLevel warn
</VirtualHost>
WSGI 脚本(/var/www/wsgi/wsgiapp.wsgi):
#!/usr/bin/python3
import sys
path = '/srv/git/myproject/mymodule/'
if path not in str(sys.path):
sys.path.insert(0, path)
from hellofunc import hello as application
要导入的文件(/srv/git/myproject/mymodule/hellofunc.py):
def hello(environ, start_response):
start_response('200 OK', [('Content-type', 'text/plain'),('Content-Length','6')])
return [b'Hello']
RedHat服务器上的Apache错误日志:
mod_wsgi (pid=1060): 无法执行 Python 脚本文件 '/var/www/wsgi/wsgiapp.wsgi'。mod_wsgi (pid=1060): 处理 WSGI 脚本 '/var/www/wsgi/wsgiapp.wsgi' 时发生异常。回溯(最近一次调用):文件“/var/www/wsgi/wsgiapp.wsgi”,第 7 行,来自 hellofunc import hello as application ModuleNotFoundError: 没有名为 'hellofunc' 的模块
已安排文件权限,以便 apache/www-data 组可以读取/执行每台服务器上的文件。仅使用了发行版软件包。没有从源代码构建任何内容,也没有通过 Python pip 安装任何内容。
答案1
RedHat 服务器默认启用了 SELinux。通过设置宽容模式进行确认:
# setenforce 0
编辑:SELinux 设置
将 Python 文件安全上下文设置为可通过 HTTPD 访问:
# chcon -R --type=httpd_sys_content_t /srv/git/myproject/
或者,如果 python 文件位于 $HOME 下,您可以使用 SELinux 布尔值让 HTTPD 访问它们:
# setsebool -P httpd_enable_homedirs on