2012-11-29 188 views
1

我試圖使用NginX 0.8.52來託管Git repo,並使用fcgiwrap包裝git-http-backend。這個設置類似於發現的那個here。不過,我不斷收到以下錯誤(注意最後的錯誤):Git返回致命錯誤:git-http-push失敗

HGs-MacBook-Pro:git_dev hg$ GIT_CURL_VERBOSE=1 git push production master 
* Couldn't find host git.myserver.org in the .netrc file; using defaults 
* About to connect() to git.myserver.org port 443 (#0) 
* Trying 111.222.333.444... 
* Connected to git.myserver.org (111.222.333.444) port 443 (#0) 
* Connected to git.myserver.org (111.222.333.444) port 443 (#0) 
* SSL connection using DHE-RSA-AES256-SHA 
* Server certificate: 
* subject: C=GB; ST=Berkshire; L=Newbury; O=My Company Ltd 
* start date: 2012-11-27 09:56:30 GMT 
* expire date: 2012-12-27 09:56:30 GMT 
* issuer: C=GB; ST=Berkshire; L=Newbury; O=My Company Ltd 
* SSL certificate verify result: self signed certificate (18), continuing anyway. 
> GET /info/refs?service=git-receive-pack HTTP/1.1 
User-Agent: git/1.7.11.4 
Host: git.myserver.org 
Accept: */* 
Pragma: no-cache 

< HTTP/1.1 401 Unauthorized 
< Server: nginx 
< Date: Thu, 29 Nov 2012 01:42:21 GMT 
< Content-Type: text/html 
< Content-Length: 188 
< Connection: close 
< WWW-Authenticate: Basic realm="Restricted" 
< 
* Closing connection #0 
* Issue another request to this URL: 'https://[email protected]/info/refs?service=git-receive-pack' 
* Couldn't find host git.myserver.org in the .netrc file; using defaults 
* About to connect() to git.myserver.org port 443 (#0) 
* Trying 111.222.333.444... 
* Connected to git.myserver.org (111.222.333.444) port 443 (#0) 
* Connected to git.myserver.org (111.222.333.444) port 443 (#0) 
* SSL re-using session ID 
* SSL connection using DHE-RSA-AES256-SHA 
* old SSL session ID is stale, removing 
* Server certificate: 
* subject: C=GB; ST=Berkshire; L=Newbury; O=My Company Ltd 
* start date: 2012-11-27 09:56:30 GMT 
* expire date: 2012-12-27 09:56:30 GMT 
* issuer: C=GB; ST=Berkshire; L=Newbury; O=My Company Ltd 
* SSL certificate verify result: self signed certificate (18), continuing anyway. 
* Server auth using Basic with user 'admin' 
> GET /info/refs?service=git-receive-pack HTTP/1.1 
Authorization: Basic YWRtaW46 
User-Agent: git/1.7.11.4 
Host: git.myserver.org 
Accept: */* 
Pragma: no-cache 

< HTTP/1.1 401 Unauthorized 
< Server: nginx 
< Date: Thu, 29 Nov 2012 01:42:24 GMT 
< Content-Type: text/html 
< Content-Length: 188 
< Connection: close 
* Authentication problem. Ignoring this. 
< WWW-Authenticate: Basic realm="Restricted" 
* The requested URL returned error: 401 
* Closing connection #0 
Password for 'https://[email protected]': 
* Couldn't find host git.myserver.org in the .netrc file; using defaults 
* About to connect() to git.myserver.org port 443 (#0) 
* Trying 111.222.333.444... 
* Connected to git.myserver.org (111.222.333.444) port 443 (#0) 
* Connected to git.myserver.org (111.222.333.444) port 443 (#0) 
* SSL re-using session ID 
* SSL connection using DHE-RSA-AES256-SHA 
* old SSL session ID is stale, removing 
* Server certificate: 
* subject: C=GB; ST=Berkshire; L=Newbury; O=My Company Ltd 
* start date: 2012-11-27 09:56:30 GMT 
* expire date: 2012-12-27 09:56:30 GMT 
* issuer: C=GB; ST=Berkshire; L=Newbury; O=My Company Ltd 
* SSL certificate verify result: self signed certificate (18), continuing anyway. 
* Server auth using Basic with user 'admin' 
> GET /info/refs?service=git-receive-pack HTTP/1.1 
Authorization: Basic REMOVED 
User-Agent: git/1.7.11.4 
Host: git.myserver.org 
Accept: */* 
Pragma: no-cache 

* The requested URL returned error: 404 
* Closing connection #0 
* Couldn't find host git.myserver.org in the .netrc file; using defaults 
* About to connect() to git.myserver.org port 443 (#0) 
* Trying 111.222.333.444... 
* Connected to git.myserver.org (111.222.333.444) port 443 (#0) 
* Connected to git.myserver.org (111.222.333.444) port 443 (#0) 
* SSL re-using session ID 
* SSL connection using DHE-RSA-AES256-SHA 
* old SSL session ID is stale, removing 
* Server certificate: 
* subject: C=GB; ST=Berkshire; L=Newbury; O=My Company Ltd 
* start date: 2012-11-27 09:56:30 GMT 
* expire date: 2012-12-27 09:56:30 GMT 
* issuer: C=GB; ST=Berkshire; L=Newbury; O=My Company Ltd 
* SSL certificate verify result: self signed certificate (18), continuing anyway. 
* Server auth using Basic with user 'admin' 
> GET /info/refs HTTP/1.1 
Authorization: Basic REMOVED 
User-Agent: git/1.7.11.4 
Host: git.myserver.org 
Accept: */* 
Pragma: no-cache 

< HTTP/1.1 200 OK 
< Server: nginx 
< Date: Thu, 29 Nov 2012 01:42:32 GMT 
< Content-Type: text/plain 
< Connection: close 
< Expires: Fri, 01 Jan 1980 00:00:00 GMT 
< Pragma: no-cache 
< Cache-Control: no-cache, max-age=0, must-revalidate 
< Content-Length: 59 
< 
* Closing connection #0 
* Couldn't find host git.myserver.org in the .netrc file; using defaults 
* About to connect() to git.myserver.org port 443 (#0) 
* Trying 111.222.333.444... 
* Connected to git.myserver.org (111.222.333.444) port 443 (#0) 
* Connected to git.myserver.org (111.222.333.444) port 443 (#0) 
* SSL re-using session ID 
* SSL connection using DHE-RSA-AES256-SHA 
* old SSL session ID is stale, removing 
* Server certificate: 
* subject: C=GB; ST=Berkshire; L=Newbury; O=My Company Ltd 
* start date: 2012-11-27 09:56:30 GMT 
* expire date: 2012-12-27 09:56:30 GMT 
* issuer: C=GB; ST=Berkshire; L=Newbury; O=My Company Ltd 
* SSL certificate verify result: self signed certificate (18), continuing anyway. 
* Server auth using Basic with user 'admin' 
> GET /HEAD HTTP/1.1 
Authorization: Basic REMOVED 
User-Agent: git/1.7.11.4 
Host: git.myserver.org 
Accept: */* 
Pragma: no-cache 

< HTTP/1.1 200 OK 
< Server: nginx 
< Date: Thu, 29 Nov 2012 01:42:36 GMT 
< Content-Type: text/plain 
< Connection: close 
< Expires: Fri, 01 Jan 1980 00:00:00 GMT 
< Pragma: no-cache 
< Cache-Control: no-cache, max-age=0, must-revalidate 
< Content-Length: 23 
< Last-Modified: Wed, 28 Nov 2012 12:09:23 +0000 
< 
* Closing connection #0 
Password for 'https://[email protected]': 
* Couldn't find host git.myserver.org in the .netrc file; using defaults 
* About to connect() to git.myserver.org port 443 (#0) 
* Trying 111.222.333.444... 
* Connected to git.myserver.org (111.222.333.444) port 443 (#0) 
* Connected to git.myserver.org (111.222.333.444) port 443 (#0) 
* SSL connection using DHE-RSA-AES256-SHA 
* Server certificate: 
* subject: C=GB; ST=Berkshire; L=Newbury; O=My Company Ltd 
* start date: 2012-11-27 09:56:30 GMT 
* expire date: 2012-12-27 09:56:30 GMT 
* issuer: C=GB; ST=Berkshire; L=Newbury; O=My Company Ltd 
* SSL certificate verify result: self signed certificate (18), continuing anyway. 
> PROPFIND/HTTP/1.1 
User-Agent: git/1.7.11.4 
Host: git.myserver.org 
Accept: */* 
Depth: 0 
Content-Type: text/xml 
Content-Length: 161 
Expect: 100-continue 

< HTTP/1.1 401 Unauthorized 
< Server: nginx 
< Date: Thu, 29 Nov 2012 01:42:43 GMT 
< Content-Type: text/html 
< Content-Length: 188 
< Connection: close 
< WWW-Authenticate: Basic realm="Restricted" 
< 
* Excess found in a non pipelined read: excess = 188 url =/(zero-length body) 
* Closing connection #0 
* Issue another request to this URL: 'https://[email protected]/' 
* Couldn't find host git.myserver.org in the .netrc file; using defaults 
* About to connect() to git.myserver.org port 443 (#0) 
* Trying 111.222.333.444... 
* Connected to git.myserver.org (111.222.333.444) port 443 (#0) 
* Connected to git.myserver.org (111.222.333.444) port 443 (#0) 
* SSL re-using session ID 
* SSL connection using DHE-RSA-AES256-SHA 
* old SSL session ID is stale, removing 
* Server certificate: 
* subject: C=GB; ST=Berkshire; L=Newbury; O=My Company Ltd 
* start date: 2012-11-27 09:56:30 GMT 
* expire date: 2012-12-27 09:56:30 GMT 
* issuer: C=GB; ST=Berkshire; L=Newbury; O=My Company Ltd 
* SSL certificate verify result: self signed certificate (18), continuing anyway. 
* Server auth using Basic with user 'admin' 
> PROPFIND/HTTP/1.1 
Authorization: Basic REMOVED 
User-Agent: git/1.7.11.4 
Host: git.myserver.org 
Accept: */* 
Depth: 0 
Content-Type: text/xml 
Content-Length: 161 
Expect: 100-continue 

< HTTP/1.1 100 Continue 
* We are completely uploaded and fine 
* The requested URL returned error: 404 
* Closing connection #0 
error: Cannot access URL https://[email protected]/, return code 22 
fatal: git-http-push failed 

後端fcgiwrap還抱怨在日誌中,如下所示:

Request not supported: '/home/admin/repo/info/refs?service=git-receive-pack' 

在同一時期,Nginx的報告錯誤以下的日誌(其中出現正常鑑於GIT中推正在發送請求):

2012/11/29 09:52:42 [error] 15091#0: *3257838 no user/password was provided for basic authentication, client: 222.055.121.111, server: git.myserver.org, request: "GET /info/refs?service=git-receive-pack HTTP/1.1", host: "git.myserver.org" 
2012/11/29 09:52:45 [error] 15092#0: *3257989 user "admin": password mismatch, client: 222.055.121.111, server: git.myserver.org, request: "GET /info/refs?service=git-receive-pack HTTP/1.1", host: "git.myserver.org" 
2012/11/29 09:53:02 [error] 15090#0: *3258816 no user/password was provided for basic authentication, client: 222.055.121.111, server: git.myserver.org, request: "PROPFIND/HTTP/1.1", host: "git.myserver.org" 

爲了完整性起見,這裏是nginx.conf的相關部分:

# Git 
server { 
    listen 80; 
    listen 443 ssl; 
    server_name git.myserver.org; 

    access_log /home/admin/repo.deploy.log combined; 
    ssl_certificate /etc/nginx/git.myserver.org.self.crt; 
    ssl_certificate_key /etc/nginx/git.myserver.org.self.key; 

    location/{ 
     auth_basic "Restricted"; 
     auth_basic_user_file /etc/nginx/nginx.htpasswd; 

     include fastcgi_params; 

     fastcgi_param SCRIPT_FILENAME /usr/libexec/git-core/git-http-backend; 
     fastcgi_param GIT_HTTP_EXPORT_ALL ""; 
     fastcgi_param GIT_PROJECT_ROOT /home/admin/repo/; 
     fastcgi_param PATH_INFO $request_uri; 

     fastcgi_pass 127.0.0.1:9001; 
    } 
} 

任何想法如何解決這個問題?謝謝!

+0

僅供參考,使用ssh://推作品。但是,我不能使用ssh,因爲我想在不授予ssh訪問權限的情況下與多個用戶共享回購。 – Hengjie

+0

不知道,但通常調用'git_hhtp_backend'通常需要設置'GIT_HTTP_BACKEND',就像我的Apache配置文件(https://github.com/VonC/compileEverything/blob/master/apache/env.conf.tpl# L49) – VonC

+0

GIT_HTTP_BACKEND是一個必須傳遞給'git_http_backend'的環境變量嗎? – Hengjie

回答

5

的這個問題的答案是PATH_INFO期待$uri$remote_uri

更換:

fastcgi_param PATH_INFO $request_uri;

fastcgi_param PATH_INFO $uri;

解決了這一問題。我還使用http身份驗證添加了fastcgi_param REMOTE_USER $remote_user;

因此,它應該是這樣的:

# Git 
server { 
    listen 80; 
    listen 443 ssl; 
    server_name git.myserver.org; 

    access_log /home/admin/repo.deploy.log combined; 
    ssl_certificate /etc/nginx/git.myserver.org.self.crt; 
    ssl_certificate_key /etc/nginx/git.myserver.org.self.key; 

    location/{ 
     auth_basic "Restricted"; 
     auth_basic_user_file /etc/nginx/nginx.htpasswd; 

     include fastcgi_params; 

     fastcgi_param SCRIPT_FILENAME /usr/libexec/git-core/git-http-backend; 
     fastcgi_param GIT_HTTP_EXPORT_ALL ""; 
     fastcgi_param GIT_PROJECT_ROOT /home/admin/repo/; 
     fastcgi_param PATH_INFO $uri; 
     fastcgi_param REMOTE_USER $remote_user; 

     fastcgi_pass 127.0.0.1:9001; 
    } 
} 
+2

$ uri和$ remote_uri之間的區別在於$ uri不包含參數,$ remote_uri包含參數。 [1](http://wiki.nginx.org/HttpCoreModule)[源代碼]中的正則表達式(https://github.com/git/git/blob/master/http-backend.c)預計會匹配例如'/ info/refs $',其中$表示行尾,因此,傳遞PATH_INFO和'/ info/refs?service = git-receive-pack'不會起作用,因爲它只能匹配'/ info /參考# – Hengjie

+0

非常有趣的反饋。 +1 – VonC

+0

謝謝。因爲我正在通過SSL做所有事情,所以我親自刪除了'listen 80'。 – Hengjie

相關問題