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

6tdlim6h  于 2023-05-15  发布在  CouchDB
关注(0)|答案(5)|浏览(197)

**Note:** Made some updates based on new information. Old ideas have been added as comments below.**Note:** Made some updates (again) based on new information. Old ideas have been added as comments below (again).
我们在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"

(we开始使用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错误,用于without将请求传递给CouchDB。这至少给了我一些新的线索,但我仍然可以使用帮助,如果有人有一个答案随手。

qyswt5oh

qyswt5oh1#

源CouchDB(localhost)告诉您远程URL无效。源接收的不是CouchDB响应,而是Apache httpd代理的file-not-found响应。
不幸的是,您可能需要进行一些反向代理故障排除。我的第一个猜测是源发送给目标的Host头。也许这与您直接从第三个位置连接时不同?
最后,我想你们可能知道,

/couchdb/db1/_local%2F01e935dcd2193b87af34c9b449ae2e20

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

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

fhity93d

fhity93d2#

从官方文件来看…
请注意,HTTPS代理在理论上是支持的,但在1.0.1中不起作用。这是因为1.0.1附带了ibrowse 1.5.5版。trunk中的CouchDB版本(1.1将基于此版本)随ibrowse版本1.6.2一起提供。这个稍后的ibrowse包含HTTPS代理的修复。
你能看到哪个版本的ibrowse参与?也许更新版本?

qyzbxkaa

qyzbxkaa3#

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

rdrgkggo

rdrgkggo4#

对于我今天的最后一个贡献,我想说的是,你看过这份似乎非常相关的文件了吗?
http://wiki.apache.org/couchdb/Apache_As_a_Reverse_Proxy

7gcisfzg

7gcisfzg5#

我写这个答案是希望帮助那些可能已经在这个问题上挣扎了一个多星期的人:
我已经安装了couchdb v3.1.1,我不得不在IIS上启用/安装两个模块,以使其在代理上工作:

  • Corsmodule
  • IIS重写模块V2

我不得不更改SSL的设置:

  • 要求真实
  • 忽略证书

此外,我还安装了***Microsoft Visual C++ 2015-2019和2010 Redistributable***,以使couchdb服务无需重新启动即可运行。
希望能帮上忙。

相关问题