Gitlab上手完全手册-CentOS-Nginx
本文介绍阿里云ECS服务器CentOS7系统下安装Gitlab,并结合Nginx简单配置路由的过程,包含很多踩过的坑,比如为什么Gitlab安装失败、为什么Gitlab启动失败、为什么Gitlab网站出现502错误、如何设置pages网页服务等等。
![](https://img.haomeiwen.com/i4324074/1f0eacd1faa46929.png)
Gitlab是什么?
Gitlab是个软件包,可以安装部署到你的云服务器上,然后你就拥有了一个和Github类似功能的网站。
Gitlab根本上也是使用的Git,我们也可以把它看作是一个云端开发工具,可以实现:
-
项目管理。
你可以把项目推送到服务器上存储,也可以直接在网站上新建项目,创建文件,并进行简单编辑,然后再拉取到本地。 -
文件存储。
因为可以上传下载项目,所以你也可以把它当做云盘来使用,随时保持项目文件更新。 -
版本管理。
它会为你保存每次推送的文件差异记录,你可以回滚到之前的任意版本。 -
开发协作。
对于同一个项目,大家可以分别撰写不同的文件,然后推送到服务器,如果产生重复冲突,Gitlab会提示处理方法。 -
远程部署。
Gitlab可以自动监听每次推送事件,然后根据设置调用不同命令进行后续处理,比如编译文件、打包应用等等。
安装Gitlab
Gitlab分为两个版本,付费的企业版gitlab-ee和免费的社区版gitlab-ce。官方只提供了CentOS企业版的安装教程,参见这个链接https://about.gitlab.com/install/#centos-7。免费社区版请不要直接使用这个教程安装!
安装前提示,请确保你的服务器内存至少2G,推荐4G,否则会安装失败。
社区版安装开始几步是相同的,先装一些必要的依赖:
sudo yum install -y curl policycoreutils-python openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo systemctl reload firewalld
再进行一些设置:
sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix
然后注意要改为使用gitlab-ce版本了,先添加资源包,注意这里把官方的-ee换成了-ce:
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
再直接安装,这个过程挺慢的,可能需要十几分钟或更久:
sudo yum install -y gitlab-ce
如果你不小心使用了企业版ee安装,或者之前安装过gitlab,那么一定要停止、卸载并删除相关文件,否则之后启动就会遇到一堆红色的奇怪提示。停止和卸载命令:
sudo gitlab-ctl stop
sudo yum -y remove gitlab-ce
删除(推荐改名)以下文件夹:
opt/gitlab
etc/gitlab
var/opt/gitlab
var/log/gitlab
配置Gitlab
Gitlab的配置文件位置在:
/etc/gitlab/gitlab.rb
默认应该都是被注释掉的,我用VSCode打开它,添加了以下几行:
external_url 'http://git.10knet.com'
nginx['enable'] = false
web_server['external_users'] = ['root']
puma['enable'] = true
puma['port'] = 8888
这些设置的作用是:
-
external_url 'http://git.10knet.com'
,设定外部访问的地址。注意!即使我们稍后要用Nginx代理,但这里仍然要使用正式地址而不是localhost之类。建议使用git.xxx.com
的格式,这样你还可以在服务器上部署其他网站程序。 -
nginx['enable'] = false
,这是禁用Gitlab自带的Nginx功能,因为我们稍后会使用外部独立的Nginx做代理转发。 -
web_server['external_users'] = ['root']
,这是设置外部Nginx的用户名,应该和Nginx配置中的user
一样,为了避免各种权限问题,这里直接使用了root
用户。 - 最后两行是启动puma的,它负责Gitlab用户登录注册功能,可以使用任意没被占用的端口。如果puma不能成功运行,那么网站就打不开,显示502错误。puma是Gitlab主要的web服务器,在Gitlab13.0版本之前是unicorn,设置方法完全一样。
启动Gitlab
更改gitlab.rb
之后一定要更新设置,只要不出红色错误就表示成功:
sudo gitlab-ctl reconfigure
然后最好再重启,只要不出红色错误就表示成功:
sudo gitlab-ctl restart
可以用下面这个命令查看运行状态:
sudo gitlab-ctl status
还可以实时查看Gitlab被访问时候的反应日志,有时候这个很重要:
sudo gitlab-ctl tail
停止的命令上面出现过:
sudo gitlab-ctl stop
通过上面的操作仍然是打不开网站的,因为还是运行在本地,并没有通过80端口向外网公开。
安装Nginx
Nginx是什么?它是服务器路由软件。什么意思?就是如果我们在一个服务器上运行了多个服务程序,比如第一个运行在8080端口,第二个运行在8081端口,第三个运行在8090端口...而我们又需要让这些程序分别对应到不同网站,比如访问ai.10knet.com
时候对应第一个端口上的程序,访问www.10knet.com
对应到8081端口上的程序...我们知道,所有的网站访问都是通过80端口进入服务器的,那么我们就需要一个转发软件,根据不同网址将用户请求转发给各个端口上的程序,这就是Nginx。
如果把服务器比作一个公司的电话系统,那么Nginx就是总机。外面都是通过同一个号码打过来电话,总机再分别切换到不同的分机。
Nginx实际上更常用的功能是做为静态网页文件服务器,为用户提供网页文件。类似于麦当劳的售货员,用户向他要什么食品,他就到货架上找到拿过来。
Nginx官方安装说明比较复杂,仅供参考,链接地址https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-plus/#install_rhel_centos。
其实安装很简单,先添加资源包:
sudo yum install epel-release
然后安装:
sudo yum install nginx
然后启动:
sudo systemctl start nginx
可以设置随系统自动启动:
sudo systemctl enable nginx
每次修改配置后都要用的重载设置命令:
nginx -s reload
停止、重启和查看状态命令:
systemctl stop nginx
systemctl restart nginx
systemctl status nginx
配置Nginx
Nginx的配置文件的位置是:
/etc/nginx/nginx.conf
用VSCode打开,修改以下几个配置。
- 顶部的用户名要和我们上面Gitlab配置的相符。
user root;
- 在http内增加一个新的server服务器路由。
upstream gitlab-workhorse {
server unix:/var/opt/gitlab/gitlab-workhorse/socket;
}
server {
listen *:80;
server_name git.10knet.com;
server_tokens off;
root /opt/gitlab/embedded/service/gitlab-rails/public;
access_log /var/log/nginx/gitlab_access.log;
error_log /var/log/nginx/gitlab_error.log;
location / {
client_max_body_size 0;
gzip off;
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Host $http_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-Proto $scheme;
proxy_pass http://gitlab-workhorse;
}
}
这个代码的大致思路就是先起动一个上游服务,指向gitlab-workhorse
,这是Gitlab整体的服务入口。
- 注意
listen *:80;
表示Nginx监听所有80端口来的网页访问,如果访问的地址是server_name git.10knet.com;
,那么就转发给Gitlab。 -
root /opt/gitlab/embedded/service/gitlab-rails/public;
这实际是Gitlab静态页面的地址。 - 如果找不到对应的静态页面,那么就转发给
proxy_pass http://gitlab-workhorse;
保存修改,然后重新载入nginx -s reload
,然后在浏览器打开你设置的Gitlab外部地址http://git.10knet.com
,成功的话就可以看到Gitlab登录页面了。
![](https://img.haomeiwen.com/i4324074/0f4e48fe40ec9c18.png)
设置管理员密码
如上所示,Gitlab网站登录会要求设置密码,设置新密码之后跳转到登录页面,账号使用root,密码使用刚才设定的,就可以登录进去。
![](https://img.haomeiwen.com/i4324074/a76ac29850819d7e.png)
如果在密码上遇到问题,那么可以登录服务器,用命令行重设,官方指导地址https://docs.gitlab.com/ce/security/reset_root_password.html。
具体命令方法如下。
gitlab-rails console -e production
user = User.where(id: 1).first
user.password = 'secret_pass'
user.password_confirmation = 'secret_pass'
user.save!
然后输入exit()
退出。运行效果如下图所示。
![](https://img.haomeiwen.com/i4324074/083ed53a5513c3c3.png)
Gitlab用户和项目设置
使用root登录成功之后,就可以进入管理区域Admin Area进行各项设置了。
![](https://img.haomeiwen.com/i4324074/03bd70a955de54ca.png)
- 用户设置。
默认情况是允许自由注册的,用户名任意,邮箱任意,也不进行邮箱验证。
用户被分为外部external和内部inner两种,外部用户只能查看公共public的项目,不能看内部项目,也不能创建项目,内部用户则不这些限制。
在【Admin Area-左侧栏Settings--General-右侧-Account and limit(Expand)-勾选Newly registered users will by default be external-Save Changes】,这样所有新注册用户都只能是外部用户,对他们来说,你的Gitlab就变成了一个资源下载和观看站点,没有太多可以操作的功能。
如果希望你的Gitlab更加封闭,那么同样可以在这里勾选【Sign-up restrictions(Expand)-去除Sign-up enabled勾选-Save Changes】,那么页面上的Register按钮都会消失,无法注册新用户了。
对于所有用户都可以在【Admin Area-Overview-Users-点选Edit按钮修改】页面进行修改,比如去掉External勾选让他变为内部用户,还可以强行重置他的密码。如果要删除用户或临时屏蔽Block他,需要在外面【Users-点齿轮按钮】。
- 项目设置。
Gitlab中的项目分为三类,私有Private(其他人不可见)、公共Public(所有人可见)和内部Internal(External不可见)。
为了避免项目文件太大导致服务器空间消耗,可以在【Admin Area-左侧栏Settings-General-右侧Account and limit(Expand)-设置Maximum push size (MB)】到100,即每次推送最大100M。也可以设定论坛中最大上传图片大小Maximum attachment size (MB)到10M。在付费版Gitlab中还可以为每个项目设置不同的限额。
Gitlab-runner
如果你希望每次推送项目文件到服务器上之后,服务器都能自动启动一些命令,那么就要用到Gitlab-runner了。
仍然是先添加资源:
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
然后安装:
sudo yum install gitlab-runner
然后把Gitlab-runner注册到Gitlab网站:
sudo gitlab-runner register
这会提示你先输入网站地址,就是之前设置的http://git.10knet.com/
,然后又要输入token令牌,这个令牌要用root登陆网站,然后从【AdminArea-Overview-Runners】右侧找到token并复制,如下图所示。
![](https://img.haomeiwen.com/i4324074/81b38b2ed4f94243.png)
然后要输入描述description,随便输入什么。然后又要输入tag标签,随便输入。最后要选executor执行器,建议选shell
。整体如下图所示。
![](https://img.haomeiwen.com/i4324074/f6f8ed4cabbabae0.png)
最后检查是否设置成功。在Admin Area的Runner页面刷新一下,应该可以看到列表中多了一个。如下图所示
![](https://img.haomeiwen.com/i4324074/dca639ae9f65184a.png)
但这时候还不能用,我们要点右侧的铅笔进去编辑,务必勾选下面这个Indicates whether this runner can pick jobs without tags选项,它是指对任意项目都能发布成为网站,不区分项目的标签。
![](https://img.haomeiwen.com/i4324074/ff6c18a1cc9410ae.png)
建议把Maximum job timeout每个任务的超时也设置为比较大的数值,如3600,单位是秒即1小时或者10分钟,避免由于某些大项目而导致超时失败。
Pages设置
如果你想让用户把Gitlab上项目中的html文件变成网站发布,那么可能会想到使用Gitlab的Pages。但我不推荐你那么做,原因是它很慢,发布一次可能需要等几分钟,如果站点有几百M的话可能需要半小时,而且每次都需要这么久,即使你只更新了一点点内容。——更糟糕的是,这个发布过程竟然是消耗阿里云服务器的外网流量的,如果你有个1G的项目,那么即使修改一行代码,也会消耗2G的流量,外加半小时等待。
下面是一个替代解决方案。
首先我们用任意账号创建一个项目mysite
,勾选自动初始化Initialize repository with a README。然后直接在网站上创建一个index.html
文件,写入Hello mysite!
,提交修改Commit Changes。
然后再创建一个.gitlab-ci.yml
文件,写入下面内容:
pages:
stage: deploy
script:
- git status
同样提交它。(其实上面这个内容什么也没做,只是刷新一下runner而已)
然后到项目页面左侧的【CI/CD】查看,应该列表中有一个任务存在。顺利的话已经显示完成passed。
![](https://img.haomeiwen.com/i4324074/588c93dfa9d56f92.png)
如果这个任务显示被挂住Pending,那么切换到root登陆,到Admin Area的Runner中检查这个项目mysite是否被授权运行,如下图所示。
![](https://img.haomeiwen.com/i4324074/799c53b8bb7be67b.png)
然后我们使用sftp软件登陆服务器,查看下面的目录,其中的XXXXX和用户名username可能和你不同。
/home/gitlab-runner/builds/XXXXX/0/username/mysite/
你会发现,你的项目原封不动的被复制到了这里!所以我们只要用Nginx把对应的网址指向这个文件夹就可以了!
打开Nginx的设置文件/etc/nginx/nginx.conf
,向http
内添加下面的内容,创建一个网页文件服务器。
server {
## 泛域名服务器,静态文件
listen 80;
server_name ~^(?<subdomain>.+).git.10knet.com$;
root /home/gitlab-runner/builds/XXXXX/0/$subdomain ;
index index.html index.htm;
## 出错地址指向子域名内error文件夹
error_page 404 /40x.html;
location = /40x.html {
root /home/gitlab-runner/builds/XXXXX/0/$subdomain/err ;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /home/gitlab-runner/builds/XXXXX/0/$subdomain/err;
}
}
这个代码的意思是如果遇到zhyuzh.git.10knet.com
的请求,就到/home/gitlab-runner/builds/XXXXX/0/zhyuzh/
文件夹去找网页,比如http://zhyuzh.git.10knet.com/mysite/index.html
就对应了/home/gitlab-runner/builds/XXXXX/0/zhyuzh/mysite/index.html
。
执行Nginx重载命令sudo nginx -s reload
,然后你可以尝试在浏览器中打开页面验证是否成功看到Hello mysite!
。
警告!如果你的项目中含有敏感信息,比如个人密码或私人记录,那么千万不要创建任何.gitlab-ci.yml
文件,因为它会自动把你整个项目拷贝到Nginx的目录,整个项目会被曝光到全网!
修改Gitlab首页界面
怎样把Gitlab页面自定义成自己的网站?
在Admin Area左侧栏Appearance外观中有一些好用的设置,比如替换导航栏最左侧的Logo,替换浏览器标签卡的小图标Favicon,还可以增加底部的Footer信息,以及注册登录页的文字内容、新建项目时候的文字说明等等,修改后别忘记保存。
![](https://img.haomeiwen.com/i4324074/e0930232fd40c161.png)
但对于国内网站来说,必须在底部添加相关备案信息,如何才能修改Gitlab页面呢?
你可以修改下面两个页面:
/opt/gitlab/embedded/service/gitlab-rails/app/views/layouts/devise.html.haml
/opt/gitlab/embedded/service/gitlab-rails/app/views/layouts/devise_empty.html.haml
haml文件看上去和html差异很大。我的修改内容供大家参考,只要替换底部.footer-links
下面的三行就可以:
.container.footer-container
.footer-links
= link_to _("快速浏览"), explore_root_path
= link_to _("苏ICP备15036923号-1"), "http://www.beian.miit.gov.cn/"
= link_to _("帮助"), help_path
修改完成后,到命令行中刷新Gitlab设置并重启,必要的时候可以在刷新Nginx:
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
nginx -s reload
生效后登录页底部就会正常显示备案信息。
![](https://img.haomeiwen.com/i4324074/bb58f89c5f7916b3.png)
结束语
整体来说完整的配置Gitlab还是挺烦的,如果不用Nginx会好很多。但是一旦遇到问题就很难搞定,因为Gitlab命令行的错误提示信息几乎是没用的,完全看不懂,比如说端口被占用出错的提示完全不提端口问题,内存不足也不说,这方面感觉Gitlab还是很不友好的。但顺利的时候还是挺简单的,看运气吧。
END