docker部署gitlab经常报错502
前因
docker 部署的 gitlab服务,页面经常显示 502 错误,重新刷新页面大概率可正常显示,但是 502 的概率还是很大,严重影响使用。
gitlab 有多个内部组件组成,其内部使用 Puma 作为 web 页面部分的服务器
进入docker镜像,执行:gitlab-ctl status 可以查询 gitlab 各个组件的状态
root@gitlab:/# gitlab-ctl status run: alertmanager: (pid 627) 682s; run: log: (pid 621) 682s run: gitaly: (pid 607) 682s; run: log: (pid 602) 682s run: gitlab-exporter: (pid 619) 682s; run: log: (pid 611) 682s run: gitlab-kas: (pid 615) 682s; run: log: (pid 608) 682s run: gitlab-workhorse: (pid 617) 682s; run: log: (pid 609) 682s run: logrotate: (pid 606) 682s; run: log: (pid 601) 682s run: nginx: (pid 623) 682s; run: log: (pid 614) 682s run: postgres-exporter: (pid 626) 682s; run: log: (pid 622) 682s run: postgresql: (pid 618) 682s; run: log: (pid 610) 682s run: prometheus: (pid 620) 682s; run: log: (pid 612) 682s down: puma: 682s; run: log: (pid 603) 682s run: redis: (pid 605) 682s; run: log: (pid 600) 682s run: redis-exporter: (pid 624) 682s; run: log: (pid 616) 682s run: sidekiq: (pid 613) 682s; run: log: (pid 604) 682s run: sshd: (pid 43) 692s; run: log: (pid 42) 692s
GitLab 各组件功能一览表
| 组件 | 作用说明 | 是否处理 Web 页面 | 是否处理 Git 操作 | 常见问题 | 备注 |
|---|---|---|---|---|---|
| Nginx | 反向代理服务器,接收所有外部请求(HTTP/HTTPS),并路由到后端服务(Puma、Gitaly、Registry 等)。也提供静态文件服务。 | ✅ 是(入口) | ✅ 是(代理 Git over HTTP) | 502/504 错误、连接超时、SSL 配置错误 | 所有请求的“门卫” |
| Puma | GitLab 的 Web 应用服务器,处理所有 Web 页面、API 请求(如登录、项目列表、CI/CD 页面、Merge Request 等)。 | ✅ 是(核心) | ❌ 否 | 502 错误、Worker 重启、内存过高 | 不处理 Git 操作 |
| Gitaly | Git 存储服务,负责所有 Git 操作:git clone、push、pull、fetch、查看文件历史等。所有 Git 请求最终由它执行。 |
❌ 否 | ✅ 是(核心) | 性能慢、连接失败、磁盘 I/O 高 | Git 操作的“引擎” |
| GitLab Shell | 处理 SSH 协议 的 Git 请求(如 git@gitlab:group/project.git),验证用户权限,并将请求转发给 Gitaly。 |
❌ 否 | ✅ 是(SSH 路径) | SSH 登录失败、权限拒绝 | 仅用于 SSH Git |
| PostgreSQL | GitLab 的主数据库,存储用户、项目、权限、Issue、Merge Request、CI/CD 配置等元数据(非代码本身)。 | ✅ 是(依赖) | ✅ 是(依赖) | 连接数满、慢查询、磁盘满 | 所有服务都依赖它 |
| Redis | 缓存和消息队列服务,用于会话存储、Sidekiq 任务队列、实时通知等。 | ✅ 是(加速) | ✅ 是(加速) | 内存耗尽、连接超时 | 提升性能的关键 |
| Sidekiq | 后台任务处理器,执行异步任务:发送邮件、CI/CD 流水线、仓库扫描、Webhooks 等。 | ✅ 是(后台) | ✅ 是(后台) | 队列积压、任务超时 | CI/CD 的“幕后工作者” |
| Prometheus | 内置监控系统,收集各组件的性能指标(CPU、内存、请求延迟等)。 | ✅ 是(监控) | ❌ 否 | 监控数据丢失 | 用于性能分析 |
| Alertmanager | 告警管理,与 Prometheus 配合,发送告警通知(邮件、Slack 等)。 | ✅ 是(告警) | ❌ 否 | 告警未触发 | 运维告警系统 |
| Logrotate | 日志轮转工具,自动压缩和清理旧日志文件。 | ❌ 否 | ❌ 否 | 日志文件过大 | 防止磁盘被日志占满 |
| Registry | Docker 镜像仓库服务,用于存储和管理容器镜像(GitLab Container Registry)。 | ✅ 是(镜像页面) | ❌ 否(但提供镜像存储) | 镜像 push/pull 失败 | 可选组件 |
| Pages | GitLab Pages 服务,用于托管静态网站(如文档、博客)。 | ✅ 是(Pages 页面) | ❌ 否 | 页面无法访问 | 可选组件 |
| GitLab Exporter | Prometheus 的指标导出器,暴露 GitLab 内部监控数据。 | ✅ 是(监控) | ❌ 否 | 指标采集失败 | 监控辅助组件 |
根据上数功能表,首先考虑应该是puma的问题。
查看 puma 的日志
gitlab-ctl tail puma/puma_stdout.log
如果出现大量 boot 相关日志,说明 puma 的工作线程在频繁的重启。就是线程频繁重启导致时断时续的出现502错误。
解决方案
修改配置文件
vi /etc/gitlab/gitlab.rb
推荐修改
| 配置项 | 说明 | 默认值 | 建议值 | 影响与注意事项 |
|---|---|---|---|---|
puma['enable'] = true |
是否启用 Puma 服务。设为 false 时,Puma 不启动(仅用于高可用集群中由外部负载均衡调度的场景)。 |
true |
true |
⚠️ 一般不要关闭,否则 Web 页面和 API 无法访问。 |
puma['ha'] = true |
启用 Puma 高可用(High Availability)模式。开启后,主进程会监控 worker 健康状态,自动重启无响应或内存超限的 worker。 | true |
true ✅ |
推荐保持开启,可防止 worker 卡死。但若频繁重启 worker,会导致 502。 |
puma['worker_timeout'] = 60 |
每个 worker 最大无响应时间(秒)。如果 worker 在此时间内未处理请求,将被主进程杀死并重启。 | 60 |
60 ~ 90 |
过短可能导致正常长请求被误杀;过长则卡死 worker 恢复慢。 |
puma['worker_processes'] = 4 |
Puma 启动的 worker 进程数。每个 worker 是独立的 Ruby 进程,可处理并发请求。 | CPU 核心数(通常 2~4) | 2 ~ CPU 核心数 |
- 每个 worker 内存约 300~800MB<br>- 内存不足时应减少此值<br>- 通常设为 CPU 核心数 |
puma['min_threads'] = 4 |
每个 worker 的最小线程数。Puma 使用多线程处理请求,此值决定空闲时的线程数量。 | 0 或 1(版本不同) |
4 |
线程用于处理并发请求,设为 4 表示每个 worker 至少有 4 个线程处理请求。 |
puma['max_threads'] = 4 |
每个 worker 的最大线程数。当请求增多时,Puma 会在此范围内动态增加线程。 | 16 或 4 |
4 ~ 16 |
若 min == max,则线程数固定,适合稳定负载。 |
puma['worker_memory_limit_min'] = "600" |
worker 内存使用低于此值时,不触发内存检查(单位:MB)。用于避免频繁检查小内存进程。 | 300 |
600 |
配合 max 使用,避免误杀刚启动的 worker。 |
puma['worker_memory_limit_max'] = "1024" |
当 worker 内存使用超过此值时,会被主进程杀死并重启,防止内存泄漏。 | 600 |
800 ~ 1024(根据内存调整) |
🔑 关键配置:过低会导致频繁重启(502);过高可能导致 OOM。 |
重新生效
gitlab-ctl reconfigure
本文来自博客园,作者:''竹先森゜,转载请注明原文链接:https://www.cnblogs.com/zhuminghui/p/19645776
浙公网安备 33010602011771号