如何将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维护持久化隧道:
在Droplet上安装autossh:
# Debian/Ubuntu系统 sudo apt-get install autossh -y # CentOS/RHEL系统 sudo yum install autossh -y创建持久化隧道命令:
autossh -M 0 -f -N -L 27018:主MongoDB地址:27017 你的SSH用户名@主SSH服务器地址 -i /path/to/your_private_key.pem参数解释:
-M 0:禁用监控端口,减少资源占用-f:后台运行进程-N:仅做端口转发,不执行远程命令-L 本地端口:目标地址:目标端口:端口转发规则
做成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最后在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
相关产品推荐
相关产品推荐

