58、【Ubuntu】【Gitlab】拉出内网 Web 服务:Gitlab 配置审视(二)

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除

背景

上篇 blog
【Ubuntu】【Gitlab】拉出内网 Web 服务:Gitlab 配置审视(一)

分析了自定义的 Nginx 配置项,会绕过 GitLab 默认的架构:Workhorse + Puma ,下面继续

Nginx 配置审视

关于 WorkHorse ,可参考官方描述 GitLab Architecture Overview -- Workhorse

OK,下面来看下 WorkHorse 和 Puma 配合的例子

比如用户上传一个 1GB 的大文件

  • 首先是流量路径:用户 → Nginx → Gitlab-Workhorse
  • Workhorse 接收整个文件,保存到磁盘
  • Workhorse 调用 Puma API,通知 Puma 文件已存好,路径是 /tmp/xxx,可以创建数据库记录
  • Puma 只需要执行轻量级数据库操作,不用处理大文件
  • 响应返回用户

从流程上可以看到,这样 Puma 的线程不会被大文件上传给卡住(由 Workhorse 进行处理),系统更稳定,并发能力更高

Nginx,Workhorse,Puma 具体的协作流程图如下

  • 首先,客户端通过 HTTP(S) 访问 Web 服务器,比如 http://192.168.1.100(以局域网 ip 为例)
  • Nginx 监听 80/443 端口(后面分析),端口配置由 Gitlab 管理,可以通过 gitlab.rb 文件配置
  • Nginx 通过 Socket 协议(套接字在 /var/opt/gitlab/gitlab-workhorse/sockets/socket)将访问信息传递给 Gitlab-Workhorse(Go 服务),终端输入
bash 复制代码
sudo lsof /var/opt/gitlab/gitlab-workhorse/sockets/socket

可查看打开该套接字的进程(Linux 中一切皆文件,套接字在操作系统眼里也是一个文件)

  • 如果是 /assets/uploads,git 操作,或者大文件等,Gitlab-Workhorse 自己就能处理,等处理好了再通知 Puma
  • 如果是普通页面,或者 Api,比如 /dashboard/api/v4/projects 等,则 Gitlab-Workhorse 再通过 Socket 套接字(位置在 /var/opt/gitlab/gitlab-rails/sockets/gitlab.socket)通知 Puma 进行处理,终端输入
bash 复制代码
sudo lsof /var/opt/gitlab/gitlab-rails/sockets/gitlab.socket

可以查看监听 Gitlab-WorkHorse 套接字的 Puma 进程如下

可以看到,监听 Gitlab-Workhorse 套接字的 Puma 进程,足足有 14 个(CPU 核心为 16),Puma 需要多个进程是因为 Ruby 应用本身是 CPU/IO 密集型任务会默认将进程数量开到接近 CPU 核心数量 ,这里少了两个,是预留系统资源,留给系统或其他服务,不占满所有核心,避免系统卡顿

另外,上面可以看到,GitLab-Workhorse 只有一个进程监听 Nginx 的套接字,这里首先 Gitlab-Workhorse 使用 Go 语言写的,设计目标就是轻量,高效,并利用 Go 协程实现高并发 ,通过 goroutine(协程),Gitlab-workhorse 一个进程就能处理成千上万的并发连接 ,而不需要 fork 多个进程来提升并发能力(不像 Ruby/Python 等传统模型)

OK,从这里可以看出,Workhorse 是 Puma 的守门人和助手,只把真正需要业务逻辑的请求交给 Puma


OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【Ubuntu】【Gitlab】拉出内网 Web 服务:Gitlab 配置审视(三)

相关推荐
小李子呢02119 小时前
前端八股CSS(2)---动画的实现方式
前端·javascript
GreenTea10 小时前
从 Claw-Code 看 AI 驱动的大型项目开发:2 人 + 10 个自治 Agent 如何产出 48K 行 Rust 代码
前端·人工智能·后端
渣渣xiong11 小时前
从零开始:前端转型AI agent直到就业第五天-第十一天
前端·人工智能
布局呆星11 小时前
Vue3 | 组件通信学习小结
前端·vue.js
C澒11 小时前
IntelliPro 企业级产研协作平台:前端智能生产模块设计与落地
前端·ai编程
OpenTiny社区13 小时前
重磅预告|OpenTiny 亮相 QCon 北京,共话生成式 UI 最新技术思考
前端·开源·ai编程
前端老实人灬13 小时前
web前端面试题
前端
Moment13 小时前
AI 全栈指南:NestJs 中的 Service Provider 和 Module
前端·后端·面试
IT_陈寒13 小时前
为什么我的JavaScript异步回调总是乱序执行?
前端·人工智能·后端