CouchDB复制在代理后面无法正常工作

时间:2011-03-08 20:12:33

标签: apache couchdb reverse-proxy

注意:根据新信息进行了一些更新。旧的想法已被添加为下面的评论。 注意:根据新信息(再次)进行一些更新。以下评论添加了旧观点(再次)。

我们在Apache反向代理后面的不同计算机上运行两个CouchDB实例。尝试在两个实例之间复制时:

curl -X POST http://user:pass@localhost/couchdb/_replicate -d '{ "source": "db1", "target": "http://user:pass@10.1.100.59/couchdb/db1" }' --header "Content-Type: application/json"

(我们开始使用curl调试问题)

我们收到类似于以下错误:

{"error":"case_clause","reason":"{error,\n    {{bad_return_value,\n         {invalid_json,\n             <<\"<!DOCTYPE HTML PUBLIC \\\"-//IETF//DTD HTML 2.0//EN\\\">\\n<html><head>\\n<title>404 Not Found</title>\\n</head><body>\\n<h1>Not Found</h1>\\n<p>The requested URL /couchdb/db1/_local/01e935dcd2193b87af34c9b449ae2e20 was not found on this server.</p>\\n<hr>\\n<address>Apache/2.2.3 (Red Hat) Server at 10.1.100.59 Port 80</address>\\n</body></html>\\n\">>}},\n     {child,undefined,\"01e935dcd2193b87af34c9b449ae2e20\",\n         {gen_server,start_link,\n             [couch_rep,\n              [\"01e935dcd2193b87af34c9b449ae2e20\",\n               {[{<<\"source\">>,<<\"db1\">>},\n                 {<<\"target\">>,\n                  <<\"http://user:pass@10.1.100.59/couchdb/db1\">>}]},\n               {user_ctx,<<\"user\">>,\n                   [<<\"_admin\">>],\n                   <<\"{couch_httpd_auth, default_authentication_handler}\">>}],\n              []]},\n         temporary,1,worker,\n         [couch_rep]}}}"}

因此,经过进一步的研究,似乎apache在不尝试访问CouchDB的情况下返回此错误(根据日志文件)。在提供以下网址时要明确

/couchdb/db1/_local/01e935dcd2193b87af34c9b449ae2e20

Apache将请求传递给CouchDB并返回CouchDB的404错误。另一方面,当复制发生时,实际传递的URL是

/couchdb/db1/_local%2F01e935dcd2193b87af34c9b449ae2e20

apache确定是一个丢失的文档,并为返回自己的404错误,而将请求传递给CouchDB。这至少给了我一些新的线索,但如果有人得到了答案,我仍然可以使用帮助。

4 个答案:

答案 0 :(得分:2)

源CouchDB(localhost)告诉您远程URL无效。源代码接收 Apache httpd代理的文件未找到的响应,而不是CouchDB响应。

不幸的是,您可能需要进行一些反向代理故障排除。我的第一个猜测是源发送到目标的Host标头。也许它与您从第三个位置直接连接时有所不同?

最后,我想你可能知道这一点,但路径

/couchdb/db1/_local%2F01e935dcd2193b87af34c9b449ae2e20

是标准的CouchDB路径。当CouchDB看到请求时,它应该被/couchdb剥离,因此查询是针对名为_local%2f...的数据库中名为db1的文档。

顺便提一下,不要让代理在遇到沙发之前修改路径非常很重要。特别是,如果您发送%2f,那么CouchDB最好收到%2f,如果您发送/,那么CouchDB最好收到/

答案 1 :(得分:1)

来自官方文件......

请注意,理论上支持HTTPS代理,但在1.0.1中不起作用。这是因为1.0.1附带ibrowse版本1.5.5。 trunk中的CouchDB版本(1.1将基于哪个版本)附带ibrowse版本1.6.2。后来的ibrowse包含了对HTTPS代理的修复。

你能看到涉及哪个版本的ibrowse?也许更新那个版本?

答案 2 :(得分:1)

我的另一个想法是关于SSL证书。如果你没有,我知道你没有:),那么从技术上讲你做错了SSL。在java中,我们知道有很多方法可以解决这个问题,但也许可以尝试使用适当的证书,因为所有SSL内容基本上都涉及证书。

答案 3 :(得分:1)

对于我上一次的贡献(今天),我想说你看过这个看起来非常相关的文件吗?

http://wiki.apache.org/couchdb/Apache_As_a_Reverse_Proxy