Как настроить 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, которая не выполняется.