You need to enable JavaScript to run this app. Ubuntu 20.04 已有运行中Apache时部署Docker版GitLab的端口冲突解决
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 20.04 已有运行中Apache时部署Docker版GitLab的端口冲突解决

端口冲突调整方案

核心思路

现有Apache已经完全占用宿主机80、443端口承载多站点业务,调整全程不需要改动原有站点的任何配置,也不会中断现有业务,实现逻辑为:

  • 将GitLab容器的HTTP、SSH端口映射到宿主机未被占用的高端口,且仅绑定本地回环地址,避免端口直接暴露公网
  • 给GitLab分配独立的访问域名,在Apache的现有虚拟主机体系中新增对应域名的分流规则,将该域名的流量转发到GitLab容器对应的本地端口
  • 调整GitLab内部配置匹配外部访问的域名、SSH端口,避免页面跳转、SSH克隆等功能异常

第一步:重新创建GitLab容器

先删除之前创建失败的临时容器,调整端口映射规则:

# 强制删除之前启动失败的gitlab容器
sudo docker rm -f gitlab

# 重新启动容器,端口映射规则:宿主机本地回环8080对应容器80(HTTP)、本地回环2222对应容器22(SSH),无需额外映射8443端口,因为流量全走Apache代理入口
sudo docker run --detach \
--hostname gitlab.hostname.de \
--publish 127.0.0.1:8080:80 --publish 127.0.0.1:2222:22 \
--name gitlab \
--restart always \
--volume $GITLAB_HOME/config:/etc/gitlab \
--volume $GITLAB_HOME/logs:/var/log/gitlab \
--volume $GITLAB_HOME/data:/var/opt/gitlab \
gitlab/gitlab-ee:latest

注意:映射时必须指定绑定127.0.0.1,不要直接绑定0.0.0.0,否则高端口会直接暴露到公网,存在安全风险

等待容器启动后,修改GitLab的核心配置文件(路径为$GITLAB_HOME/config/gitlab.rb),修改以下参数:

  • external_url 'http://gitlab.hostname.de':替换为你给GitLab分配的独立访问域名,不要附带端口号
  • gitlab_rails['gitlab_shell_ssh_port'] = 2222:告知GitLab对外提供SSH服务的端口是宿主机映射的2222,避免Git仓库SSH连接端口错误

修改完成后执行配置重加载命令让规则生效:

sudo docker exec -it gitlab gitlab-ctl reconfigure

第二步:配置Apache反向代理规则

先开启Apache需要的反向代理、重写相关模块:

sudo a2enmod proxy proxy_http headers rewrite ssl
sudo systemctl restart apache2

在Apache的站点配置目录(/etc/apache2/sites-available/)下新增GitLab对应的虚拟主机配置文件,比如命名为gitlab.conf,写入以下内容:

# 承接80端口的HTTP请求,统一重定向到HTTPS
<VirtualHost *:80>
    ServerName gitlab.hostname.de
    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>

# 承接443端口的HTTPS请求,反向代理到GitLab容器
<VirtualHost *:443>
    ServerName gitlab.hostname.de
    # 复用Apache现有全局/其他站点的SSL证书配置,无需单独为GitLab申请证书
    SSLEngine on
    SSLCertificateFile /你的现有证书路径/fullchain.pem
    SSLCertificateKeyFile /你的现有证书路径/privkey.pem

    # 反向代理转发规则
    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/
    ProxyPreserveHost On
    # 修正请求头标记,让GitLab正确识别HTTPS访问
    RequestHeader set X-Forwarded-Proto "https"
    RequestHeader set X-Forwarded-Ssl on
</VirtualHost>

配置检查无误后启用站点并重载Apache:

# 检查配置语法是否正确
sudo apache2ctl configtest
# 启用gitlab站点配置
sudo a2ensite gitlab.conf
# 重载Apache,不中断现有业务
sudo systemctl reload apache2

注意事项

  • 启动容器前先检查端口占用:执行sudo ss -tulnp | grep -E '8080|2222',确认对应端口未被其他进程占用
  • GitLab第一次初始化需要3-5分钟,容器启动后不要立刻访问,等初始化完成后再测试域名访问
  • 现有Apache上的其他站点配置不需要做任何修改,新增的虚拟主机只会匹配对应GitLab域名的流量,不会影响原有站点业务
  • 如果需要GitLab使用独立域名的HTTPS证书,只需要把gitlab.conf里的证书路径替换成对应域名的证书路径即可

内容的提问来源于stack exchange,提问作者webGuy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.29 20:06:03