RedHat 服务器上从 WSGI 脚本导入 Python 模块失败

RedHat 服务器上从 WSGI 脚本导入 Python 模块失败

这是一个最小的 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

相关内容