nginx+uWSGI环境下git-http-backend推送失败问题求助
我来帮你排查这个能克隆但没法推送的问题——毕竟克隆是读操作(GET请求),推送是写操作(POST请求),大概率是权限或者请求转发的配置没到位。咱们一步步来:
1. 先检查Nginx+uWSGI的请求转发配置
首先得确保POST请求能被正确传递到git-http-backend,而且关键的环境变量没配错。
Nginx配置要点
你的Nginx配置里必须允许POST请求,同时正确设置git-http-backend需要的环境变量,还要把请求转发给uWSGI:
location ~ ^/test.git(/.*)?$ { # 只允许GET/POST请求,其他直接拒绝 limit_except GET POST { deny all; } # 设置git-http-backend的核心环境变量 uwsgi_param GIT_HTTP_EXPORT_ALL ""; # 替换成你的实际仓库根目录,比如/var/git/repos uwsgi_param GIT_PROJECT_ROOT /var/git/repos; uwsgi_param PATH_INFO $1; # 转发到uWSGI的socket路径 uwsgi_pass unix:/path/to/your/uwsgi.sock; include uwsgi_params; }
uWSGI配置要点
因为git-http-backend是CGI程序,你得在uWSGI配置里启用CGI支持,比如在你的uwsgi.ini里加这些:
[uwsgi] socket = /path/to/your/uwsgi.sock # 运行uWSGI的用户,要和仓库权限匹配,比如www-data uid = www-data gid = www-data # 启用CGI模式,指向git-http-backend的实际路径(可通过which git-http-backend查询) cgi = /usr/lib/git-core/git-http-backend # 路由匹配你的仓库路径 route = ^/test.git(/.*)?$ cgi:/usr/lib/git-core/git-http-backend
2. 检查仓库的权限与类型
推送失败最常见的原因就是权限不够或者仓库类型不对:
- 权限检查:确保uWSGI运行的用户(比如www-data)对仓库目录有写入权限:
# 给用户赋予仓库目录的读写权限 chown -R www-data:www-data /var/git/repos/test.git chmod -R g+w /var/git/repos/test.git - 仓库类型检查:非bare仓库默认禁止推送,你可以检查仓库是否为bare类型:
如果输出是cd /var/git/repos/test.git git config core.barefalse,要么把它转成bare仓库(推荐),要么修改配置允许非bare仓库推送(不推荐生产环境用):# 转成bare仓库的步骤(先备份原仓库) mv /var/git/repos/test.git /var/git/repos/test.git.backup git clone --bare /var/git/repos/test.git.backup /var/git/repos/test.git
3. 验证认证配置(如果需要)
如果你的仓库需要密码认证,得确保Nginx配置了HTTP认证,且POST请求也会经过认证:
location ~ ^/test.git(/.*)?$ { auth_basic "Git Repository Access"; auth_basic_user_file /etc/nginx/.git-htpasswd; # 其他转发配置同上... }
另外你的日志提到没找到example.com的.netrc记录,推送时如果弹出密码提示,要确认输入的用户名密码是有权限推送的账号。
4. 查看服务器端日志找细节
你的客户端日志只显示了连接过程,服务器端的日志能给出更直接的错误原因:
- 查看Nginx错误日志:
tail -f /var/log/nginx/error.log - 查看uWSGI错误日志:根据你配置里的
logto路径,比如tail -f /var/log/uwsgi/git.log
比如日志里如果出现permission denied,就是权限问题;如果出现no such file or directory,就是git-http-backend路径或者仓库根目录配置错误。
内容的提问来源于stack exchange,提问作者Psottek
相关产品推荐
相关产品推荐

