You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Digital Ocean上的Django+MongoEngine连接至远程MongoDB?

当然可以用SSH隧道来实现这个需求!我之前帮不少人配置过类似的Django+MongoEngine远程数据库连接,下面一步步给你讲清楚怎么操作~

1. 先确认前提条件
  • 你已经拥有主MongoDB服务器所在机器的SSH访问权限(比如持有对应的私钥文件)
  • 主MongoDB的默认端口27017没有直接暴露公网,或者你希望通过隧道提升连接安全性
  • Droplet上已经安装了sshtunnel、mongoengine和pymongo依赖,没装的话先执行:
    pip install sshtunnel mongoengine pymongo
    
2. 核心配置思路

MongoEngine本质是基于pymongo封装的,所以我们可以先通过SSHTunnelForwarder建立SSH隧道,把Droplet本地的某个端口转发到主MongoDB服务器的27017端口,再让MongoEngine连接这个本地转发端口即可。

3. 具体配置方案

方案一:开发/测试环境——和Django进程绑定启动

适合快速验证场景,直接在Django配置里初始化隧道:

# settings.py
from mongoengine import connect
from sshtunnel import SSHTunnelForwarder

# SSH隧道核心配置
SSH_TUNNEL_CONFIG = {
    'ssh_address_or_host': ('主服务器SSH地址', 22),  # 示例:('111.222.333.444', 22)
    'ssh_username': '你的SSH登录用户名',
    'ssh_pkey': '/root/.ssh/your_private_key.pem',  # Droplet上私钥文件的绝对路径
    'remote_bind_address': ('主MongoDB的地址', 27017),  # 如果MongoDB和SSH服务器是同一台,填('localhost',27017)即可
    'local_bind_address': ('0.0.0.0', 27018)  # Droplet本地绑定的空闲端口,随便选一个未被占用的
}

# 启动SSH隧道
tunnel_server = SSHTunnelForwarder(**SSH_TUNNEL_CONFIG)
tunnel_server.start()

# 配置MongoEngine连接
connect(
    db='你的主数据库名称',
    host='localhost',
    port=tunnel_server.local_bind_port,  # 也可以直接写刚才指定的27018
    username='MongoDB认证用户名',  # 主库有认证的话填这个
    password='MongoDB认证密码'
)

方案二:生产环境——独立持久化隧道(推荐)

上面的方案会让隧道和Django进程绑定,重启应用时隧道也会重启,生产环境更推荐用autossh维护持久化隧道:

  1. 在Droplet上安装autossh:

    # Debian/Ubuntu系统
    sudo apt-get install autossh -y
    # CentOS/RHEL系统
    sudo yum install autossh -y
    
  2. 创建持久化隧道命令:

    autossh -M 0 -f -N -L 27018:主MongoDB地址:27017 你的SSH用户名@主SSH服务器地址 -i /path/to/your_private_key.pem
    

    参数解释:

    • -M 0:禁用监控端口,减少资源占用
    • -f:后台运行进程
    • -N:仅做端口转发,不执行远程命令
    • -L 本地端口:目标地址:目标端口:端口转发规则
  3. 做成systemd服务确保开机自启:
    创建/etc/systemd/system/mongo-ssh-tunnel.service文件:

    [Unit]
    Description=Persistent SSH Tunnel for MongoDB
    After=network.target
    
    [Service]
    User=你的应用运行用户(比如www-data)
    ExecStart=/usr/bin/autossh -M 0 -f -N -L 27018:主MongoDB地址:27017 你的SSH用户名@主SSH服务器地址 -i /path/to/your_private_key.pem
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    

    然后启用并启动服务:

    sudo systemctl daemon-reload
    sudo systemctl enable mongo-ssh-tunnel
    sudo systemctl start mongo-ssh-tunnel
    
  4. 最后在Django的settings.py里直接连接本地转发端口:

    # settings.py
    from mongoengine import connect
    
    connect(
        db='你的主数据库名称',
        host='localhost',
        port=27018,
        username='MongoDB认证用户名',
        password='MongoDB认证密码'
    )
    
4. 验证连接是否成功

在Droplet上执行Django shell测试:

python manage.py shell

然后输入:

from mongoengine import get_db
db = get_db()
print(db.list_collection_names())

如果能输出主数据库里的集合名称,说明连接成功了!

注意事项
  • 确保Droplet上的本地转发端口(比如27018)未被占用,可用netstat -tulpn | grep 27018检查
  • 私钥文件权限要设置正确,避免SSH报错:chmod 600 /path/to/your_private_key.pem
  • 如果主MongoDB有IP白名单限制,要把SSH服务器的IP加入白名单(因为隧道是通过SSH服务器转发请求的)

内容的提问来源于stack exchange,提问作者Miguel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:26:12