【gitlab】部署,外部nginx Workhorse external_url

配置harbor

   Url is blocked: Requests to the local network are not allowed

解决方案 1:允许本地网络请求(推荐用于私有部署)
以管理员身份登录 GitLab

进入 Admin Area (管理区域) > Settings (设置) > Network (网络)

展开 Outbound requests (出站请求) 部分

勾选 Allow requests to the local network from web hooks and services (允许从 web hooks 和服务向本地网络发出请求)

点击 Save changes (保存更改)

参数:external_url

#  如果使用了gitlab 那么生产的gitlab 都要用gitlab作为前缀来访问。通过nginx端口是:80 然后使用http

external_url 'http://10.99.204.137:80/gitlab'

gitlab使用外部nginx代理 puma 

  需要配置GitLab Workhorse

     在使用外部 Nginx 作为反向代理来访问 GitLab 时,配置 gitlab-workhorse 是非常重要的,因为它是 GitLab 架构中的关键组件,负责处理一些高性能和复杂的任务。如果没有正确配置 gitlab-workhorse,可能会导致某些功能无法正常工作,例如大文件上传、Git over HTTP(S) 操作等。

以下是为什么需要配置 gitlab-workhorse 的详细原因:


1. GitLab Workhorse 的职责

gitlab-workhorse 是 GitLab 的一个专用反向代理,它位于外部 Nginx 和 GitLab Rails 应用之间,主要负责以下任务:

  • 高效处理大文件传输

    • 大文件(如 Git LFS 文件、CI/CD 构件等)的上传和下载操作会消耗大量资源。如果直接由 GitLab Rails 应用处理这些请求,会导致性能瓶颈。
    • gitlab-workhorse 通过优化流式传输的方式处理这些请求,显著减轻了 Rails 应用的负担。
  • 支持 Git over HTTP(S)

    • Git 操作(如 git clonegit pushgit fetch 等)通过 HTTP(S) 协议进行时,gitlab-workhorse 负责解析和处理这些请求,并将其转发给 GitLab Rails 应用或直接与 Git 存储交互。
    • 如果没有 gitlab-workhorse,外部 Nginx 可能无法正确处理这些复杂的 Git 请求。
  • WebSocket 和 API 请求优化

    • gitlab-workhorse 还处理 WebSocket 和某些 API 请求,确保这些请求能够快速响应。

2. 使用外部 Nginx 时的工作流程

当使用外部 Nginx 作为反向代理时,请求的典型流程如下:

  1. 客户端请求到达外部 Nginx

    • 用户通过浏览器或其他工具发起 HTTP(S) 请求(例如访问 GitLab Web 界面或执行 Git 操作)。
  2. Nginx 将请求转发到 GitLab Workhorse

    • 外部 Nginx 配置中需要将请求转发到 gitlab-workhorse 的监听地址(通常是 127.0.0.1:8181 或其他指定端口)。
  3. GitLab Workhorse 处理请求

    • 根据请求类型,gitlab-workhorse 会决定如何处理:
      • 对于简单请求(如静态文件),直接返回结果。
      • 对于复杂请求(如 Git 操作、大文件上传),转发给 GitLab Rails 应用或直接与后端存储交互。
  4. GitLab Rails 应用处理请求

    • 如果请求需要进一步处理,gitlab-workhorse 会将请求转发给 GitLab Rails 应用(运行在 Puma 或 Unicorn 上)。
  5. 返回结果

    • 最终结果通过 gitlab-workhorse 返回给外部 Nginx,并由 Nginx 返回给客户端。

3. 不配置 GitLab Workhorse 的后果

如果在使用外部 Nginx 时没有正确配置 gitlab-workhorse,可能会导致以下问题:

  1. Git over HTTP(S) 功能失效

    • 例如,git clonegit pushgit fetch 等操作可能失败,因为外部 Nginx 无法正确处理这些请求。
  2. 大文件上传/下载失败

    • 大文件传输请求可能会超时或失败,因为外部 Nginx 无法像 gitlab-workhorse 那样高效地处理流式传输。
  3. 性能下降

    • 所有请求都直接传递给 GitLab Rails 应用,增加了 Rails 应用的负载,可能导致系统性能下降。
  4. 功能异常

    • 某些功能(如 CI/CD 构件上传、LFS 文件管理)可能无法正常工作。

