web-dev-qa-db-fra.com

Comment configurer MongoDB derrière Nginx Reverse Proxy

Salut les gars J'essaye de configurer Nginx comme proxy inverse pour accéder à une base de données MongoDB. Par défaut, Mongo écoute le port 27017. Ce que je veux faire, c'est rediriger un nom d'hôte par exemple mongodb.mysite.com via nginx et le passer au serveur mongodb. De cette façon, à partir du réseau extérieur, je ferai fermer mon port 27017 connu et accéder à ma base de données à partir d'une URL cachée comme l'exemple que j'ai donné.

J'essaie donc d'installer Nginx avec cette configuration:

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;
        }
    }

Donc, après avoir cela, j'essaie de me connecter avec mongo Shell à partir de mon cmd avec la commande mongo mongo.mysite.com:80 et je récupère l'erreur suivante:

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

Aussi dans le journal d'accès Nginx, j'obtiens ceci:

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 "-" "-"

Quelqu'un at-il une idée de ce qui ne va pas ici? Merci!

18
mitsos1os

J'ai laissé cela derrière moi, mais après un certain travail, j'ai dû faire face à nouveau à ce problème et la solution m'est venue à l'esprit cette fois!

NGINX est essentiellement un serveur HTTP, donc en définissant des redirections et des proxys de la manière ci-dessus, il enveloppe toutes les communications dans le protocole HTTP. Donc, l'erreur qui se produit, c'est que même si Mongo attend du trafic brut TCP trafic, il reçoit du trafic HTTP.

La solution est donc d'utiliser le nouveau stream module De NGINX qui est utilisé pour gérer le trafic brut TCP et configurer votre serveur en amont pour pointer vers l'instance mongodb.

Plus d'informations: module de flux NGINX

19
mitsos1os

Vous avez raison, vous devez utiliser le module de flux de NGINX en ajoutant une section de flux à votre fichier .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>;
  }
}
16
Néstor

Ajoutant à la réponse de @ Néstor, cette configuration devrait être écrite dans /etc/nginx.conf Juste au-dessus de la section http, comme ceci:

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 {
    ...
}

Vous devez JAMAIS l'écrire dans un fichier .conf Et placer le fichier dans le dossier /etc/nginx/sites-available. Parce que toutes les informations de configuration dans le dossier /etc/nginx/sites-available Appartiennent à la section http.

14
Kingname