Ситуация, когда приложение и сервер баз данных находятся на одной и той же машине — очень редкая. Но по умолчанию в MongoDB авторизация отключена и вы не сможете соединить из вне. Мне не удалось найти краткую и понятную инструкцию, как это можно быстро исправить. Что и стало поводом для этого поста.
Исходные данные:
- Ubuntu Server 12.04 LTS;
- MongoDB 2.2.3, запущенная как сервис;
- python-скрипт, использующий pymongo, которым надо «достучаться» до удаленного mongo-сервера.
Вы уже установили MongoDB? Отлично! Если нет, рекомендую проследовать к вот этот инструкции.
Для начала необходимо проверить, где находится config-файл для mongod, который сейчас запущен. Запускаем терминал и проверяем:
user@ubuntu:/$ ps -ef | grep mongo
mongodb 65042 1 0 Feb25 ? 00:07:11 /usr/bin/mongod --config /etc/mongodb.conf
user 65343 64749 0 02:40 pts/0 00:00:00 grep --color=auto mongo
Как видно, в моем случаи он находится в /etc/mongodb.conf. Если запустить:
user@ubuntu:/$ netstat -a
Можно заметить, что mongod готов принять соединения только от localhost:
tcp 0 0 localhost:27017 *:* LISTEN
Пора отредактировать config-файл в соответствии с нашими требованиями. Открываем его и делаем ровно 2 изменения:
- Раскомментируем строку auth = true, которая включает авторизацию по умолчанию;
- Закомментируем строку bind_ip = 127.0.0.1, чтобы соединяться можно было с любого хоста.
Готово! Теперь осталось перезагрузить mongod:
user@ubuntu:/$ sudo service mongodb stop
mongodb stop/waiting
user@ubuntu:/$ sudo service mongodb start
mongodb start/running, process 65404
Осталось добавить пользователя в БД:
user@ubuntu:/$ mongo
MongoDB shell version: 2.2.3
connecting to: test
> use mytest
switched to db mytest
> db.testcollection.insert({"message":"Hello, remote user!"})
> db.addUser('myuser', 'superpassword')
{ "n" : 0, "connectionId" : 2, "err" : null, "ok" : 1 }
{
"user" : "myuser",
"readOnly" : false,
"pwd" : "ecb2c08916b34e477c33c10cec2ae416",
"_id" : ObjectId("512c6d9dcc5d103a896944ae")
}
> db.testcollection.find()
{ "_id" : ObjectId("512c6d85cc5d103a896944ad"), "message" : "Hello, remote user!" }
Перейдем к другому компьютеру в данной сети для чистоты эксперимента. В вашем случаи, конечно, ip и порт могут отличаться. Выполним там следующий python-скрипт:
from pymongo import MongoClient
mongoserver_uri = "mongodb://myuser:superpassword@10.2.0.182:27017/mytest"
conection = MongoClient(host=mongoserver_uri)
db = conection['mytest']
collection = db['testcollection']
print collection.find_one()
После запуска скрипта получаем результат:
{u'message': u'Hello, remote user!', u'_id': ObjectId('512c6d85cc5d103a896944ad')}
Надеюсь это короткое руководство позволит вам сэкономить время и нервы.
Автор: xSkyFoXx