我正在尝试设置一个服务器,以便通过 HTTP(S) 访问我的 git repo。
我正在使用 gitolite 和 nginx(以及 gitlab 作为 Web 界面,但我怀疑它没有任何区别)。
我搜索了整个下午,但我觉得我陷入困境了。
我认为我已经理解 nginx 需要 fcgiwrap 才能与 gitolite 一起工作,因此我尝试了几种配置,但都不起作用。
我的存储库位于 /home/git/repositories。
以下是我尝试过的三种 nginx 配置。
1:
location ~ /git(/.*) {
gzip off;
root /usr/lib/git-core;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
include /etc/nginx/fcgiwrap.conf;
fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend;
fastcgi_param DOCUMENT_ROOT /usr/lib/git-core/;
fastcgi_param SCRIPT_NAME git-http-backend;
fastcgi_param GIT_HTTP_EXPORT_ALL "";
fastcgi_param GIT_PROJECT_ROOT /home/git/repositories;
fastcgi_param PATH_INFO $1;
#fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
}
结果:
> git clone http://myservername/projectname.git test/
Cloning into test...
fatal: http://myservername/projectname.git/info/refs not found: did you run git update-server-info on the server?
和
> git clone http://myservername/git/projectname.git test/
Cloning into test...
error: The requested URL returned error: 502 while accessing http://myservername/git/projectname.git/info/refs
fatal: HTTP request failed
2:
location ~ /git(/.*) {
fastcgi_pass localhost:9001;
include /etc/nginx/fcgiwrap.conf;
fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend;
fastcgi_param GIT_HTTP_EXPORT_ALL "";
fastcgi_param GIT_PROJECT_ROOT /home/git/repositories;
fastcgi_param PATH_INFO $1;
}
结果:
> git clone http://myservername/projectname.git test/
Cloning into test...
fatal: http://myservername/projectname.git/info/refs not found: did you run git update-server-info on the server?
和
> git clone http://myservername/git/projectname.git test/
Cloning into test...
error: The requested URL returned error: 502 while accessing http://myservername/git/projectname.git/info/refs
fatal: HTTP request failed
3:
location ~ ^.*\.git/objects/([0-9a-f]+/[0-9a-f]+|pack/pack-[0-9a-f]+.(pack|idx))$ {
root /home/git/repositories/;
}
location ~ ^.*\.git/(HEAD|info/refs|objects/info/.*|git-(upload|receive)-pack)$ {
root /home/git/repositories;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend;
fastcgi_param PATH_INFO $uri;
fastcgi_param GIT_PROJECT_ROOT /home/git/repositories;
include /etc/nginx/fcgiwrap.conf;
}
结果:
> git clone http://myservername/projectname.git test/
Cloning into test...
error: The requested URL returned error: 502 while accessing http://myservername/projectname.git/info/refs
fatal: HTTP request failed
和
> git clone http://myservername/git/projectname.git test/
Cloning into test...
error: The requested URL returned error: 502 while accessing http://myservername/git/projectname.git/info/refs
fatal: HTTP request failed
另请注意,无论使用哪种配置,当我尝试使用实际上不存在的项目名称进行克隆时,都会出现 502 错误。
有没有人已经成功做到这一点? 我做错了什么?
谢谢。
更新:
nginx 错误日志文件说:
2012/04/05 17:34:50 [crit] 21335#0: *50 connect() to unix:/var/run/fcgiwrap.socket failed (13: Permission denied) while connecting to upstream, client: 192.168.12.201, server: myservername, request: "GET /git/oct_editor.git/info/refs HTTP/1.1", upstream: "fastcgi://unix:/var/run/fcgiwrap.socket:", host: "myservername"
因此我更改了 /var/run/fcgiwrap.socket 的权限,现在我有:
> git clone http://myservername/git/projectname.git test/
Cloning into test...
error: The requested URL returned error: 403 while accessing http://myservername/git/projectname.git/info/refs
fatal: HTTP request failed
这是我现在拥有的 error.log 文件:
2012/04/05 17:36:52 [error] 21335#0: *78 FastCGI sent in stderr: "Cannot chdir to script directory (/usr/lib/git-core/git/projectname.git/info)" while reading response header from upstream, client: 192.168.12.201, server: myservername, request: "GET /git/projectname.git/info/refs HTTP/1.1", upstream: "fastcgi://unix:/var/run/fcgiwrap.socket:", host: "myservername"
我会继续调查。
答案1
这是我在 Apache 配置中设置的内容(我知道:不是 nginx,但仍然可以帮助您):
SetEnv GIT_PROJECT_ROOT @H@/repositories
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv GITOLITE_HTTP_HOME @H@
ScriptAlias /hgit/ @H@/gitolite/bin/gl-auth-command/
SetEnv GIT_HTTP_BACKEND "@H@/usr/local/apps/git/libexec/git-core/git-http-backend"
(在我的例子中,是存储库的存储@H@
路径).gitolite.rc
我没有看到你的配置中GITOLITE_HTTP_HOME
定义GIT_HTTP_BACKEND
。
请参阅完整配置在这里。
答案2
这是一个老问题,但当我在寻找它时它首先出现,所以我想发布对至少部分问题的答案。
为了方便起见,我只会参考您的尝试#1。
我认为你在这里遇到的主要问题是这一行:
fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend;
您在这里所做的是将请求传递给 git 后端,但我认为您希望将其传递给 gitolite 后端:
fastcgi_param SCRIPT_FILENAME /path/to/gitolite/base/gitolite/src/gitolite-shell;
所以我认为当你尝试时:
git clone http://myservername/projectname.git
Git 愉快地寻找了一些东西,但找不到它(因为您根据服务器映射将 git 设置到了错误的位置)。但是当您尝试:
git clone http://myservername/git/projectname.git
Git 无法执行任何操作,因为 gitolite 拥有 nginx 配置中该位置的 GIT_PROJECT_ROOT。
您可能还希望使脚本在 gitolite bin 中可用,并将 nginx 指向那里---似乎是惯例:
/path/to/gitolite/base/bin/gitolite-shell
将 nginx 指向 gitolite 后端将解决您的服务器错误问题。
我现在遇到了“无法找到存储库”错误,但我认为这是因为我的 http basic auth 用户与我的 gitolite 用户权限不匹配。如果我愿意尝试解决这个问题,我会更新。
值得注意的是,如果您对此服务器使用基本身份验证(因为您刚刚发布了位置配置,而不是整个服务器),则您的脚本可能存在第二个问题。在这种情况下,您需要将经过身份验证的用户传递给 gitolite。对于正常的 git 设置,您实际上也需要这样做:
fastcgi_param REMOTE_USER $remote_user;
我应该指出,如果 gitolite 在这方面的要求与普通 git 不同,这可能也与我的“找不到存储库”问题有关。我怀疑 gitolite 可能需要这个,无论是否启用身份验证,除非你能得到使用 nginx 实现 gitolite 的匿名访问。
注意:我认为有多种方法可以将请求传递给 git 或 gitolite。因此,如果您为 git 设置了 http,则通常建议使用以下方法(您使用过),并且该方法有效:
fastcgi_param PATH_INFO $1;
但对于 gitolite,你会看到不同的替代方案。最常见的是:
fastcgi_param PATH_INFO $fastcgi_path_info;
我使用的是前者,正如我所说,它似乎有效。但我的问题可能是 nginx 没有正确传递路径(而不是“用户”问题)。值得注意。