Репликация CouchDB не работает должным образом за прокси - PullRequest
6 голосов
/ 08 марта 2011

Примечание: Произведены некоторые обновления на основе новой информации. Старые идеи были добавлены в виде комментариев ниже. Примечание: Сделано несколько обновлений (снова) на основе новой информации. Старые идеи были добавлены как комментарии ниже (снова).

Мы запускаем два экземпляра CouchDB на отдельных компьютерах за обратными прокси-серверами Apache. При попытке репликации между двумя экземплярами:

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 (согласно файлам журнала). Чтобы быть понятным при подаче следующий URL

/couchdb/db1/_local/01e935dcd2193b87af34c9b449ae2e20

Apache передает запрос в CouchDB и возвращает ошибку CouchDB 404. С другой стороны, когда происходит репликация, фактически передается URL-адрес

/couchdb/db1/_local%2F01e935dcd2193b87af34c9b449ae2e20

, который определяет Apache, является отсутствующим документом и возвращает собственную ошибку 404 для , при этом не передает запрос в CouchDB. Это, по крайней мере, дает мне новые возможности, но я все равно могу использовать помощь, если у кого-то есть ответ от руки.

Ответы [ 4 ]

2 голосов
/ 09 марта 2011

Источник CouchDB (localhost) сообщает вам, что удаленный URL был недействительным. Вместо ответа CouchDB источник получает ответ file-not-file прокси-сервера Apache httpd.

К сожалению, вам может потребоваться устранить неполадки обратного прокси-сервера. Мое первое предположение - заголовок Host, который источник посылает цели. Возможно, это отличается от того, когда вы подключаетесь напрямую из третьего места?

Наконец, я думаю, вы, вероятно, знаете это, но путь

/couchdb/db1/_local%2F01e935dcd2193b87af34c9b449ae2e20

не стандартный путь CouchDB. К тому времени, когда CouchDB увидит запрос, он должен удалить /couchdb, поэтому запрос относится к документу с именем _local%2f... в базе данных с именем db1.

Кстати, очень очень важно не позволять прокси изменять пути до того, как они попадут на кушетку. В частности, если вы отправляете %2f, тогда CouchDB лучше получать %2f, а если вы отправляете /, то CouchDB лучше получать /.

1 голос
/ 09 марта 2011

Еще одна мысль, которая у меня есть, связана с сертификатами SSL. Если у вас их нет, и я знаю, что у вас их нет :), то технически вы делаете SSL неправильно. В Java мы знаем, что есть способы обойти это, но, возможно, попробуйте ввести правильные сертификаты, так как все SSL-компоненты в основном включают сертификаты.

1 голос
/ 09 марта 2011

И что касается моего последнего вклада (сегодня), я бы сказал, вы просматривали этот документ, который кажется весьма актуальным?

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

1 голос
/ 09 марта 2011

Из официальной документации ...

Обратите внимание, что прокси HTTPS теоретически поддерживаются, но не работают в 1.0.1.Это потому, что 1.0.1 поставляется с версией ibrowse 1.5.5.Версия CouchDB в транке (откуда будет базироваться 1.1) поставляется с версией ibrowse 1.6.2.Этот более поздний ibrowse содержит исправления для HTTPS-прокси.

Можете ли вы увидеть, какая версия ibrowse используется?Может быть, обновить эту версию?

...