从电脑上拉取gitlab仓库的代码时,将本机的id_rsa.pub密钥传到gitlab上之后,使用git clone克隆代码后依然要求输入密码,本来非常简单的一个过程,但却暴漏了很多的问题,下面讲诉下解决的方法
由于我的gitlab机器上有一个harbor服务,已经占用了80端口,所以,我考虑使用另一台nginx来反向代理gitlab机器,所以需要修改gitlab的配置文件 禁用nginx
vim /etc/gitlab/gitlab.rb
将
nginx['enable'] = true
修改为
nginx['enable'] = false
允许gitlab-workhorse监听TCP
vim /etc/gitlab/gitlab.rb
gitlab_workhorse['listen_network'] = "tcp"
gitlab_workhorse['listen_addr'] = "192.168.1.122:8181"
重载配置并重启
gitlab-ctl reconfigure
gitlab-ctl restart
我们在另一台装有nginx的机器配置反向代理,来代理gitlab
cat conf.d/git.conf
upstream git-server {
server 192.168.1.122:8181;
}
server {
listen 80;
server_name git.xxxxxx.com;
location / {
proxy_http_version 1.1;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; #获取真实ip
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #获取代理者的真实ip
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
proxy_buffer_size 128k;
proxy_buffers 2 256k;
proxy_headers_hash_max_size 512;
proxy_headers_hash_bucket_size 64;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_pass http://git-server;
}
}
完成以上配置,我以为这样就算完成了,但是在执行git clone克隆项目的时候依然需要输入密码,各种谷歌,依然没有找到问题的所在,直到看到一篇博客,就像看到了一颗救命稻草,感谢: https://blog.hobairiku.site/2018/02/26/gitlab-setup/#%E9%85%8D%E7%BD%AEgitlab%E7%9A%84%E5%85%A5%E5%8F%A3
ok,接下来就是按照上面博客中提示的,修改gitlab的ssh端口
只需修改这一段就可
vim /etc/gitlab/gitlab.rb
gitlab_rails['gitlab_shell_ssh_port'] = 24
然后再次重载和重启,最后就是非常关键的一步了,就是把ssh给代理出去,当然是通过nginx的方式,看到这,对于年幼的我,属实夸张了一把!!
在我们的nginx服务器上,肯定也是跑着ssh服务,同样端口默认也是22,所以当我们通过外部nginx访问时,nginx会帮我们转发到gitlab所在服务器的ssh端口,配置如下:
# cat nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
# 增加此配置
stream {
upstream ssh {
hash $remote_addr consistent;
server 192.168.1.122:22 max_fails=3 fail_timeout=10s;
}
server {
listen 24;
proxy_connect_timeout 20s;
proxy_timeout 5m;
proxy_pass ssh;
}
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
ssh是使用在tcp协议上的,而不是http,所以反向代理也要单独配置,使用Nginx的stream功能实现tcp代理。编辑stream模块,完事后,重启下nginx即可,然后再次git clone就可以解决了。