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 配置审视(三)

相关推荐
脑壳疼___2 小时前
ubuntu安装postgresql、postgis、pgrouting
linux·ubuntu·postgresql
这是个栗子2 小时前
【问题解决】Vue2 与 Vue3项目中 Node.js 版本选择
前端·node.js·nvm
222you2 小时前
SpringBeanFactory
java·服务器·前端
苏打水com2 小时前
第十一篇:Day31-33 前端安全与性能监控——从“能用”到“安全可靠”(对标职场“系统稳定性”需求)
前端·javascript·css·vue.js·html
fpl11162 小时前
npm :无法加载文件 D:\...\nodejs\npm.ps1,因为在此系统上禁止运行脚本
前端·vscode·npm·node.js·命令模式
超风2 小时前
Ubuntu可以输入中文,但是IDEA没法输入中文
linux·运维·ubuntu
LYFlied2 小时前
LeetCode热题Top100:核心算法思想与前端实战套路
前端·算法·leetcode·面试·算法思想·算法套路·解题公式
赵庆明老师2 小时前
NET 中,使用SignalR 调用Controller 控制器的 Hub 方法
前端·html·xhtml
zhangwenwu的前端小站2 小时前
VUE 实现划词 问AI 翻译等功能
前端·javascript·vue.js