こんにちは私は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 "-" "-"
誰かがアイデアを持っていますか、ここで何が問題になっていますか?ありがとう!
私はこれを置き去りにしましたが、いくつかの作業が終わった後、私は再びこの問題に直面しなければならず、今度は解決策が思い浮かびました!
NGINXは基本的にHTTPサーバーであるため、上記のようにリダイレクトとプロキシを設定することで、すべての通信をHTTPプロトコルでラップします。したがって、発生しているエラーは、MongoがRaw TCPトラフィックを予期している一方で、HTTPトラフィックを取得していることです。
したがって、これに対する解決策は、NGINXの新しいstream module
これはraw TCPトラフィックを処理し、mongodbインスタンスを指すように上流サーバーを設定するために使用されます。
詳細: NGINXストリームモジュール
そうです、.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>;
}
}
@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
セクションに属しているためです。