Я пытаюсь прокси [http: // localhost: 5984] к [http: // localhost / couchdb]. Я использую nginx для прокси. Я использовал тот же метод, что и в http://wiki.apache.org/couchdb/Nginx_As_a_Reverse_Proxy,
location /couchdb {
rewrite /couchdb/(.*) /$1 break;
proxy_pass http://127.0.0.1:5984;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
но когда я запускаю curl localhost / couchdb, я получаю следующую ошибку
{"error":"not_found","reason":"no_db_file"}
Однако, когда я запустил curl localhost: 5984, я получил правильный ответ от couchdb.
{"couchdb":"Welcome","uuid":"337bb4394efe84536a68a63eee55333f","version":"1.5.0","vendor": {"name":"The Apache Software Foundation","version":"1.5.0"}}
Но когда я запускаю curl localhost: 5984 / couchdb, я получаю ту же ошибку (и журнал), которую получаю через обратный прокси.
В файле журнала couchdb говорится следующее
[Fri, 24 Jan 2014 20:41:29 GMT] [debug] [<0.120.0>] 'GET' /couchdb {1,0} from "127.0.0.1"
Headers: [{'Accept',"*/*"},
{'Connection',"close"},
{'Host',"localhost"},
{'User-Agent',"curl/7.32.0"},
{'X-Forwarded-For',"127.0.0.1"},
{"X-Real-Ip","127.0.0.1"}]
[Fri, 24 Jan 2014 20:41:29 GMT] [debug] [<0.120.0>] OAuth Params: []
[Fri, 24 Jan 2014 20:41:29 GMT] [error] [<0.1114.0>] Could not open file /var/lib/couchdb/couchdb.couch: no such file or directory
[Fri, 24 Jan 2014 20:41:29 GMT] [debug] [<0.120.0>] Minor error in HTTP request: {not_found,no_db_file}
[Fri, 24 Jan 2014 20:41:29 GMT] [debug] [<0.120.0>] Stacktrace: [{couch_httpd_db,do_db_req,2,
[{file,"couch_httpd_db.erl"},{line,239}]},
{couch_httpd,handle_request_int,5,
[{file,"couch_httpd.erl"},{line,332}]},
{mochiweb_http,headers,5,
[{file,"mochiweb_http.erl"},{line,94}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,239}]}]
[Fri, 24 Jan 2014 20:41:29 GMT] [info] [<0.120.0>] 127.0.0.1 - - GET /couchdb 404
[Fri, 24 Jan 2014 20:41:29 GMT] [debug] [<0.120.0>] httpd 404 error response:
{"error":"not_found","reason":"no_db_file"}
Я считаю, что моя конфигурация nginx правильная, поэтому запрос доходит до couchdb. Если в журнале указано, что отсутствующий файл couchdb.couch является проблемой, то почему эта база данных не вызывает проблем, когда мы обращаемся к ней напрямую через порт 5984. Кажется, couchdb mochiweb что-то сбивает.
Я наблюдаю одно и то же поведение в двух разных дистрибутивах
Ubuntu 10.04: CouchDB V 1.10.0 ArchLinux 3.10: CouchDB V 1.5.0
Я решил это, добавив
rewrite /couchdb / break;
чтобы получить к нему доступ через localhost / couchdb. Правило, о котором я говорил
rewrite /couchdb/(.*) /$1 break;
будет работать для localhost / couchdb / db1 и т. д.
Вот конфигурация, которая хорошо работает для запросов, просмотра и репликации:
location /couchdb/(.*)$ {
rewrite /couchdb/(.*) /$1 break;
proxy_pass http://127.0.0.1:5984;
proxy_pass_header Accept;
proxy_pass_header Server;
keepalive_requests 1000;
add_header 'Access-Control-Allow-Origin' '*';
proxy_redirect off;
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header Authorization ""; # or according to server.ini
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
Я столкнулся с той же проблемой, вы можете объединить два правила, используя несколько групп захвата:
rewrite /couch(/)?(.*) /$2 break;
Ответ должен быть изменен в этой строке proxy_pass http://127.0.0.1:5984
к proxy_pass http://127.0.0.1:5984/
. Вы видите, что к URL-адресу proxy_pass добавлена косая черта "/". С косой чертой nginx просто добавит строку после "/ couchdb /", и couchdb не будет включен. Это тонкий трюк.