Nginx git服务器返回错误500

时间:2015-05-06 15:33:57

标签: windows git bash nginx

我正在尝试为裸git存储库设置一个nginx远程服务器(使用ssl),但是当从git bash(Windows 7计算机)尝试error 500时获取git clone https://my.domain.com/repo.git

我目前的配置如下所示。

Nginx服务器配置:

server {
  listen: 80;
  server_name my.domain.com;
  # Redirect all non-HTTPS traffic to the HTTPS version
  return 301 https://my.domain.com;
}

server {
  listen 443 ssl;
  server_name my.domain.com;
  root /var/www/git;
  index index.html;

  ssl_certificate /etc/nginx/ssl/nxing.crt;
  ssl_certificate_key /etc/nginx/ssl/nginx.key;

  access_log /var/www/git/git.access.log;
  error_log /var/www/git/git.error.log;

  auth_basic "Git authentication required";
  auth_basic_user_file /etc/nginx/users_git;

  location / {
    client_max_body_size 0;

    include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_FILENAME /usr/libexec/git-core/git-http-backend;
    fastcgi_param GIT_HTTP_EXPORT_ALL "";
    fastcgi_param GIT_PROJECT_ROOT /repo.git;
    fastcgi_param PATH_INFO $1;
    fastcgi_param REMOTE_USER $remote_user;

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

我已经咨询了这个来源以获取有关设置fcgiwrap的帮助:http://knowledgebase.cc/en/software-en/linux-en/how-to-install-fcgiwrap-to-serving-cgiperl-scripts-in-nginx/

运行git clone http://my.domain.com/repo.git时收到的确切错误:

  

克隆到'repo'...致命:无法访问“http://my.domain.com/repo.git”:请求的网址返回错误:   500

这是来自URL访问日志的摘录:

  

1xx.xxx.xxx.xx - [06 / May / 2015:17:29:02 +0200]“GET / HTTP / 1.1”500 5“ - ”“git / 1.9.5.msysgit 0.1"

网址的错误日志为空。

我已经完成了每一步,详细介绍了这篇文章中描述的另一个人:https://superuser.com/questions/719949/centos-5-nginx-git-http-backend 但到目前为止我没有成功。

更新#1

我已经尝试在nginx服务器配置的位置设置中注释掉fastgci参数并指定位置网址本身,从而产生了这个

location /repo.git {
  client_max_body_size 0;

  [...] commented fastcgi params [...]
}

结果是,当我尝试git clone http://my.domain.com/repo.git时,我在git bash中得到以下输出:

  

克隆到'repo'......   “http://my.domain.com”的用户名:git
  “http://git@my.domain.com”的密码:...   致命:http://my.domain.com/repo.git/info/refs无效:这是一个git存储库吗?

但我可以在浏览器中同时联系http://my.domain.comhttp://my.domain.com/repo.git

更新#2

我在这个网站上有一个战利品:http://weininger.net/configuration-of-nginx-for-gitweb-and-git-http-backend.html,它以某种方式帮助我解决了我的问题。

我的最终Nginx服务器配置现在如下所示:

server {
  listen 80;
  server_name my.domain.com;
  # Redirect all non-HTTPS traffic to the HTTPS version
  rewrite ^ https://$server_name$request_uri? permanent;
}

server {
  listen 443 ssl;
  server_name my.domain.com;
  root /var/www/git;
  index index.html;

  ssl_certificate /etc/nginx/ssl/nginx.crt;
  ssl_certificate_key /etc/nginx/ssl/nginx.key;

  access_log /var/www/git/git.access.log;
  error_log /var/www/git/git.error.log;

  auth_basic "Git authentication required";
  auth_basic_user_file /etc/nginx/users_git;

  location ~ ^.*\.git/(HEAD|info/refs|objects/info/.*|git-(upload|receive)-pack)$ {

    include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_FILENAME /usr/libexec/git-core/git-http-backend;
    fastcgi_param GIT_HTTP_EXPORT_ALL "";
    fastcgi_param GIT_PROJECT_ROOT /var/www/git;
    fastcgi_param PATH_INFO $uri;
    fastcgi_param REMOTE_USER $remote_user;

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

这使我能够正确地执行git clonegit pull而没有任何错误,但git push会给我以下错误

  

计数物体:4,完成。
  Delta压缩最多使用4个线程。
  压缩对象:100%(2/2),完成。
  写入对象:100%(3/3),312字节| 0字节/秒,完成。
  总计3(delta 0),重用0(delta 0)
  错误:解包失败:解包 - 对象异常退出
  致http://my.domain.com/repo.git
   ! [远程拒绝]主人 - >主人(不适用(拆包商错误))
  错误:无法将某些引用推送到“http://my.domain.com/repo

更新#3

似乎unpack failed错误是由于权限问题造成的。即使我做chown -R git:git repo.git我也无法推送到存储库。但是chown -R git:nginx repo.git正在解决它。我部分理解这一点,考虑到fastcgi脚本在写作(我猜?),而Nginx又产生了这个脚本。

为了更好地学习和理解事物,如果有人可以的话,对于为什么这些设置按照他们的方式工作的一些澄清或更深层次的解释会很棒。

1 个答案:

答案 0 :(得分:0)

通过大量(重新)搜索和试用/错误解决了我的问题。我已采取的步骤将在问题的更新中详细记录。