我已经以许多不同的方式尝试过这个。这可能是我想出的最佳配置。
nginx
:
server {
server_name git.domain.com;
access_log /var/log/nginx/git.domain.com-access.log;
error_log /var/log/nginx/git.domain.com-error.log;
include common;
location / {
fastcgi_pass unix:/var/run/fcgiwrap.socket;
# fastcgi_param DOCUMENT_ROOT /home/yuri/git;
# fastcgi_param SCRIPT_NAME /1.pl;
fastcgi_param DOCUMENT_ROOT /usr/lib/git-core;
fastcgi_param SCRIPT_NAME /git-http-backend;
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT /home/yuri/git;
fastcgi_param GIT_HTTP_EXPORT_ALL "";
fastcgi_param GIT_PROJECT_ROOT /home/yuri/git;
fastcgi_param PATH_INFO $request_uri;
}
}
我写了一个小脚本来拦截 和 之间的fcgiwrap
数据git-http-backend
。这里是:
#!/usr/bin/perl
use Data::Dumper;
my $output = `/usr/lib/git-core/git-http-backend`;
open my $fh, '>', '/home/yuri/git/1/1.txt';
print $fh $output;
print $fh Dumper {map {$_ => $ENV{$_}} 'QUERY_STRING', 'REQUEST_METHOD', 'CONTENT_TYPE', 'CONTENT_LENGTH', 'SCRIPT_NAME', 'REQUEST_URI', 'DOCUMENT_URI', 'DOCUMENT_ROOT', 'SERVER_PROTOCOL', 'GATEWAY_INTERFACE', 'SERVER_SOFTWARE', 'REMOTE_ADDR', 'REMOTE_PORT', 'SERVER_ADDR', 'SERVER_PORT', 'SERVER_NAME', 'REDIRECT_STATUS'};
print $output;
这是我得到的输出:
$ git clone http://git.domain.com/1.git
Cloning into '1'...
fatal: http://git.domain.com/1.git/info/refs?service=git-upload-pack not found: did you run git update-server-info on the server?
显然,我确实跑了git update-server-info
。因为例如我可以克隆这个存储库而无需git-http-backend
:
server {
server_name git.domain.com;
root /home/yuri/git;
}
这是我得到的数据1.txt
:
Status: 404 Not Found^M
Expires: Fri, 01 Jan 1980 00:00:00 GMT^M
Pragma: no-cache^M
Cache-Control: no-cache, max-age=0, must-revalidate^M
^M
$VAR1 = {
'SERVER_NAME' => 'git.domain.com',
'SCRIPT_NAME' => '/1.git/info/refs',
'CONTENT_LENGTH' => '',
'REQUEST_METHOD' => 'GET',
'SERVER_SOFTWARE' => 'nginx/0.7.67',
'REMOTE_PORT' => '53908',
'QUERY_STRING' => 'service=git-upload-pack',
'SERVER_PORT' => '80',
'REDIRECT_STATUS' => '200',
'REMOTE_ADDR' => 'x.x.x.x',
'CONTENT_TYPE' => '',
'SERVER_PROTOCOL' => 'HTTP/1.1',
'DOCUMENT_URI' => '/1.git/info/refs',
'REQUEST_URI' => '/1.git/info/refs?service=git-upload-pack',
'GATEWAY_INTERFACE' => 'CGI/1.1',
'SERVER_ADDR' => 'x.x.x.x',
'DOCUMENT_ROOT' => '/home/yuri/git'
};
我在跑Debian squeeze
,,,,fcgiwrap-1.0
。git-1.7.2.5
nginx-0.7.67
UPD如果有人至少可以向我提供我在 apache 下的脚本输出,我将不胜感激?
附带一提,这个版本的 fcgiwrap 忽略了SCRIPT_FILENAME
. DOCUMENT_ROOT
并SCRIPT_NAME
连接起来并再次拆分回脚本名称和PATH_INFO
. 但是第一个fastcgi_param DOCUMENT_ROOT
必须指向正确的位置,否则fcgiwrap
会因为某些原因找不到要启动的脚本。也就是说,这不起作用:
fastcgi_param DOCUMENT_ROOT $document_root; # /usr/local/nginx/html
fastcgi_param DOCUMENT_ROOT /home/yuri/git;
但这有效:
fastcgi_param DOCUMENT_ROOT /home/yuri/git;
fastcgi_param DOCUMENT_ROOT $document_root; # /usr/local/nginx/html
nginx
这就是稍微晦涩的配置背后的原因:
fastcgi_param DOCUMENT_ROOT /usr/lib/git-core;
...
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT /home/yuri/git;
但是当它工作时有一些设置......
DOCUMENT_ROOT
+SCRIPT_NAME
不能与 组合PATH_INFO
。请改用绝对值SCRIPT_FILENAME
(因为您的git-http-backend
程序位于文档根目录之外)。作为调试提示,要测试智能 HTTP 是否有效,请查看您的访问日志。
以下配置在 Debian 7.0 Wheezy 上测试:
添加选项 like
GIT_HTTP_EXPORT_ALL
是读者的练习。它不起作用的问题
PATH_INFO
是设置不正确。由于 "DOCUMENT_ROOT
和SCRIPT_NAME
被连接起来并再次拆分回脚本名称和PATH_INFO
"。这是有效的配置:然后你可以像这样克隆存储库:
1.git
位于/home/yuri/git
. _