通过SSH隧道连接MongoDB失败

3
我正在使用Flask开发GUI。我运行的是Ubuntu 20.04。我需要的数据来自MongoDB,它在服务器上的Docker容器中运行。我的Mongo URI是"mongodb://<USERNAME>:<PASSWORD>@localhost:9999/<DB>?authSource=<AUTHDB>"
首先,我会通过SSH连接到服务器的隧道:
ssh -L 9999:localhost:27017 -N <USER>@<HOST>

当我通过隧道连接到Mongo shell后,它的工作方式符合预期。问题出在我尝试运行 Flask 应用程序时。PyMongo 似乎无法连接到数据库(连接被拒绝)。

pymongo.errors.ServerSelectionTimeoutError: 127.0.0.1:9999: [Errno 111] Connection refused, Timeout: 30s, Topology Description: <TopologyDescription id: 62fa50c9015294b6e1df5811, topology_type: Unknown, servers: [<ServerDescription ('127.0.0.1', 9999) server_type: Unknown, rtt: None, error=AutoReconnect('127.0.0.1:9999: [Errno 111] Connection refused')>]>

我一直看到的另一个错误是PyMongo认证失败。只有在我本地机器上运行有Mongo的Docker容器时才会发生这种情况。(先前的错误仅在本地容器未运行时发生)。

pymongo.errors.OperationFailure: Authentication failed., full error: {'ok': 0.0, 'errmsg': 'Authentication failed.', 'code': 18, 'codeName': 'AuthenticationFailed', '$clusterTime': {'clusterTime': Timestamp(1660576452, 1), 'signature': {'hash': b'\x16\x8c\x11\xb2Uf\xe3\x80\x85\xb0 >\xcb\xbe\xa5S\x8f\xec(g', 'keyId': 7128054189753630722}}, 'operationTime': Timestamp(1660576452, 1)}

最后一件事:当尝试连接运行在本地 Docker 容器中的本地 MongoDB 时,我没有遇到任何错误。这让我相信,在连接远程 MongoDB 时,我可能忽略了某个步骤。而且这不是 URI 的问题,因为当 SSH 连接正常时,我可以使用它登录到 Mongo shell。

下面是我的 Flask 应用程序的一些代码:

init.py

from flask import Flask
from flask_bootstrap import Bootstrap
from .frontend import frontend
from .database import mongo

def create_app(configfile=None):
    app = Flask(__name__)
    app.config["MONGO_URI"] = "mongodb://<USERNAME>:<PASSWORD>@localhost:9999/<DB>?authSource=<AUTHDB>"

    Bootstrap(app)
    mongo.init_app(app)
    
    app.register_blueprint(frontend)
    app.secret_key = os.environ['SECRET_KEY']

    app.config['BOOTSTRAP_SERVER_LOCAL'] = True

    return app

database.py

from flask_pymongo import PyMongo

mongo = PyMongo()

frontend.py

from flask import Blueprint
from .database import mongo

frontend = Blueprint('frontend', __name__)

# Rest of file contains routes with calls to database

有人知道我为什么会得到这些错误吗?谢谢。

2个回答

3

在这个问题上浪费了两天时间后,我在 PyMongo 4.3.3 中找到了唯一相关的答案。应该在 MongoClient 中添加 directConnection=True - Trenomarcus

2
我发现pymongo没有正确设置端口,可能是由于包中的错误。即使我将端口指定为9999,它仍然认为应该连接到27017。
如果我将URI设置为"mongodb://<USERNAME>:<PASSWORD>@garbage:9999/<DB>?authSource=<AUTHDB>",那么它实际上将尝试连接到端口9999。
最终,我将我的ssh隧道更改为端口27017,一切正常。 ssh -L 27017:localhost:27017 -N <USER>@<HOST>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接