4. 如何正确配置 GitLab Workhorse

为了确保外部 Nginx 正确代理 GitLab 请求,你需要在 Nginx 配置中将流量转发到 gitlab-workhorse。以下是一个示例 Nginx 配置:

Nginx 配置示例
server {
    listen 80;
    server_name gitlab.example.com;

    location / {
        proxy_pass http://127.0.0.1:8181; # 转发到 gitlab-workhorse
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 300;
        proxy_connect_timeout 300;
        proxy_send_timeout 300;
    }

    # WebSocket 支持
    location ~ ^/[-\/\w\.]+\.git/git-receive-pack$ {
        proxy_pass http://127.0.0.1:8181;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
    }
}
关键点
  • proxy_pass 指向 gitlab-workhorse 的监听地址(默认是 127.0.0.1:8181)。
  • 确保 proxy_read_timeout 和 proxy_send_timeout 设置足够长的时间,以支持大文件传输。
  • 添加对 WebSocket 的支持(如 /git-receive-pack)。

5. 总结

在使用外部 Nginx 代理 GitLab 时,gitlab-workhorse 是不可或缺的一环。它负责处理高性能任务(如大文件传输、Git 操作等),并确保请求能够高效地路由到 GitLab Rails 应用。如果不配置 gitlab-workhorse,可能会导致部分功能失效或性能下降。因此,在配置外部 Nginx 时,必须确保其正确转发请求到 gitlab-workhorse,以保证 GitLab 的正常运行和高效性能。

gitlab的介绍

  gitlab是使用ruby语言写的,然后使用的web框架是Rails,puma也是ruby开发的,基于rails框架。

    upstream gitlab-workhorse {//nginx外部代理 puma
      server unix:/var/opt/gitlab/gitlab-workhorse/sockets/socket;
    }

gitlab的一些指令和配置

puma的配置

cat /var/opt/gitlab/gitlab-rails/etc/puma.rb

查看数据库的状态

  gitlab-ctl status postgresql

修改了puma应用服务器之后 重新配置

 gitlab-ctl reconfigure puma 

gitlab-ctl restart puma

gitlab-ctl tail puma 查puma的日志

修改了配置文件:  gitlab.rb之后

gitlab-ctl reconfigure

下载gitlab的arm镜像

  去 https://hub.docker.com/

docker pull leshe4ka46/gitlab:17.9-ee  --platform=arm64

外部nginx配置代理gitlab

upstream gitlab-workhorse {
      # 通过本机的gitlab 的socket 来通信,没有用到gitlab内部的nginx 
      server unix:/var/opt/gitlab/gitlab-workhorse/sockets/socket;
    }
    server {
        listen 443 ssl;
        server_name  xx7.xx9.xx.xx;
        ssl_certificate      /root/pki/ca.crt;
        ssl_certificate_key  /root/pki/private.key;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /root/gitbook/books;
            index  index.html index.htm;
        }   
        location /gitlab {

            client_max_body_size 0;
            gzip off;
            ## Some requests take more than 30 seconds.
            proxy_read_timeout      300;
            proxy_connect_timeout   300;
            proxy_redirect          off;
            proxy_http_version 1.1;
            proxy_set_header    Host                $http_host; 
            proxy_set_header    X-Real-IP           $remote_addr;
            proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
            proxy_set_header    X-Forwarded-Proto   $scheme;
            proxy_pass http://gitlab-workhorse;
        }    
}

