注意:根据新信息进行了一些更新。旧的想法已被添加为下面的评论。 注意:根据新信息(再次)进行一些更新。以下评论添加了旧观点(再次)。
我们在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。这至少给了我一些新的线索,但如果有人得到了答案,我仍然可以使用帮助。
答案 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)
对于我上一次的贡献(今天),我想说你看过这个看起来非常相关的文件吗?