2 votes

Le reverse proxy de Nginx et CouchDB ne fonctionne pas

J'essaie d'établir un proxy [ [http://localhost:5984\]](http://localhost:5984]) à [ [http://localhost/couchdb\]](http://localhost/couchdb]) . J'utilise nginx comme proxy. J'ai suivi la même méthode que celle mentionnée à 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;
    } 

mais quand je lance curl localhost/couchdb j'obtiens l'erreur suivante

{"error":"not_found","reason":"no_db_file"}

Cependant, lorsque je lance curl localhost:5984, j'obtiens une réponse valide de couchdb.

{"couchdb":"Welcome","uuid":"337bb4394efe84536a68a63eee55333f","version":"1.5.0","vendor":    {"name":"The Apache Software Foundation","version":"1.5.0"}}

Mais lorsque je lance curl localhost:5984/couchdb, j'obtiens la même erreur (et le même journal) que je reçois via le proxy inverse.

Le fichier journal de couchdb indique ce qui suit

[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"}

Je pense que la configuration de nginx est correcte, c'est pourquoi la requête arrive à couchdb. Si le fichier couchdb.couch manquant que le journal indique est un problème, alors pourquoi cette base de données ne pose pas de problème lorsque nous y accédons directement sur le port 5984. Il semble que le mochiweb de couchdb confonde quelque chose.

Je constate le même comportement sur deux distributions différentes.

Ubuntu 10.04 : CouchDB V 1.10.0 ArchLinux 3.10 : CouchDB V 1.5.0

1voto

Rajkumar Points 21

J'ai résolu ce problème en ajoutant

rewrite /couchdb / break;

pour y accéder via localhost/couchdb. La règle que j'ai mentionnée

rewrite /couchdb/(.*)  /$1 break;

fonctionnera pour localhost/couchdb/db1 etc.

0voto

JulietHuddy Points 1

J'ai rencontré le même problème, vous pouvez combiner les deux règles en utilisant plusieurs groupes de capture :

rewrite /couch(/)?(.*) /$2 break;

0voto

Pian0_M4n Points 168

Voici une configuration qui fonctionne bien pour les requêtes, les vues et la réplication :

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;
}

0voto

giles Points 314

La réponse devrait être, a changé cette ligne proxy_pass http://127.0.0.1:5984 a proxy_pass http://127.0.0.1:5984/ . Voyez-vous cela, un slash "/" ajouté à l'url proxy_pass. Avec un slash, nginx ajoutera juste la chaîne après "/couchdb/", et couchdb ne sera pas inclus. C'est une astuce subtile.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X