Как настроить MongoDB за обратным прокси-сервером Nginx

Привет, ребята, я пытаюсь настроить Nginx в качестве обратного прокси для доступа к базе данных MongoDB. По умолчанию Mongo прослушивает порт 27017. Что я хочу сделать, это перенаправить имя хоста, например mongodb.mysite.com через nginx и передайте его на сервер mongodb. Таким образом, из внешней сети у меня будет закрыт мой известный порт 27017 и доступ к моей БД из скрытого 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] "<x00x00x00x00x00x00x00x00x00x00x00xD4x07x00x00x00x00x00x00admin.$cmdx00x00x00x00x00x01x00x00x00x15x00x00x00x10whatsmyurix00x01x00x00x00x00" 400 172 "-" "-"

у кого-нибудь есть идеи, что происходит здесь? Спасибо!

4 ответов


Я оставил это позади, но после некоторой работы мне пришлось столкнуться с этой проблемой снова, и решение выскочило в моем уме на этот раз!

NGINX в основном является HTTP-сервером, поэтому, установив перенаправления и прокси-серверы вышеуказанным способом, он обертывает всю связь в протоколе HTTP. Таким образом, ошибка, которая происходит, заключается в том, что, хотя Mongo ожидает необработанный TCP-трафик, он получает HTTP-трафик.

таким образом, решение этого заключается в использовании нового stream module который используется для обработки необработанного TCP трафик и настройка вышестоящего сервера для указания на экземпляр mongodb.

Подробнее : модуль потока NGINX


вы правы ,вам нужно использовать модуль потока 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>;
  }
}

дополнение для ответа @Néstor.

эта конфигурация должна быть записана в /etc/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>;
  }
}

http {
   ...
}

вы должны никогда пишите на .conf файл и поместите файл в . Потому что любая информация конфигурации в /etc/nginx/sites-available папка принадлежит http раздел


Если вы подключаетесь к локальному экземпляру mongodb через обычные значения ip по умолчанию, он должен подключиться:mongo 10.8.8.10

проблема заключается в разрешении адреса через оболочку mongodb, чего не происходит.