配置文件 gitlab.rb

  external_url 'http://10.99.204.137:8089'  这个参数很重要

  这中配置会导致 内部的nginx{如果启用了的话}  侦听 8089端口 ,而且

    server_name : 10.99.204.137  。这个配置的作用是nginx

  • 直接匹配 IP 地址
    此配置表示:当客户端请求的 Host 头为 10.45.6.7 时,Nginx 会使用该 server 块处理请求。

  • IP 地址是否必须是本机 IP?
    不一定server_name 的 IP 地址可以是任意值,但需满足以下条件:

    • 条件 1:Nginx 监听的端口(通过 listen 指令)需与请求的目标端口一致。

    • 条件 2:客户端请求的 Host 头必须与该 IP 匹配(或通过其他方式路由到 Nginx)

直接RPM安装

  部署的方式是:使用外部的nginx作为代理,使用https方式。

1、下载安装文件

gitlab-ce-17.0.3-ce.0.el7.x86_64.rpm

2、安装

  yum install  gitlab-ce-17.0.3-ce.0.el7.x86_64.rpm

或者安装yum源在线安装:

添加镜像源:新建 /etc/yum.repos.d/gitlab-ce.repo,内容为
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
gpgcheck=0
enabled=1

更新下缓存

yum makecache
yum install gitlab-ce  #安装

3、配置

   gitlab的配置

  默认安装的配置文件在: /etc/gitlab/gitlab.rb

     第一个要修改的是访问地址,就是外部访问gitlab的实际地址,因为有可能gitlab是部署在k8s集群中,或者其他内部环境中,而使用要是通过外部ip来访问的,这个时候就要配置这个地址了。这个地址也是项目git clone 的地址。

 external_url 'https://47.xxx.xxx.22/gitlab'

       配置代理授信地址,gitlab_rails['trusted_proxies'] 是一个配置项,用于指定 GitLab 可以信任的代理服务器的 IP 地址或 CIDR 范围。当 GitLab 通过这些代理接收请求时,它会信任这些代理提供的客户端信息。可以指定一个ip,也可以使一个网段

gitlab_rails['trusted_proxies'] = ['172.xx.218.117','xx.xx.77.22','172.xx.218.117/20']

       配置:web_server['external_users'] = ['系统用户组'],当不使用内部默认的nginx时,而使用外部的nginx做web服务器时就要设置用户组,意思就是让运行外部的nginx用户组和gitlab内部的应用服务器(是基于ruby的应用服务器,类型基于java的tomcat)在一个用户组。

      不使用内部的nginx:

             nginx['enable'] = false

    配置完了之后:
 

sudo gitlab-ctl reconfigure  #重新加载配制
sudo gitlab-ctl restart    #也可以重启下

   外部nginx的配置

    # 通过代理gitlab内部socket的方式来转发http请求
    upstream gitlab-workhorse {
      server unix:/var/opt/gitlab/gitlab-workhorse/sockets/socket; #直接部署的默认路径
    }
    server {
        listen 443 ssl;
        server_name  47.xxx.77.22; #nginx所在宿主机地址
        ssl_certificate      /root/pki/ca.crt;   #证书
        ssl_certificate_key  /root/pki/private.key; # 私钥
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   html;
            index  index.html index.htm;
        }  
        location /gitlab {

            client_max_body_size 0;
            gzip off;
            ## Some requests take more than 30 seconds.
            proxy_read_timeout      300;
            proxy_connect_timeout   300;
            proxy_redirect          off;
            proxy_http_version 1.1;
            proxy_set_header    Host                $http_host;
            proxy_set_header    X-Real-IP           $remote_addr;
            proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
            proxy_set_header    X-Forwarded-Proto   $scheme;
            proxy_pass http://gitlab-workhorse;
        }
     }

4、修改root用户密码

>gitlab-rails console

>u=User.where(id:1).first

>u.password='xxxxDev0'  #新密码

>u.password_confirmation='xxxxDev0'  #确认密码
>u.save!

gitlab的数据存储

GitLab项目数据分为以下几个部分:

Git仓库数据:包括源代码,提交历史记录等。
数据库数据:包括用户信息,项目信息,设置信息等。
文件数据:包括图片、文档、log等文件。
   对于这些数据,GitLab采用了不同的方式进行保存,下面我们就分别来看。

