Howto Nginx + git-http-backend + fcgiwrap(Debian Squeeze)

我想用Nginx设置git-http-backend,但是在24小时之后浪费时间和阅读所有我能想到的configuration应该可以工作,但是不能。

server { listen 80; server_name mydevserver; access_log /var/log/nginx/dev.access.log; error_log /var/log/nginx/dev.error.log; location / { root /var/repos; } location ~ /git(/.*) { gzip off; root /usr/lib/git-core; fastcgi_pass unix:/var/run/fcgiwrap.socket; include /etc/nginx/fastcgi_params2; 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 /var/repos; fastcgi_param PATH_INFO $1; #fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; } } 

/ etc / nginx / fastcgi_params2的内容

 fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; fastcgi_param REMOTE_USER $remote_user; # required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200; 

但configuration似乎不工作

     $ git clone http:// mydevserver / git / myprojectname /
    克隆到myprojectname中
    警告:远程HEAD是指不存在的裁判,无法结帐。

我可以申请一个不感兴趣的项目,我会得到同样的答案

     $ git clone http:// mydevserver / git / thisprojectdoesntexist /
    克隆到这个项目是不是...
    警告:远程HEAD是指不存在的裁判,无法结帐。

如果我将根改为/ usr / lib,我将得到一个403错误,这将报告给nginx错误日志:

     2011/11/23 15:52:46 [error] 5224#0:* 55在stderr中发送FastCGI:“无法获取脚本
    名称,是DOCUMENT_ROOT和SCRIPT_NAME设置,并且是可执行的脚本?
    读取来自上游的响应头,客户端:198.168.0.4,服务器:mydevserver,
    请求:“GET / git / myprojectname / info / refs HTTP / 1.1”,上游:
     “fastcgi:// unix:/var/run/fcgiwrap.socket:”,主机:“mydevserver”

我的主要问题是使用此configuration的正确根值。 也许有一些权限问题。

笔记:

  • / var / repos /由www-data拥有,并包含文件夹位git裸回购。

  • 所有这一切使用SSH完美。

  • 如果我使用浏览器访问http:// mydevserver / git / myproject / info / refs ,则由git-http-backend回答,要求我发送命令。

  • /var/run/fcgiwrap.socket有777个权限。

向下移动fastcgi_pass ; 它应该是最新的一行。

首先你应该设置参数,只有fastcgi_pass ,否则你将不会得到设置的环境。

fastcgi_pass unix:/var/run/fcgiwrap.socket;

尝试改变configuration文件中两行之间的顺序:

 include /etc/nginx/fastcgi_params2; fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend; 

这可能是在debian squeeze(1.0-1 + squeeze1)上find的fcgiwrap版本的bug。 请参阅http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=698071

升级到fcgiwrap 1.0.3-3(在debiantesting中find)解决了我的问题。 这里是我使用的configuration(注意我不需要定义“根”):

 server { listen 80; server_name mydevserver; access_log /var/log/nginx/dev.access.log; error_log /var/log/nginx/dev.error.log; location ~ /git(/.*) { gzip off; fastcgi_pass unix:/var/run/fcgiwrap.socket; include /etc/nginx/fastcgi_params2; fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend; fastcgi_param GIT_HTTP_EXPORT_ALL ""; fastcgi_param GIT_PROJECT_ROOT /var/repos; fastcgi_param PATH_INFO $1; } }