Nginx 和 CouchDB 反向代理不工作

Nginx 和 CouchDB 反向代理不工作

我正在尝试代理[http://本地主机:5984]到 [http://localhost/couchdb]。我正在运行 nginx 作为代理。我遵循了http://wiki.apache.org/couchdb/Nginx_As_a_Reverse_Proxy

    location /couchdb {
        rewrite /couchdb/(.*) /$1 break;
        proxy_pass http://127.0.0.1:5984;
        proxy_redirect          off;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header    X-Real-IP       $remote_addr;
    } 

但是当我运行 curl localhost/couchdb 时出现以下错误

{"error":"not_found","reason":"no_db_file"}

但是,当我运行 curl localhost:5984 时,我收到了来自 couchdb 的有效响应。

{"couchdb":"Welcome","uuid":"337bb4394efe84536a68a63eee55333f","version":"1.5.0","vendor":    {"name":"The Apache Software Foundation","version":"1.5.0"}}

但是当我运行 curl localhost:5984/couchdb 时,我得到了通过反向代理收到的相同错误(和日志)。

Couchdb 日志文件显示以下内容

[Fri, 24 Jan 2014 20:41:29 GMT] [debug] [<0.120.0>] 'GET' /couchdb {1,0} from "127.0.0.1"
Headers: [{'Accept',"*/*"},
      {'Connection',"close"},
      {'Host',"localhost"},
      {'User-Agent',"curl/7.32.0"},
      {'X-Forwarded-For',"127.0.0.1"},
      {"X-Real-Ip","127.0.0.1"}]
[Fri, 24 Jan 2014 20:41:29 GMT] [debug] [<0.120.0>] OAuth Params: []
[Fri, 24 Jan 2014 20:41:29 GMT] [error] [<0.1114.0>] Could not open file /var/lib/couchdb/couchdb.couch: no such file or directory
[Fri, 24 Jan 2014 20:41:29 GMT] [debug] [<0.120.0>] Minor error in HTTP request: {not_found,no_db_file}
[Fri, 24 Jan 2014 20:41:29 GMT] [debug] [<0.120.0>] Stacktrace: [{couch_httpd_db,do_db_req,2,
                                 [{file,"couch_httpd_db.erl"},{line,239}]},
                             {couch_httpd,handle_request_int,5,
                                 [{file,"couch_httpd.erl"},{line,332}]},
                             {mochiweb_http,headers,5,
                                 [{file,"mochiweb_http.erl"},{line,94}]},
                             {proc_lib,init_p_do_apply,3,
                                 [{file,"proc_lib.erl"},{line,239}]}]
[Fri, 24 Jan 2014 20:41:29 GMT] [info] [<0.120.0>] 127.0.0.1 - - GET /couchdb 404
[Fri, 24 Jan 2014 20:41:29 GMT] [debug] [<0.120.0>] httpd 404 error response:
{"error":"not_found","reason":"no_db_file"}

我相信我的 nginx 配置是正确的,这就是为什么请求到达了 couchdb。如果日志中说缺少 couchdb.couch 文件是问题所在,那么为什么当我们直接在端口 5984 上访问这个数据库时,它没有造成问题。看来 couchdb mochiweb 有点让人困惑。

我在两个不同的分布上看到了相同的行为

Ubuntu 10.04:CouchDB V 1.10.0 ArchLinux 3.10:CouchDB V 1.5.0

答案1

我已经通过添加解决了这个问题

rewrite /couchdb / break;

通过 localhost/couchdb 访问它。我提到的规则

rewrite /couchdb/(.*)  /$1 break;

适用于 localhost/couchdb/db1 等。

答案2

我遇到了同样的问题,您可以使用多个捕获组来组合这两个规则:

rewrite /couch(/)?(.*) /$2 break;

答案3

以下是适用于查询、查看和复制的配置:

location /couchdb/(.*)$ {
    rewrite /couchdb/(.*) /$1 break;
    proxy_pass http://127.0.0.1:5984;
    proxy_pass_header Accept;
    proxy_pass_header Server;
    keepalive_requests 1000;
    add_header 'Access-Control-Allow-Origin' '*';
    proxy_redirect  off;
    proxy_buffering off;
    proxy_set_header Host $host;
    proxy_set_header Authorization ""; # or according to server.ini
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header    X-Real-IP       $remote_addr;
}

答案4

答案应该是,将该行更改proxy_pass http://127.0.0.1:5984proxy_pass http://127.0.0.1:5984/。你看到了吗,在 proxy_pass url 后附加了一个斜线“/”。使用斜线,nginx 只会在“/couchdb/”后附加字符串,而不会包含 couchdb。这是一个巧妙的技巧。

相关内容