【问题标题】:How to serve GIT through HTTP via NGINX with user/password?如何使用用户/密码通过 NGINX 通过 HTTP 服务 GIT?
【发布时间】:2011-09-18 20:16:06
【问题描述】:

尽管我找到了有关如何配置 git/nginx 以获取我的存储库的所有链接,但我无法让它们工作。

我按照本教程进行操作,Git repository over HTTP WebDAV with nginx,但用户/密码限制不起作用。任何人都可以克隆存储库。

我来自使用 SVN + Apache + DAV_SVN 的配置,带有一个密码文件(使用 htpasswd 创建)和一个用于 authz 的文件。我也想做同样的事情,使用 git+nginx。这怎么可能?

感谢您的帮助!

【问题讨论】:

    标签: git nginx


    【解决方案1】:

    看看下面的文章,http://www.toofishes.net/blog/git-smart-http-transport-nginx/

    它提供了一个示例 nginx 配置:

    http {
        ...
        server {
            listen       80;
            server_name  git.mydomain.com;
    
            location ~ /git(/.*) {
                # fcgiwrap is set up to listen on this host:port
                fastcgi_pass  localhost:9001;
                include       fastcgi_params;
                fastcgi_param SCRIPT_FILENAME     /usr/lib/git-core/git-http-backend;
                # export all repositories under GIT_PROJECT_ROOT
                fastcgi_param GIT_HTTP_EXPORT_ALL "";
                fastcgi_param GIT_PROJECT_ROOT    /srv/git;
                fastcgi_param PATH_INFO           $1;
            }
        }
    }
    

    这样做是将位于 /git 之后的存储库传递给/usr/lib/git-core/git-http-backend。例如,http://git.mydomain.com/git/someapp 将指向 someapp 存储库。此 repo 将位于 /srv/git/someapp 中,如 GIT_PROJECT_ROOTfastcgi_param 中定义的那样,并且可以更改以适合您的服务器。

    这非常有用,您可以将HttpAuthBasicModule 应用于 nginx 以密码保护您的 repo 通过 HTTP 的访问。

    编辑:如果您缺少 git-http-backend,您可以在 Ubuntu/Debian 或基于 RPM 的平台上安装 git-core 软件包,查看 How can git be installed on CENTOS 5.5?

    【讨论】:

    • 我按照这个例子在 nginx 上设置了 git。但是每次我尝试克隆 repo 时都会出现错误:fatal: http://<ip>:9000/git/test.git/info/refs not valid: is this a git re pository? 没有错误是 /var/log/nginx/error.log 并且在访问日志中我可以看到: - - [03/Oct/ 2015:08:35:42 +0200]“GET /git/test.git/info/refs?service=git-upload-pack HTTP/1.1”200 424859“-”“git/1.9.4.msysgit.1”您是否遇到过类似的问题?谢谢,Janusz
    • 否,但请确保它是使用 git init --bare 创建的裸存储库。即,不要托管签出的代码,除非你正在做git clone <repo> --bare - 除此之外,谷歌应该提供帮助
    • 我最终找到了对我有用的示例:serverfault.com/questions/483726/…。谢谢。
    • ALSO,在裸存储库上运行 git update-server-info,我得到了 404 的 .git/info/refs 文件,这将生成。
    • 在我的例子中,fcgi 没有监听任何端口,除了套接字,我所要做的就是将 fastcgi_pass localhost:9001; 更改为 fastcgi_pass unix:/run/fcgiwrap.socket;
    【解决方案2】:

    这是基于 HTTP 的 Git 的完整配置,具有 TLS 加密、基本身份验证和 GitWeb。我假设存储库的根在/home/git。您应该将 example.com 替换为您的域。

    # Remove this block if you don't want TLS
    server {
        listen 80;
        server_name git.example.com;
        return 301 https://$host$request_uri;
    }
    
    server {
        listen       443 ssl; # Replace 443 ssl by 80 if you don't want TLS
        server_name  git.example.com;
        root         /usr/share/gitweb; # Remove if you don't want Gitweb
    
        error_log  /home/git/nginx-error.log;
        access_log /home/git/nginx-access.log;
    
        # Remove ssl_* lines if you don't want TLS
        ssl_certificate           /etc/letsencrypt/live/git.example.com/fullchain.pem;
        ssl_certificate_key       /etc/letsencrypt/live/git.example.com/privkey.pem;
        ssl_protocols             TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        ssl_ciphers               'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
    
        # Remove auth_* if you don't want HTTP Basic Auth
        auth_basic "example Git";
        auth_basic_user_file /etc/nginx/.htpasswd;
    
        # static repo files for cloning over https
        location ~ ^.*\.git/objects/([0-9a-f]+/[0-9a-f]+|pack/pack-[0-9a-f]+.(pack|idx))$ {
            root /home/git/;
        }
    
        # requests that need to go to git-http-backend
        location ~ ^.*\.git/(HEAD|info/refs|objects/info/.*|git-(upload|receive)-pack)$ {
            root /home/git/;
    
            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  $document_root;
            fastcgi_param GIT_HTTP_EXPORT_ALL "";
            fastcgi_param REMOTE_USER $remote_user;
            include fastcgi_params;
        }
    
        # Remove all conf beyond if you don't want Gitweb
        try_files $uri @gitweb;
        location @gitweb {
            fastcgi_pass  unix:/var/run/fcgiwrap.socket;
            fastcgi_param SCRIPT_FILENAME   /usr/share/gitweb/gitweb.cgi;
            fastcgi_param PATH_INFO         $uri;
            fastcgi_param GITWEB_CONFIG     /etc/gitweb.conf;
            include fastcgi_params;
       }
    }
    

    你必须安装 Git、Gitweb 和 FastCgiWrap:

    sudo apt-get install git gitweb fcgiwrap
    

    对于 TLS,我使用Let's Encrypt 免费证书。

    sudo letsencrypt certonly -d git.example.com --rsa-key-size 4096
    

    要访问 Gitweb,只需浏览到 git.example.com。您还需要对其进行配置以设置存储库的根目录:

    sudo vim /etc/gitweb.conf
    

    为了获得HTTP Basic Auth,您必须使用htpasswd命令将用户添加到/etc/nginx/.htpasswd

    sudo apt-get install apache2-utils
    sudo htpasswd -c /etc/nginx/.htpasswd username
    

    下次运行命令时去掉-c开关,因为它只创建文件(Nginx在其配置目录中默认没有.htpasswd文件)。

    如果你想要更复杂、更强大、类似于 GitHub 的东西,请查看Gitlab

    【讨论】:

    • 我现在这是一篇很老的帖子,但我似乎无法让推送工作 - 它总是导致504。我只对您的配置进行了微小的调整。你有过这个工作吗?
    • 是的,它正在工作(实际上它仍在工作,但自从那个答案之后就没有碰过它)。
    • 您介意查找已安装的 fcgiwrap 和 git 版本吗?如果你来德国,我愿意赞助你喝啤酒:)
    • 啊哈,我怎么能拒绝:) -- git 2.11.0 / fcgiwrap 1.1.0
    • 一开始推送时我也遇到了 HTTP 504 错误(网关超时);对我来说,这是由权限问题引起的:fcgiwrap 以用户 www-data 的身份运行,但 git 存储库目录归另一个用户所有。
    【解决方案3】:

    添加更多细节,我们需要 3 个组件:nginxgit-http-backendfcgiwrap

    • git-http-backend 是一个独立的可执行二进制文件,可以从 https://github.com/git/git 构建。这是官方处理git http/https访问的解决方案,不知道是不是最好的。
    • Nginx 没有内置的通用 FastCGI 服务器(或者我没有找到如何正确使用 nginx 的fastcgi_bind)。 所以应该使用另一个fastcgi服务器,比如fcgiwarp(一本很好的手册https://www.nginx.com/resources/wiki/start/topics/examples/fcgiwrap/)
    • 在 nginx 配置中使用fastcgi_pass unix:/tmp/cgi.sock;(参考其他答案)

    fastcgi 不是必须的,git-http-backend 也不是只为 fastcgi 写的,fastcgi 不是最简单的,也不是性能的。 例如,我写了一个servlet,用来在nginx和git-http-backend之间进行交互,使用nginx的proxy_pass,也可以!

    【讨论】:

    • 介意与 proxy_pass 分享您的设置吗?
    猜你喜欢
    • 1970-01-01
    • 2020-12-24
    • 2015-04-24
    • 2016-11-01
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多