Как настроить MongoDB за обратным прокси-сервером Nginx
Привет, ребята, я пытаюсь настроить Nginx как обратный прокси для доступа к базе данных MongoDB. По умолчанию Монго слушает 27017 порт. То, что я хочу сделать, перенаправляет имя узла, например mongodb.mysite.com, через nginx и передает его на сервер mongodb. Таким образом, из внешней сети у меня будет мой известный порт 27017, и я получу доступ к моему db из скрытого URL-адреса, как в примере, который я дал.
Итак, я пытаюсь настроить Nginx с этой конфигурацией:
server {
listen 80;
server_name mongo.mysite.com;
gzip off;
location / {
proxy_pass http://127.0.0.1:27017;
proxy_redirect off;
proxy_buffering off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Итак, после этого я пытаюсь подключиться к оболочке mongo из моего cmd с помощью команды mongo mongo.mysite.com:80
, и я возвращаю следующую ошибку:
2015-08-06T13:44:32.670+0300 I NETWORK recv(): message len 1347703880 is invalid. Min 16 Max: 48000000
2015-08-06T13:44:32.670+0300 I NETWORK DBClientCursor::init call() failed
2015-08-06T13:44:32.674+0300 E QUERY Error: DBClientBase::findN: transport error: mongo.therminate.com:80 ns: admin.$cmd query: { whatsmyuri: 1 }
at connect (src/mongo/shell/mongo.js:181:14)
at (connect):1:6 at src/mongo/shell/mongo.js:181
exception: connect failed
Также в журнале доступа Nginx я получаю следующее:
94.66.184.128 - - [06/Aug/2015:10:44:32 +0000] "<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xD4\x07\x00\x00\x00\x00\x00\x00admin.$cmd\x00\x00\x00\x00\x00\x01\x00\x00\x00\x15\x00\x00\x00\x10whatsmyuri\x00\x01\x00\x00\x00\x00" 400 172 "-" "-"
У кого-нибудь есть идея, что здесь происходит не так? Спасибо!
Ответы
Ответ 1
Я оставил это позади, но после некоторой работы я снова столкнулся с этой проблемой, и на этот раз появилось решение!
NGINX - это в основном HTTP-сервер, поэтому, устанавливая перенаправления и прокси-серверы выше, он переносит всю связь в протоколе HTTP. Таким образом, ошибка, которая происходит, заключается в том, что, хотя Mongo ожидает трафик Raw TCP, он получает HTTP-трафик.
Итак, решение этого - использовать NGINX new stream module
, который используется для обработки необработанного TCP-трафика и настройки вашего восходящего сервера, чтобы указать на экземпляр mongodb.
Дополнительная информация: Модуль потока NGINX
Ответ 2
Вы правы, вам нужно использовать модуль потока NGINX, добавив раздел потока в ваш .conf файл:
stream {
server {
listen <your incoming Mongo TCP port>;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass stream_mongo_backend;
}
upstream stream_mongo_backend {
server <localhost:your local Mongo TCP port>;
}
}
Ответ 3
Если добавить ответ @Néstor, этот /etc/nginx.conf
должен быть записан в /etc/nginx.conf
чуть выше раздела http
, например так:
stream {
server {
listen <your incoming Mongo TCP port>;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass stream_mongo_backend;
}
upstream stream_mongo_backend {
server <localhost:your local Mongo TCP port>;
}
}
http {
...
}
Вы НИКОГДА не должны записывать его в файл .conf
и помещать файл в папку /etc/nginx/sites-available
. Потому что любая информация о конфигурации в папке /etc/nginx/sites-available
относится к разделу http
.
Ответ 4
Если вы подключаетесь к локальному экземпляру mongodb с помощью обычных значений ip по умолчанию, он должен подключиться: mongo 10.8.8.10
Проблема заключается в разрешении адреса через оболочку mongodb, которая не выполняется.