背景说明
https://blog.csdn.net/GodDavide/article/details/139182475
上文说到:
我已经用docker搭好了gitlab-ce服务,但我是部署在自己的家庭nas-极空间z4pro里的,属于内网环境。
另外我有一台阿里云服务器,做跳板机。
我有一个阿里的域名,解析到我的阿里云跳板机上。
问题还原
如上,我需要用域名访问我的gitlab-ce服务,在docker run的时候,配置了hostname和external_url:
当然:也可通过修改gitlab.rb文件实现【见上文】。
docker run --detach \
--hostname git.****.cn \
--env GITLAB_OMNIBUS_CONFIG="external_url 'http://git.****.cn'" \
--publish 15443:443 --publish 15080:80 --publish 15022:22 \
# ....以下省略,可以看上一篇文章
# https://blog.csdn.net/GodDavide/article/details/139182475
然后,如上,我的80端口,映射15080,22端口映射15022
则就需要修改gitlab.rb 将gitlab_rails[‘gitlab_shell_ssh_port’]修改为15022
则此时,我的gitlab上 clone代码的地址,显示的就是正确的地址:
然后,我通过ssh命令,做一个端口转发,以实现内网穿透,将服务端口链接到跳板机上。这个以后再详细介绍。
然后穿透到阿里云服务器跳板机的端口,只能内网访问,需要用nginx做个转发,才能用公网ip进行访问。
到此为止,我仅仅只配置了80的映射端口15080。服务是可以通过域名访问了,
但是,我通过ssh克隆,确一直clone 失败~
ps:已经将ssh-key添加进项目秘钥库里了~
问题排查解决
首先想到的就是 git clone是通过ssh的22端口进行下载的,那就需要打通22端口,则又配置22端口的nginx转发。
发现,并不能实现
然后,回头尝试用内网地址+15022clone,成功,用公网的ip+15222clone失败,那就是定位到时nginx转发的问题了
然后,就考虑到22端口转发应该有特殊配置,这才发现,22端口需要处理TCP/UDP 流量。而普通的配置并不能处理TCP/UDP 流量。需要用stream模块,具体配置如下:
stream {
upstream gitlab_ssh {
server 127.0.0.1:15022;
}
server {
listen 15922; # 不能和其他端口冲突
proxy_pass gitlab_ssh;
proxy_connect_timeout 1d;
proxy_timeout 1d;
}
}
此时 nginx -s reload 报错:
nginx: [emerg] "stream" directive is not allowed here in /etc/nginx/conf.d/gitlab.conf:28
解决:
1:nginx 1.9以后才有stream模块,需要升级,但现在谁还用这么老的版本~
2:nginx安装的时候,并没有安装stream模块,可以安装nginx stream模块,或者安装全部模块。
yum -y install nginx-all-modules.noarch
再此 nginx -s reload,成功。
此时git clone ssh:// 使用15922 端口,发现可以clone成功了。
最后再将gitlab.rb中的15022改成15922 即可正确显示地址了。或者改一下穿透端口和Nginx配置转发端口都可以。
ps:注意一下;阿里云服务器实例的网络安全组,一定要把你需要的端口打开哦~