web-dev-qa-db-ja.com

nginxリバースプロキシ(HTTPS)の背後にあるnginx(基本認証)でgit Pushを機能させる方法は?

私は直接インターネットにアクセスできないコンピューター(バックエンド)にgitサーバーを置くのが好きです。基本認証が必要です。アクセスは、SSL/HTTPSを実行する別のコンピューター上のリバースプロキシ(フロントエンド)を使用して利用できる必要があります。どちらもDebian7安定版を実行しています(nginxとgitのwheezy + wheezy-backports)。

これまでのところすべて(= git clone)は機能しますが、git Push

$ git Push --set-upstream Origin master
Username for 'https://myfrontend:443': myusername
Password for 'https://myusername@myfrontend:443': 
error: Cannot access URL https://myserver:443/git/gittest.git/, return code 22
fatal: git-http-Push failed

バックエンドnginxログのエラーメッセージは次のとおりです。

2014/04/01 01:00:00 [error] 27000#0: *7 no user/password was provided for
basic authentication, client: myfrontend, server: mybackend, request:
"PROPFIND /git/gittest.git/ HTTP/1.0", Host: "myfrontend"

基本認証はcloneに対しては機能するようですが、Pushに対しては機能しないようです。

フロントエンドのnginx構成は次のとおりです。

server {
    listen 443;
    server_name myfrontend;
    resolver 127.0.0.1;
    charset UTF-8;
    #
    root /var/www/;
    index index.html;
    #
    ssl on;
    ssl_certificate /etc/ssl/certs/myfronted.crt;
    ssl_certificate_key /etc/ssl/private/myfrontend.key;
    #
    ssl_session_timeout 5m;
    #
    ssl_protocols SSLv3 TLSv1;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
    ssl_prefer_server_ciphers on;
    #
    location ~ /git(/.*) {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $Host;
        proxy_pass http://mybackend:8081/git$1;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header REMOTE_USER $remote_user;
    }
}

バックエンドのnginx構成は次のとおりです。

server {
    listen 8081;
    server_name mybackend;
    root /var/www;
    charset UTF-8;
    #
    location ~ /git(/.*) {
        auth_basic "Restricted";
        auth_basic_user_file /var/lib/git/.htpasswd;
        dav_methods PUT DELETE MKCOL COPY MOVE;
        dav_ext_methods PROPFIND OPTIONS;
        create_full_put_path on;
        #
        fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend;
        fastcgi_param GIT_HTTP_EXPORT_ALL "";
        fastcgi_param GIT_PROJECT_ROOT /var/lib/git;
        fastcgi_param PATH_INFO $1;
        fastcgi_param DOCUMENT_ROOT /usr/lib/git-core/;
        fastcgi_pass unix:/var/run/fcgiwrap.socket;
        include fastcgi_params;
    }
}

バックエンドサーバーのgitconfigは次のとおりです。

[core]
repositoryformatversion = 0
filemode = true
bare = true
[http]
receivepack = true
[gitweb]
    owner = My Name

バックエンド側でgitを提供する別の、おそらくもっと簡単な方法はありますか?たぶんnginxなしまたはfcgiwrapなし?しかし、私はApacheなしで生き残りたいです...

よろしくお願いします!

3
user214862

問題はフロントエンドの構文にありました。私は変更しなければなりませんでした:

proxy_pass http://mybackend:8081/git$1;

正しいに:

proxy_pass http://mybackend:8081/git$1$is_args$args;

または代わりに:

proxy_pass http://mybackend:8081$request_uri;

ありがとう、ウィル!

3
user214862