Git仓库数据


        Git仓库数据是GitLab最重要的数据之一,它包括了开发人员提交的源代码及相关信息。在GitLab中,每个项目都有一个Git仓库,Git仓库中的数据会被保存在GitLab服务器中。具体来讲,在GitLab运行后,相应的Git仓库被保存到GitLab安装目录下的/var/opt/gitlab/git-data/repositories中。在该目录下,每个项目都有一个对应的目录,该目录下存放着该项目的所有代码及提交历史记录。如果你想备份Git仓库数据,可以直接备份对应项目的目录即可。

数据库数据


       GitLab的数据库数据包括了用户信息、项目信息、设置信息等。这些数据的保存位置和Git仓库数据不一样。在GitLab运行后,这些数据会被保存到GitLab安装目录下的/var/opt/gitlab/postgresql/data目录中。具体来讲,该目录下存放着所有的PostgreSQL数据库数据。如果你想备份GitLab的数据库数据,可以直接备份整个目录即可。

文件数据


       GitLab中除了代码等基本数据外,还会有各种文件数据,如图片、文档等。这些数据通常不会保存在Git仓库中,而是通过GitLab上传并保存到服务器的文件系统中。在GitLab运行后,这些文件数据会被保存到GitLab安装目录下的/var/opt/gitlab/gitlab-rails/uploads目录中。在该目录下,每个项目都有一个对应的目录,该目录下存放着该项目上传的所有文件。如果你想备份GitLab上传的文件数据,可以直接备份对应项目的目录即可。

综上所述,GitLab生成的项目数据包括Git仓库数据、数据库数据以及文件数据。它们分别保存在GitLab安装目录下的/var/opt/gitlab/git-data/repositories、/var/opt/gitlab/postgresql/data和/var/opt/gitlab/gitlab-rails/uploads中。如果你想备份GitLab项目数据,需要备份上述三个目录。

Docker安装

1、下载镜像

    docker pull gitlab/gitlab-ce:17.3.1-ce.0 

docker run --detach \
  --hostname 172.30.218.116 \
  --publish 443:443 --publish 8899:22\
  --name gitlab \
  --restart always \
  --volume /srv/gitlab/config:/etc/gitlab \
  --volume /srv/gitlab/logs:/var/log/gitlab \
  --volume /srv/gitlab/data:/var/opt/gitlab \
  gitlab/gitlab-ce:13.7.0-ce.0 

要将外部NginxGitLab 集成,需要进行以下步骤: 1. 安装 GitLab 并确保其运行正常。 2. 安装 Nginx 并确保其运行正常。 3. 配置 GitLab 中的 Nginx。 4. 配置 Nginx 中的 GitLab。 以下是每个步骤的详细说明: 1. 安装 GitLab 并确保其运行正常。 安装 GitLab 的过程因为环境不同而有所差异,具体可以参考 GitLab 官方文档进行配置。 2. 安装 Nginx 并确保其运行正常。 安装 Nginx 的过程因为环境不同而有所差异,具体可以参考 Nginx 官方文档进行配置。 3. 配置 GitLab 中的 Nginx。 打开 GitLab 的配置文件 `/etc/gitlab/gitlab.rb`,并添加以下代码: ``` nginx['enable'] = true nginx['client_max_body_size'] = '250m' nginx['redirect_http_to_https'] = true nginx['redirect_http_to_https_port'] = 80 nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.crt" nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.key" ``` 这样就可以启用 GitLab 中的 Nginx,并设置一些基本的参数。 4. 配置 Nginx 中的 GitLab。 打开 Nginx 的配置文件 `/etc/nginx/nginx.conf`,并添加以下代码: ``` upstream gitlab { server 127.0.0.1:8080; } server { listen 80; server_name gitlab.example.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name gitlab.example.com; ssl_certificate /etc/nginx/ssl/gitlab.crt; ssl_certificate_key /etc/nginx/ssl/gitlab.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; location / { proxy_pass http://gitlab; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; } } ``` 这样就可以将外部NginxGitLab 集成起来,外部用户就可以通过 Nginx 访问 GitLab 了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值