Mongodb REST API不返回任何结果

时间:2015-02-27 17:12:12

标签: mongodb rest nginx

我使用内置的MongoDB "simple REST interface"尝试将我的MongoDB集合与一个简单的javascript前端绑定在一起,而无需自己编写API。我已经启动并运行了REST服务器,正如在我的生产服务器中运行以下内容所证明的那样:

$> http get "http://localhost:28017/mydb/mycoll/?limit=1"
HTTP/1.0 200 OK
Connection: close
Content-Length: 437
Content-Type: text/plain;charset=utf-8
x-action:
x-ns: mydb.mycoll

{
  "offset" : 0,
  "rows": [
    { <redacted data> }
  ],
  "total_rows" : 1 ,
  "query" : {} ,
  "millis" : 0
}

默认情况下,Mongodb REST服务器不会绑定到可公开访问的接口,因此我使用Nginx将localhost:28017代理到外部世界,具有以下配置:

server {
    listen      80;
    server_name api.myapp.com;
    rewrite     ^ https://$server_name$request_uri? permanent;
}

server {
    listen              443 default_server;
    server_name         api.myapp.com;
    ssl on;
    ssl_certificate     /etc/ssl/myapp.crt;
    ssl_certificate_key /etc/ssl/myapp.key;

    access_log /logs/nginx_access.log;
    error_log /logs/nginx_error.log;

    location /mongo {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        if (!-f $request_filename) {
            proxy_pass http://127.0.0.1:28017;
            break;
        }
    }
}

我重新加载nginx并尝试从我在该网络外部的机器上运行Mongo的机器内运行的相同查询,并得到:

$> http get "https://api.myapp.com/mongo/mydb/mycoll/?limit=1"
HTTP/1.1 200 OK
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/plain;charset=utf-8
Date: Fri, 27 Feb 2015 17:06:40 GMT
Server: nginx/1.4.6 (Ubuntu)
Transfer-Encoding: chunked
Vary: Accept-Encoding
x-action:
x-ns: mongo.mydb.mycoll

{
  "offset" : 0,
  "rows": [

  ],

  "total_rows" : 0 ,
  "query" : {} ,
  "millis" : 0
}

基本上,它 命中Mongo REST服务器(通过nginx代理),但它没有返回我在localhost上运行的同一查询的任何结果。

我到目前为止唯一的领先是两个响应的x-ns标题是不同的 - 就像Mongo REST服务器没有发现Nginx指示它位于{{1}后面这一事实而我正在考虑尝试访问数据库https://api.myapp.com/mongo

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

解决了我自己的问题。我在问题的最后猜测问题是:Nginx配置代理了对/mongo/路径完整的Mongo API服务器的请求,导致查询在(不存在的)数据库mongo上运行

我通过将以下行添加到Nginx配置文件中的/mongo/位置来修复此问题:

rewrite /mongo/(.+) /$1 break;

以便完整地阅读:

location /mongo/ {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header Host $http_host;
    proxy_redirect off;

    if (!-f $request_filename) {
        rewrite /mongo/(.+) /$1 break;
        proxy_pass http://127.0.0.1:28017;
        break;
    }
}

感谢任何提出这个问题的人。