总所周知的,除了 Tomcat 默认端口为 8080,Nginx 和 Apache 服务器默认的监听端口都是 80。在 linux (Unbantu 16.04.4) 使用 xampp 搭建 web 服务器 之后,发现 gitlab 存在内嵌的 Nginx 服务器,所以在启动 xampp 脚本的时候,Apache 是启动失败的。

因为 gitlab 上已经有多个项目了,不愿意修改其内嵌 Nginx 的默认端口。恰好找个这样一个教程 gitlab自带的Nginx与原Nginx冲突的解决方案,作者针对对 gitlab 的运行配置给出了两个方案,我这边做一个简单的摘录:

方案一:修改 GitLab 端口

vim /var/opt/gitlab/nginx/conf/gitlab-http.conf

upstream gitlab-workhorse {
  server unix:/var/opt/gitlab/gitlab-workhorse/socket;
}

server {
  listen *:80;  --修改端口


  server_name localhost;
  server_tokens off; ## Don't show the nginx version number, a security best practice
  ......
  ......
  只列举了其中一部分
}

方案二:禁用 gitlab 自带 Nginx,并把 UNIX 套接字更改为 TCP 端口,用安装的 Nginx 提供反向代理服务

vim /etc/gitlab/gitlab.rb

...
##禁用捆绑的 Nginx
# 将
nginx['enable'] = true
# 修改为
nginx['enable'] = false
# 并去掉注释 (前边的#)
...
##设置 gitlab-workhorse 监听 TCP 端口
gitlab_workhorse['listen_network'] = "tcp"
gitlab_workhorse['listen_addr'] = "127.0.0.1:8021"  //这个端口号和之后设置的 Nginx 代理的端口号要一致
...

执行 sudo gitlab-ctl reconfigure 使配置生效。

接着就是使用 Nginx 添加一个虚拟主机,配置其指向 gitlab 的 服务地址。

server {
    listen       8022;  #原作者的 gitlab 一般使用 8022 端口访问
    server_name  localhost;

    location / {
        root  html;
        index index.html index.htm;
        proxy_pass http://127.0.0.1:8021; #这里与前面设置过的端口一致
    }
}

这里解释一下为什么要配置反向代理:因为前面的 127.0.0.1:8021 是 gitlab 的服务地址,是不能对外访问的,此时就需要 web 服务器给 gitlab 开一个口子,让数据能够到达前台。其内嵌 Nginx 也是这个作用。

我的方案

毫无疑问,我更偏向于上面的方案二,只是后面的反向代理服务需要由 Apache 来提供。赶紧搜了一下 Apache 是否可以做反向代理,得到肯定的结果:Apache2.4反向代理设置

首先需要放开虚拟主机(反向代理)模块,对比几个 Apache 做反向代理的教程,发现 xampp 安装的 Apache 模块已经全部放开,所以直接配置虚拟主机即可。

我的情况是这样的,gitlab 之前一直使用的是 ip 地址,端口默认为 80,为 git 服务不受影响,则端口依然得是 80,ServerName 需要修改成 ip 地址(不能是 localhost,测试发现设置为 localhost 会莫名跳转到其他的虚拟主机或者默认的虚拟主机页面)。

以下是我的完整配置:

<VirtualHost *:80>
    ServerAdmin jasonli@www.seasidecrab.com
    #DocumentRoot "/opt/lampp/htdocs"
    ServerName xx.xx.xx.xx
    #ServerAlias localhost
    #ErrorLog "logs/dummy-host.example.com-error_log"
    #CustomLog "logs/dummy-host.example.com-access_log" common
    ProxyRequests off
    ProxyPass / http://127.0.0.1:8021/
    ProxyPassReverse / http://127.0.0.1:8021/
    <proxy *:80>
        Order deny,allow
        Allow from all
    </proxy>
</VirtualHost>

之前测试配置其他端口的虚拟主机走了些弯路,主要是 Apache 使用其他的端口时,需要提前监听对应端口。并且要确保阿里云这类的服务商为主机提供的安全组服务中已经开启了相关的端口。

Listen 8888
<VirtualHost *:8888>
    ServerAdmin jasonli@www.seasidecrab.com
    #DocumentRoot "/opt/lampp/htdocs"
    ServerName xx.xx.xx.xx
    #ServerAlias localhost
    #ErrorLog "logs/dummy-host.example.com-error_log"
    #CustomLog "logs/dummy-host.example.com-access_log" common
    ProxyRequests off
    ProxyPass / http://127.0.0.1:8021/
    ProxyPassReverse / http://127.0.0.1:8021/
    <proxy *:80>
        Order deny,allow
        Allow from all
    </proxy>
</VirtualHost>

并且 xampp 下 Apache 的配置文件位置 /opt/lampp/etc 下,而非 /opt/lampp/apache2