nginx 的 gitlab 容器代理传递不适用于推送请求

Posted

技术标签:

【中文标题】nginx 的 gitlab 容器代理传递不适用于推送请求【英文标题】:gitlab container proxy pass by nginx doesn't work with push request 【发布时间】:2020-10-15 17:50:19 【问题描述】:

我的 docker 上有 3 个容器。我想将 gitlab 作为子域。 我的 gitlab 容器端口是:

443/tcp, 0.0.0.0:10022->22/tcp, 0.0.0.0:10080->80/tcp

gitlab 容器已使用此命令创建:

docker run --detach --name gitlab --restart=always\
    --publish 10022:22 --publish 10080:80 \
    --network nginx_network \
    --volume /srv/gitlab/config:/etc/gitlab \
    --volume /srv/gitlab/logs:/var/log/gitlab \
    --env 'EXTERNAL_URL=https://develop.domain.com' \
    --volume /srv/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:latest

我的 nginx 配置是:

upstream isa_fire 
    server isa_fire:8000;

upstream gitlab 
    server gitlab:80;

upstream gedata 
    server geoserver:8080;




server 
    listen 80;
    server_name domain.com www.domain.com;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    root /usr/share/nginx/html;
    index index.html index.htm;

    location / 
        proxy_pass      http://isa_fire;
        proxy_redirect  off;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Host $server_name;
    


    location /static/ 
        alias /isa_fire/static/;
    

    location /files/ 
        alias /isa_fire/;
    
    


server 
  listen        80;
  server_name   develop.domain.com www.develop.domain.com;

  location / 
    proxy_pass  http://gitlab;
    proxy_redirect  off;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Host $server_name;

  


server 
  listen        80;
  server_name   geoserver.domain.com www.geoserver.domain.com;

  location / 
        proxy_pass  http://gedata;

  




client_max_body_size 240M;

我的 gitlab 上的浏览​​器一切正常。但是当我尝试推动时:

git push -u origin master  

几分钟后遇到此错误:

*ssh: 连接到主机develop.domain.com 端口22: 连接超时 致命:无法从远程存储库读取。

请确保您拥有正确的访问权限 并且存储库存在*

【问题讨论】:

【参考方案1】:

如果您想使用 SSH,我认为您也需要公开端口 22。

这意味着您的 nginx 配置必须使用第二个服务器进行扩展,该服务器侦听端口 22,并且代理将其传递给您的 gitlab docker 容器。

还必须在路由器设置中转发/打开端口 22!

我希望这会有所帮助!

【讨论】:

【参考方案2】:

有两种方法可以解决这个问题,

    将 docker host ssh 端口从 22 更改为其他端口,然后使用这些端口创建 gitlab 容器 22:22 ,10080:80, 443

    或者你可以编辑你的项目的 .git/config 文件,在地址中添加端口 10022 在 url 的末尾

顺便说一句,您可以使用项目的 http(s) url 拉取和推送,然后离开 ssh ?

【讨论】:

以上是关于nginx 的 gitlab 容器代理传递不适用于推送请求的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的容器注册表适用于 gitlab 自动部署,但不适用于我的自定义管道?

如何将 Gitlab 的 Auto DevOps 用于多容器应用程序?

使用 nginx 的 Websocket 代理不适用于 tomcat。

gitlab docker nginx 反向代理到子路径

代理错误后面的docker容器中的Gitlab vs Registry

代理从 nginx 容器传递到 keycloak 容器时获取 502 Bad gateway