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

Apache CouchDB复制在代理后无法正常工作,apache,couchdb,reverse-proxy,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/d

注意:根据新信息进行了一些更新。在下面的评论中添加了旧的想法。 注意:根据新信息(再次)进行了一些更新。下面(再次)添加了旧想法作为评论

我们在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的404错误。另一方面,当复制发生时,实际传递的URL是

/couchdb/db1/_local%2F01e935dcd2193b87af34c9b449ae2e20

apache确定它是一个丢失的文档,并返回其自己的404错误,但从未将请求传递给CouchDB。这至少给了我一些新的线索,但如果有人能马上给出答案,我仍然需要帮助。

来自官方文档

请注意,HTTPS代理在理论上是受支持的,但在1.0.1中不起作用。这是因为1.0.1附带了ibrowse版本1.5.5。trunk中的CouchDB版本(1.1将基于此版本)与ibrowse版本1.6.2一起提供。稍后的ibrowse包含HTTPS代理的修复程序


你能看到涉及到哪个版本的ibrowse吗?可能会更新版本?

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

对于我的最后一篇文章(今天),我想说,您看过这篇看起来非常相关的文档了吗

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

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

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

/couchdb/db1/_local%2F01e935dcd2193b87af34c9b449ae2e20
不是标准CouchDB路径。当CouchDB看到一个请求时,它应该已经剥离了
/CouchDB
,因此查询的是名为
\u local%2f…
的数据库中名为
db1
的文档


顺便说一句,在路径到达之前,不要让代理修改路径,这一点非常重要。特别是,如果您发送
%2f
,则CouchDB最好接收
%2f
,如果您发送
/
,则CouchDB最好接收
/

,我实际上检查了httpd服务器的“未找到文件”响应,该响应未激活且不匹配。代理是否有一组不同的响应文件/配置(您知道它们可能在哪里吗)?另外,我将检查主机头;谢谢你的建议。不管怎样,这绝对不是CouchDB 404。如果你用谷歌搜索这个短语,结果中会充满ApacheHTTPD消息。我知道,这很令人沮丧。另一件事是在复制过程中同时观察目标CouchDB日志及其代理日志。好的,错误重写几乎肯定在代理中,但与主机头无关。我用进一步的细节更新了主要问题。有什么新想法吗?我不明白为什么它会为其中一个而不是另一个重写错误。要澄清的是,“/couchdb/”是发送的,不是coach接收的,但感谢您的愚蠢检查。:-)注意到但不相关。通过HTTP访问时发生错误。顺便说一句,我正在使用最新版本的CouchDB,其中包括对代理行为的更新。问题似乎与远程服务器返回的HTML有关(作为源或目标)。重写似乎是“自动的”。页面与apache错误文档中显示的404不匹配(这些文档无论如何都不处于活动状态)。基于Erlang的iNet库中似乎有类似的属性,但它们并不完全相同,我试图编辑适当的部分,但没有结果。有什么想法吗?我检查了日志文件,与返回消息相反,coach实际发送的是“/couchdb/db1/_local%2F01e935dcd2193b87af34c9b449ae2e20”(转义斜杠),这导致返回HTML时出现相同的错误,而带有未转义斜杠的URL返回预期JSON错误。如果没有代理,这两种情况下都不会出现此问题。这意味着问题出在代理中,但代理的ErrorDocument处理已关闭,并且列出的所有文件都不匹配。有人有进一步的建议吗?现在,由于您正在调试/配置Apache httpd反向代理,您可以尝试询问服务器故障。我可以想象那些人早餐吃的是反向代理。我更新了我的答案,稍微讨论了一下路径和转义码。
/couchdb/db1/_local%2F01e935dcd2193b87af34c9b449ae2e20