Python Apache httpd无法访问本地MongoDB(权限被拒绝)

Python Apache httpd无法访问本地MongoDB(权限被拒绝),python,mongodb,apache,centos7,httpd.conf,Python,Mongodb,Apache,Centos7,Httpd.conf,我正在使用ApacheHTTPD为我的python应用程序提供服务。使用二进制可执行命令inginious webapp,应用程序在独立模式下运行良好。MongoDB也可以正常工作 但是当通过apachehttpd提供服务时,问题就出现了 当我浏览网站时,我得到一个500错误。这是错误日志 [Wed Jun 14 06:00:20.113043 2017][wsgi:error][pid 1194][client 125.99.159.82:29947]pymongo.errors.Server

我正在使用ApacheHTTPD为我的python应用程序提供服务。使用二进制可执行命令inginious webapp,应用程序在独立模式下运行良好。MongoDB也可以正常工作

但是当通过apachehttpd提供服务时,问题就出现了

当我浏览网站时,我得到一个500错误。这是错误日志
[Wed Jun 14 06:00:20.113043 2017][wsgi:error][pid 1194][client 125.99.159.82:29947]pymongo.errors.ServerSelectionTimeoutError:localhost:27017:[Errno 13]权限被拒绝,引用方:http://.eastus.cloudapp.azure.com/

配置信息 将apache添加到mongodb->
usermod-aG mongodb apache

将所有者更改为apache->
chown-R apache:apache/var/www/INGInious

httpd.conf
#在此之前的默认配置。变化随之而来
包括conf.modules.d/*.conf
#
#如果希望httpd作为其他用户或组运行,则必须运行
#httpd最初作为root,它将切换。
#
#用户/组:要作为运行httpd的用户/组的名称(或#编号)。
#通常,为用户创建一个专用的用户和组是一个很好的做法
#运行httpd,与大多数系统服务一样。
#
用户apache
组apache
LoadModule wsgi_module/usr/lib64/python3.5/site-packages/mod_wsgi/server/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so
WSGIScriptAlias/“/usr/bin/inginious webapp”
WSGIScript正在重新加载
别名/static/common/usr/lib/python3.5/site-packages/inginious/frontend/common/static/
别名/static/webapp/usr/lib/python3.5/site-packages/inginious/frontend/webapp/static/
别名/static/lti/usr/lib/python3.5/site-packages/inginious/frontend/lti/static/
#“主”服务器配置
#
#本节中的指令设置“main”使用的值
#服务器,它响应任何未由服务器处理的请求
#定义。这些值还提供了的默认值
#稍后在文件中定义的任何容器。
#
#所有这些指令都可能出现在容器中,
#在这种情况下,这些默认设置将被
#正在定义的虚拟主机。
#
#
#ServerAdmin:您的地址,服务器问题应该在哪里
#发电子邮件。此地址出现在某些服务器生成的页面上,例如
#作为错误文档。例如admin@your-domain.com
#
服务器管理员root@localhost
#
#ServerName提供服务器用于标识自身的名称和端口。
#这通常可以自动确定,但我们建议您指定
#这是为了防止启动过程中出现问题。
#
#如果您的主机没有注册的DNS名称,请在此处输入其IP地址。
#
服务器名http://.eastus.cloudapp.azure.com:80
#
#拒绝访问服务器的整个文件系统。你必须
#明确允许访问其他目录中的web内容目录
#下面的街区。
#
不允许超限
要求全部拒绝
#
#请注意,从这一点开始,您必须特别允许
#要启用的特定功能-因此如果某些功能无法正常工作
#您可能希望,确保您已经专门启用了它
#下面。
#
要求所有授权
要求所有授权
#保持不变

我也遇到了同样的问题,经过一番努力后,我发现在我使用的虚拟机上启用了selinux

如果发生这种情况,您还启用了selinux(),为了解决这个问题,您需要允许httpd进程发出网络请求。您可以通过执行以下操作来实现这一点:

sudo /usr/sbin/setsebool -P httpd_can_network_connect 1
然后重新启动apache服务

不幸的是,当恶意尝试连接到docker守护程序时,您很可能会遇到另一个路障。要解决这个问题,您需要创建一个本地策略模块。然后,本地策略模块将允许INGInious连接到docker守护程序。我建议安装
sealert
。这可以通过运行以下命令来完成:

sudo yum install setroubleshoot setools
如果您使用的是CentOS(可能还有RedHat)。一旦安装了
sealert
运行:

sealert -a /var/log/audit/audit.log
这将为您提供有关selinux阻止的操作的一些信息。如果翻阅日志,您将看到httpd被拒绝访问docker守护进程的套接字。它可能会给您一些关于如何为httpd生成本地策略模块的说明。使用CentOS,我必须运行:

ausearch -c 'httpd' --raw | audit2allow -M my-httpd
semodule -i my-httpd.pp
如果
ausearch
返回一个错误,指示
/etc/selinux/targeted/contexts/files/file\u contexts.local
不存在,只需运行:

sudo touch /etc/selinux/targeted/contexts/files/file_contexts.local

这里的答案似乎最合理,基本上建议使用uwsgi选项
sudo touch /etc/selinux/targeted/contexts/files/file_contexts.local