web-dev-qa-db-ja.com

Nginxリバースプロキシの背後でMongoDBをセットアップする方法

こんにちは私はNginxをMongoDBデータベースにアクセスするためのリバースプロキシとしてセットアップしようとしています。デフォルトでは、Mongoは27017ポートをリッスンします。私がやりたいことは、例えばngodxを介してmongodb.mysite.comなどのホスト名をリダイレクトし、それを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 mongo.mysite.com:80を使用してcmdからmongo Shellに接続しようとすると、次のエラーが返されます。

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

誰かがアイデアを持っていますか、ここで何が問題になっていますか?ありがとう!

18
mitsos1os

私はこれを置き去りにしましたが、いくつかの作業が終わった後、私は再びこの問題に直面しなければならず、今度は解決策が思い浮かびました!

NGINXは基本的にHTTPサーバーであるため、上記のようにリダイレクトとプロキシを設定することで、すべての通信をHTTPプロトコルでラップします。したがって、発生しているエラーは、MongoがRaw TCPトラフィックを予期している一方で、HTTPトラフィックを取得していることです。

したがって、これに対する解決策は、NGINXの新しいstream moduleこれはraw TCPトラフィックを処理し、mongodbインスタンスを指すように上流サーバーを設定するために使用されます。

詳細: NGINXストリームモジュール

19
mitsos1os

そうです、.confファイルにストリームセクションを追加して、NGINXのストリームモジュールを使用する必要があります。

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

@Néstorの回答に加えて、この構成は、次のようにhttpセクションのすぐ上の/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 {
    ...
}

[〜#〜] never [〜#〜].confファイルに書き込み、/etc/nginx/sites-availableフォルダーに保存する必要があります。 /etc/nginx/sites-availableフォルダー内の構成情報はhttpセクションに属しているためです。

14
Kingname