![使用 Nginx 配置 git-http-backend(返回 PROPFIND 405)](https://linux22.com/image/652602/%E4%BD%BF%E7%94%A8%20Nginx%20%E9%85%8D%E7%BD%AE%20git-http-backend%EF%BC%88%E8%BF%94%E5%9B%9E%20PROPFIND%20405%EF%BC%89.png)
我正在尝试通过 nginx 配置 git-http-backend 但遇到了一些麻烦。
实际结果是我收到了 PROPFIND 请求的 405 错误:
192.168.1.45 - - [22/Feb/2015:16:50:46 +0100] "GET /lw/bla.git/info/refs?service=git-receive-pack HTTP/1.1" 200 0 "-" "git/2.3.0" "-"
192.168.1.45 - - [22/Feb/2015:16:50:46 +0100] "GET /lw/bla.git/HEAD HTTP/1.1" 200 23 "-" "git/2.3.0" "-"
192.168.1.45 - - [22/Feb/2015:16:50:46 +0100] "PROPFIND /lw/bla.git/ HTTP/1.1" 405 172 "-" "git/2.3.0" "-"
版本:
- Debian GNU/Linux 7.8(喘息)
- git 版本 2.3.0
- nginx 版本:nginx/1.6.2
- fcgiwrap 版本 1.0.3
配置部分:
nginx 站点配置
server {
listen 443;
server_name git.dloc.com;
access_log /var/log/nginx/git.dloc.access.log main;
error_log /var/log/nginx/git.dloc.error.log;
ssl on;
ssl_certificate /etc/ssl/dloc/dloc.crt;
ssl_certificate_key /etc/ssl/dloc/dloc.key;
location / {
root /var/git;
}
location ~ /git(/.*) {
gzip off;
root /var/git;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/local/libexec/git-core/git-http-backend;
fastcgi_param DOCUMENT_ROOT /usr/local/libexec/git-core;
fastcgi_param SCRIPT_NAME git-http-backend;
fastcgi_param GIT_HTTP_EXPORT_ALL "";
fastcgi_param GIT_PROJECT_ROOT /var/git/;
fastcgi_param PATH_INFO $uri;
fastcgi_param REMOTE_USER $remote_user;
fastcgi_pass unix:/var/run/cgit-fastcgi/cgit-fastcgi.socket;
}
}
fastcgi 套接字
foobar@dloc:/var/git/lw/bla.git$ ls -al /var/run/cgit-fastcgi/
total 0
drwxrwx--- 2 www-data www-data 80 Feb 21 21:23 .
drwxr-xr-x 21 root root 760 Feb 22 16:14 ..
-rw-r--r-- 1 www-data www-data 0 Feb 21 21:23 cgit-fastcgi.pid
srwxr-xr-x 1 www-data www-data 0 Feb 20 22:01 cgit-fastcgi.socket
git-http-后端
foobar@dloc:/var/git/lw$ sudo ls -al /usr/local/libexec/git-core/git-http-backend
-rwxr-xr-x 1 root staff 4447063 Feb 13 23:45 /usr/local/libexec/git-core/git-http-backend
Git 存储库
foobar@dloc:~$ ls -al /var/git/lw/
drwxr-xr-x 7 www-data www-data 4096 Feb 22 00:36 bla.git
它的创建者是:
git --bare init bla.git && \
git config --local --add http.receivepack true && \
git update-server-info
chown -R www-data:www-data bla.git
客户端推送的完整详细信息
* Couldn't find host git.dloc.com in the .netrc file; using defaults
* Trying 192.168.1.45...
* Connected to git.dloc.com (192.168.1.45) port 443 (#0)
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: none
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* Server certificate:
* subject: CN=*.dloc.de
* start date: 2014-11-03 18:44:22 GMT
* expire date: 2015-05-02 18:44:22 GMT
* subjectAltName: git.dloc.com matched
* issuer: O=Root CA; OU=http://www.cacert.org; CN=CA Cert Signing Authority; [email protected]
* SSL certificate verify ok.
> GET /lw/bla.git/info/refs?service=git-receive-pack HTTP/1.1
User-Agent: git/2.3.0
Host: git.dloc.com
Accept: */*
Accept-Encoding: gzip
Pragma: no-cache
< HTTP/1.1 200 OK
< Server: nginx/1.6.2
< Date: Sun, 22 Feb 2015 16:07:58 GMT
< Content-Type: application/octet-stream
< Content-Length: 0
< Last-Modified: Sun, 22 Feb 2015 15:19:11 GMT
< Connection: keep-alive
< ETag: "54e9f36f-0"
< Accept-Ranges: bytes
<
* Connection #0 to host git.dloc.com left intact
* Couldn't find host git.dloc.com in the .netrc file; using defaults
* Found bundle for host git.dloc.com: 0x1070d60
* Re-using existing connection! (#0) with host git.dloc.com
* Connected to git.dloc.com (192.168.1.45) port 443 (#0)
> GET /lw/bla.git/HEAD HTTP/1.1
User-Agent: git/2.3.0
Host: git.dloc.com
Accept: */*
Accept-Encoding: gzip
Pragma: no-cache
< HTTP/1.1 200 OK
< Server: nginx/1.6.2
< Date: Sun, 22 Feb 2015 16:07:58 GMT
< Content-Type: application/octet-stream
< Content-Length: 23
< Last-Modified: Sat, 21 Feb 2015 22:25:43 GMT
< Connection: keep-alive
< ETag: "54e905e7-17"
< Accept-Ranges: bytes
<
* Connection #0 to host git.dloc.com left intact
* Couldn't find host git.dloc.com in the .netrc file; using defaults
* Trying 192.168.1.45...
* Connected to git.dloc.com (192.168.1.45) port 443 (#0)
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: none
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* Server certificate:
* subject: CN=*.dloc.de
* start date: 2014-11-03 18:44:22 GMT
* expire date: 2015-05-02 18:44:22 GMT
* subjectAltName: git.dloc.com matched
* issuer: O=Root CA; OU=http://www.cacert.org; CN=CA Cert Signing Authority; [email protected]
* SSL certificate verify ok.
> PROPFIND /lw/bla.git/ HTTP/1.1
User-Agent: git/2.3.0
Host: git.dloc.com
Accept: */*
Depth: 0
Content-Type: text/xml
Content-Length: 168
Expect: 100-continue
* The requested URL returned error: 405 Not Allowed
* Closing connection 0
error: Cannot access URL https://git.dloc.com/lw/bla.git/, return code 22
fatal: git-http-push failed
error: failed to push some refs to 'https://git.dloc.com/lw/bla.git'
我认为该请求未使用智能 http 后端来处理。但我无法确定原因。
有谁知道我的配置出了什么问题?
提前致谢。
答案1
哦,抱歉,这是我的失误。
我的配置存在问题,我通过 https_://dlock.../lw/bla 克隆存储库,该操作成功完成,原因是:
location / {
root /var/git;
}
但location ~ /git(/.*) {
肯定期望:https_://dloc.../git/lw/bla 通过智能 http 后端 m( 来处理请求。
如果有人偶然发现同样的问题,以下配置对我有用(使用 cgit):
server {
listen 443;
server_name git.dloc.com;
access_log /var/log/nginx/git.dloc.access.log main;
error_log /var/log/nginx/git.dloc.error.log;
ssl on;
ssl_certificate /etc/ssl/dloc/dloc.crt;
ssl_certificate_key /etc/ssl/dloc/dloc.key;
auth_basic "Login";
auth_basic_user_file /etc/apache2/passwd/git.pwd;
location ~ /\. { deny all; }
location ~ /git(.*) {
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/local/libexec/git-core/git-http-backend;
fastcgi_param GIT_HTTP_EXPORT_ALL "";
fastcgi_param GIT_PROJECT_ROOT /var/git;
fastcgi_param PATH_INFO $1;
fastcgi_pass unix:/var/run/cgit-fastcgi/cgit-fastcgi.socket;
}
try_files $uri @cgit;
# Serve static files
location ~* ^.+\.(css|png|ico)$ {
root /var/www/cgit;
expires 30d;
}
location @cgit {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /var/www/cgit/cgit.cgi;
fastcgi_pass unix:/var/run/cgit-fastcgi/cgit-fastcgi.socket;
fastcgi_param HTTP_HOST $server_name;
fastcgi_param PATH_INFO $uri;
fastcgi_param QUERY_INFO $uri;
}
}