如何在 Nginx 和 GitLab 共同使用的环境中处理端口冲突问题

1,644 阅读3分钟

在一台服务器上同时部署了 Nginx 和 GitLab。由于 Nginx 已占用 80 端口,因此在 GitLab 的配置文件 gitlab.rb 中,将 GitLab 的监听端口更改为 88。这样配置后,GitLab 能够正常启动。然而,在 GitLab 仓库页面中进行 HTTP 克隆操作时,生成的仓库 URL 为 http://host/inno/inno-mbo.git,未包含端口号,导致无法直接克隆仓库。

在域名备案完成后,我为 GitLab 配置了一个二级域名(例如 gitlab.一级域名),并在外部 Nginx 中设置了一个 server 块,监听该域名的 80 端口。在 Nginx 配置中,通过 location 指令将请求代理到 GitLab 实际运行的 88 端口上。

  • 解析一个gitlab的二级域名

image.png

  • 修改 GitLab 监听端口
    • 在 GitLab 的配置文件 /etc/gitlab/gitlab.rb 中,将 GitLab 的监听端口更改为非标准端口,例如 88。
    • 设置 external_urlhttp://gitlab.一级域名(不包含端口号)
external_url 'http://gitlab.一级域名'
nginx['listen_port'] = 88

image.png

重新配置 GitLab 并重启服务:

sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
  • 配置 Nginx 反向代理

    • 创建一个 Nginx server 块,监听 80 端口,并将请求代理到 GitLab 实际运行的 88 端口。

    • 配置示例如下:

upstream git{
# 域名对应 gitlab配置中的 external_url
# 端口对应 gitlab 配置中的 nginx['listen_port']
server 域名:端口;
}
server{
listen 80;
# 此域名是提供给最终用户的访问地址
server_name 域名;

location / {
# 这个大小的设置非常重要,如果 git 版本库里面有大文件,设置的太小,文件push 会失败,根据情况调整
client_max_body_size 50m;
proxy_redirect off;
#以下确保 gitlab中项目的 url 是域名而不是 http://git,不可缺少
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 反向代理到 gitlab 内置的 nginx
proxy_pass http://git;
index index.html index.htm;
}
}
  • 测试和验证
    • 重新加载 Nginx 配置以应用更改:
sudo nginx -s reload
  • 确保 GitLab 可以通过 http://gitlab.一级域名 正常访问,验证 HTTP 克隆 URL 是否正确。

通过上述配置,成功实现了通过域名访问 GitLab,并解决了克隆 URL 缺失端口号的问题。最终,GitLab 通过标准 HTTP 端口(80)提供服务,避免了在克隆 URL 中手动指定端口号的麻烦。

以下是 GitLab 常用命令的表格形式:

操作命令说明
重新配置 GitLabgitlab-ctl reconfigure应用配置文件中的更改
重启 GitLabgitlab-ctl restart重启所有 GitLab 服务
停止 GitLabgitlab-ctl stop停止所有 GitLab 服务
启动 GitLabgitlab-ctl start启动所有 GitLab 服务
查看 GitLab 状态gitlab-ctl status查看 GitLab 服务的运行状态
查看 GitLab 日志gitlab-ctl tail实时查看 GitLab 日志
升级 GitLabgitlab-ctl upgrade升级 GitLab 到最新版本
编辑配置文件nano /etc/gitlab/gitlab.rb编辑 GitLab 配置文件
创建 GitLab 备份gitlab-rake gitlab:backup:create创建 GitLab 数据备份
恢复 GitLab 备份gitlab-rake gitlab:backup:restore BACKUP=timestamp_of_backup恢复 GitLab 数据备份(指定时间戳)