前言

由于gitlab内置了nginx,如果服务器上之前有安装nginx或apache,那么默认配置下必定会与gitlab的端口冲突。

解决冲突

们可以这样进行配置以解决冲突:

vim /etc/gitlab/gitlab.rb
​# 修改
external_url 'http://gitlab.hisune.com:8888' 
# 这个地址是gitlab中的clone地址和邮件发送的链接地址,也是理论上的gitlab入口地址
# 这样gitlab的web其实是监听的8888端口

修改完毕后重启加载配置和重启服务:

# 重新加载配置
sudo gitlab-ctl reconfigure
# 重启gitlab
sudo gitlab-ctl restart

实际上经过上面的修改后gitlab会将nginx的配置改为监听8888端口:

vim /var/opt/gitlab/nginx/conf
# 会看到这一段配置
server {
  listen *:8888;

  server_name gitlab.hisune.com;
...

优化方案

如果只进行到这一步,那么冲突问题是解决了,但是用户每次访问必须打开:http://gitlab.hisune.com:8888 这个地址访问,后面带了一个端口号,异常麻烦。那么如何去掉呢?很简单,由于们服务器上之前有安装nginx或apache,那么可以用已经安装并运行的nginx或apache做代理服务器,将请求转发给gitlab的nginx。

在自己的apache中配置(nginx类似,有疑问可以自行谷歌nginx proxy):

<VirtualHost  *:80>
    ServerAdmin webmaster@hisune.com
    ServerName gitlab.hisune.com
    RewriteEngine on
    RewriteCond %{SERVER_PORT} !^443$
    RewriteRule ^/?(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
</VirtualHost>
<VirtualHost *:443>
    ServerAdmin webmaster@hisune.com
    ServerName gitlab.hisune.com
    SSLEngine on
    SSLCertificateFile "/opt/lampp/etc/ssl/_.hisune.com.crt"
    SSLCertificateKeyFile "/opt/lampp/etc/ssl/_.hisune.com.key"
    SSLCertificateChainFile "/opt/lampp/etc/ssl/root_bundle.crt"
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    <Location />
        ProxyPass http://127.0.0.1:8888/
        ProxyPassReverse http://127.0.0.1:8888/
    </Location>
</VirtualHost>

这段配置有2个作用

  1. 将gitlab域的http请求转发到https端口
  2. 将gitlab域的https请求转发到gitlab的nginx 8888端口

这样配置实现了兼容apache与gitlab共存,不会出现端口冲突,们可以直接打开http://gitlab.hisune.com,他会自动跳转到https://gitlab.hisune.com。

追求完美

看起来很完美,实际上不是如此。们看到项目中的clone地址实际上是带上了8888端口号的http链接,并且gitlab发送的所有的邮件里面的链接也是如此,如果你的浏览器判断了你的这个域是支持https的,那么他会尝试跳转到https,这个时候链接变成了https://@gitlab.hisune.com:8888//docs.git,你当然是打不开这个链接的。

那么有没有办法让clone地址里面和邮件内容里面的链接去掉端口号呢?答案是有的。

实际上gitlab.rb中的external_url配置除了自动生成nginx配置以外,也是clone地址和邮件内容链接的地址,那么理论上们改掉这个地址就可以了,但是怎么让nginx的端口进行额外配置呢?发现了这个:

vim /etc/gitlab/gitlab.rb
# 这个地址是gitlab中的clone地址和邮件发送的链接地址,也是理论上的gitlab入口地址
# 把后面的8888端口去掉,那么用户那边就不会有这个端口号了
external_url 'http://gitlab.hisune.com' 

# 接下来指定gitlab的nginx监听端口
nginx['listen_port'] = 8888

其实很简单。。。

这样在用户实际使用起来不会有不正常的感觉,也就是gitlab可以自动跳转到https去访问,并且项目中的clone地址和邮件里面的链接不会出现8888这个端口。

如果您觉得您在我这里学到了新姿势,博主支持转载,姿势本身就是用来相互学习的。同时,本站文章如未注明均为 hisune 原创 请尊重劳动成果 转载请注明 转自: Gitlab与本机Apache或Nginx冲突的解决方案 - hisune.com