gitlab添加ssh-keys之后克隆依然需要输入密码
问题描述
从电脑上拉取gitlab仓库的代码时,将本机的id_rsa.pub密钥传到gitlab上之后,使用git clone克隆代码后依然要求输入密码,本来非常简单的一个过程,但却暴漏了很多的问题,下面讲诉下解决的方法
gitlab不使用内置nginx
由于我的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反向代理
我们在另一台装有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端口
修改gitlab的SSH端口
只需修改这一段就可
vim /etc/gitlab/gitlab.rb
gitlab_rails['gitlab_shell_ssh_port'] = 24
然后再次重载和重启,最后就是非常关键的一步了,就是把ssh给代理出去,当然是通过nginx的方式,看到这,对于年幼的我,属实夸张了一把!!
nginx反代SSH
在我们的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就可以解决了。
- WCF版的PetShop之三:实现分布式的Membership和上下文传递
- “高并发”问题如何解决?腾讯云一分钟配置的“黑科技”帮您
- 初探JavaScript(三)——JS带我"碰壁"带我飞
- 初探JavaScript(四)——作用域链和声明提前
- 开发人员看测试之运行Github中的JBehave项目
- 如何高效地合并Spark社区PR到自己维护的分支
- 开发人员看测试之TDD和BDD
- AngularJS入门心得1——directive和controller如何通信
- AngularJS入门心得2——何为双向数据绑定
- AngularJS入门心得3——HTML的左右手指令
- AngularJS入门心得4——漫谈指令scope
- Enterprise Library深入解析与灵活应用(8):WCF与Exception Handling AppBlock集成[上]
- 苹果就“电池门”公开致歉;微信下拉任务栏新增小游戏;美团打车进入北京
- 新华三《中国城市数字经济指数白皮书》:深圳数字经济发展水平国内居首
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python 技术篇-sha256()加密的使用方法,sha1、md5加密方法
- Python 技术篇-如何打印一段文字,用友云霸气控制台颜文字打印
- Python 技术篇-获取秒级时间戳、毫秒级时间戳
- Python 技术篇-基于随机数的uuid码的生成
- BAT 脚本技术-利用bat批处理脚本静态指定ip地址、自动获取ip地址设置
- Oracle 技巧篇-快速批量删除当前数据库连接的用户,一键清空所有session会话方法
- Spring Security 中如何细化权限粒度?
- 小书MybatisPlus第4篇-表格分页与下拉分页查询
- 小书MybatisPlus第3篇-自定义SQL
- Nginx + Spring Boot 实现负载均衡
- 小书MybatisPlus第2篇-条件构造器的应用及总结
- 一个案例演示 Spring Security 中粒度超细的权限控制!
- 信息收集之主机发现:nmap
- 文本文件逐行处理–用java8 Stream流的方式
- 使用java8API遍历过滤文件目录及子目录及隐藏文件