通过 httpd 上的 Flask-PyMongo 连接到 MongoHQ URI 时出现 ConnectionFailure

Posted

技术标签:

【中文标题】通过 httpd 上的 Flask-PyMongo 连接到 MongoHQ URI 时出现 ConnectionFailure【英文标题】:ConnectionFailure when connecting to MongoHQ URI via Flask-PyMongo on httpd 【发布时间】:2014-01-28 15:45:26 【问题描述】:

我有一个带有 Mongo 后端的 Flask 应用程序,在我的本地开发环境中运行良好。我将它移至 AWS 托管的 RHEL 实例,并通过 httpd/mod_wsgi 让 Flask 应用程序运行。但是,连接到 MongoHQ 上的数据库仍然失败。

连接的代码是这样的:

from flask import Flask
from flask.ext.pymongo import PyMongo

app = Flask(__name__)
app.config["MONGO_URI"] = 'mongodb://myusername:mypasswd@myhost.mongohq.com:myport/mydb'
mongo = PyMongo(app)

一个示例查询:

@app.route('/books')
def books()
    all_books = mongo.db.listings.distinct("bookinfo")
    return all_books

来自 Apache 的错误消息(为便于阅读而编辑):

mod_wsgi (pid=5116, process='myProcess', application=''): Loading WSGI script '/route/to/myapp.wsgi'. 
mod_wsgi (pid=5116): Target WSGI script '/route/to/myapp.wsgi' cannot be loaded as Python module. 
mod_wsgi (pid=5116): Exception occurred processing WSGI script '/route/to/myapp.wsgi'. 
Traceback (most recent call last): 
File "/route/to/myapp.wsgi", line 10, in <module>
     from myApp import app as application   
File "/route/to/myapp.py", line 8, in <module>
     mongo = PyMongo(app)
File "/route/to/my/venv/lib/python2.6/site-packages/flask_pymongo/__init__.py", line 98, in __init__
    self.init_app(app, config_prefix)
File "/route/to/my/venv/python2.6/site-packages/flask_pymongo/__init__.py", line 230, in init_app
     cx = connection_cls(*args, **kwargs)
File "/route/to/my/venv/python2.6/site-packages/pymongo/mongo_client.py", line 352, in __init__
     raise ConnectionFailure(str(e))
ConnectionFailure: could not connect to myhost.mongohq.com:myport: [Errno 13] Permission denied

我的想法/调查:

    当我删除数据库连接时应用程序运行良好:所以它不是 mod_wsgi、Apache 或权限问题? 我可以通过 Mongo shell 和 Python shell 但不能通过应用程序连接到 mongo uri:所以这不是防火墙问题? MongoHQ 的超响应客户服务(说真的,他们很棒)认为这是 Flask-PyMongo 驱动程序的问题,但我不知道如何调试。

任何帮助/提示/可能性将不胜感激。

【问题讨论】:

您是否尝试过使用来自flask-pymongo.readthedocs.org/en/latest/#configuration 的单独配置变量,例如MONGO_HOSTMONGO_PORT 等? 是的,它给出了完全相同的错误信息。我也尝试过使用 pymongo.MongoClient(x) 进行连接,其中 x 是 mongo_uri 字符串,但同样的错误。 好吧,那是 pymongo 问题,但您已经说过您实际上可以在问题中与 pymongo 建立联系。请更正。 对此表示歉意并更正。我的意思是我在 Python shell 中使用 pymongo 进行了连接。将继续调查pymongo连接。谢谢! 其他一些想法。是否启用了 SELinux?您在 shell 中使用的用户是否与运行应用程序的用户不同? 【参考方案1】:

SELinux 是造成这种情况的根本原因。我禁用了防火墙,但从未通过编辑 /etc/sysconfig/selinux 文件来关闭 SELinux。这样做之后,该应用程序仍然存在问题,但此日志记录代码帮助很大:

import logging
file_handler = logging.FileHandler(filename='/var/www/myapp/flaskerror.log')
file_handler.setLevel(logging.WARNING)
app.logger.addHandler(file_handler)

【讨论】:

以上是关于通过 httpd 上的 Flask-PyMongo 连接到 MongoHQ URI 时出现 ConnectionFailure的主要内容,如果未能解决你的问题,请参考以下文章

Flask 扩展 Flask-PyMongo

通过centos 8上的mod_jk将apache httpd重定向到tomcat

Centos7 上的 PHP-FPM 与 Directadmin -> 通过 httpd-alias 的 url 未解析为 php

Windows 上的 Apache httpd 服务器无法启动

修改 httpd.conf 文件

更改 httpd 配置上的侦听端口以进行 Varnish 配置