我有一台 CentOS 7 服务器,其中有一个由 Apache 托管的现有网站(例如 mywebsite.com)。我希望 GitLab 由 Apache 而不是 nginx 管理,并且具有相对于我的网站之一的真实 url(例如 mywebsite.com/gitlab)。这对于 GitLab 综合包可行吗?
编辑:
有关我的配置的一些附加信息。这是我的 apache 主配置文件,其中应包含解决与任何虚拟主机不匹配的任何请求的信息;就 GitLab 安装而言,我没有触及这个文件。
/etc/httpd/conf/httpd.conf
粘贴链接
以下是我添加的配置文件,以便让 apache 使用 GitLab 解析虚拟主机(仍在尝试了解相对 url 虚拟主机是否可能);我跟着本指南对于 Apache 2.4 和 GitLab Omnibus(默认配方是这个)。
/etc/httpd/conf.d/gitlab.conf
<VirtualHost *:80>
ServerName mywebsite.com/gitlab
ServerSignature Off
ProxyPreserveHost On
AllowEncodedSlashes NoDecode
<Location />
Require all granted
ProxyPassReverse http://127.0.0.1:8181
ProxyPassReverse http://mywebsite.com/gitlab
</Location>
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_URI} ^/uploads/.*
RewriteRule .* http://127.0.0.1:8181%{REQUEST_URI} [P,QSA,NE]
DocumentRoot /opt/gitlab/embedded/service/gitlab-rails/public
ErrorDocument 404 /404.html
ErrorDocument 422 /422.html
ErrorDocument 500 /500.html
ErrorDocument 502 /502.html
ErrorDocument 503 /503.html
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b" common_forwarded
ErrorLog /var/log/httpd/mywebsite_error.log
CustomLog /var/log/httpd/mywebsite_forwarded.log common_forwarded
CustomLog /var/log/httpd/mywebsite_access.log combined env=!dontlog
CustomLog /var/log/httpd/mywebsite.log combined
</VirtualHost>
最后,这是GitLab Omnibus包的配置;我更改了 gitlab 主力端口,禁用了 nginx 并将 apache 设置为 Web 服务器的外部用户。就外部用户而言,我没有使用 www-data,因为我的机器上不存在这样的用户(如果我尝试使用 www-data,gitlab-ctl reconfigure 也会出错)。由于 httpd.conf 中的“User apache”指令,我认为 apache 是正确的,但我对此并不确定。
/etc/gitlab/gitlab.rb
external_url 'http://mywebsite.com/gitlab'
gitlab_workhorse['listen_network'] = "tcp"
gitlab_workhorse['listen_addr'] = "127.0.0.1:8181"
web_server['external_users'] = ['apache']
nginx['enable'] = false
通过这样的配置,我的网站无法正常工作:每个页面都显示 503 GitLab 错误“哎呀,GitLab 当前不可用。请尝试刷新页面,或返回并再次尝试该操作。”;原因可能是什么?请注意,如果我删除 gitlab.conf 文件并重新加载 httpd,则正常网站可以正常工作。另外,如果我禁用 apache 并仅使用相对 url 上的默认配置运行 GitLab(使用 nginx),一切也都正常;我只是不能把这两件事放在一起,相对 url 和 apache 而不是 nginx。
答案1
该解决方案在 CentOS 7 Web 服务器上运行,并通过 GitLab Omnibus 包安装了 Apache 2.4.6 和 GitLab 11.9.4。服务器在 http 上运行,但应该可以轻松转移到 https。
我想从 Apache 的全新安装开始,仅管理域中的一台主机mywebsite.com(无虚拟主机)。还应该干净安装 GitLab Omnibus 包(官方指南)。为了完整起见,这里是httpd.conffile,Apache的主要配置文件。它包含监听端口 80 并将所有请求定向到主域的指令mywebsite.com到指令指定的目录DocumentRoot
,即/var/www/html
;就我而言,此类目录包含一个 WordPress 实例。
/etc/httpd/conf/httpd.conf
Pastebin 上的 httpd.conf
现在,在编辑 GitLab 配置之前,请务必停止所有与sudo gitlab-ctl stop
.使 GitLab 能够处理相对 URL,作为主域的子目录mywebsite.com,首先要做的就是在相对 URL 上安装 GitLab;特别是,你必须修改external_url
指令gitlab.rb设置'http://mywebsite.com/gitlab'
为参数。然后,必须禁用 nginx(GitLab Omnibus 中捆绑的默认 Web 服务器); Web 服务器的外部用户必须设置为apache
(www-data
大多数发行版中都有 Apache 的外部用户,但apache
CentOS 7 中则有);由于 Apache 只能使用 http 套接字,因此必须将 GitLab 主力设置为侦听 tcp;下面假设 GitLab 主力监听端口 8181,该端口也需要设置。为了使 GitLab 安装简单,我还禁用了管道的 CI/CD 功能(使用指令gitlab_rails
),但这取决于您的需求。
请参阅官方 GitLab Omnibus 文档以了解更多信息配置相对 URL和使用非捆绑的 Web 服务器。 GitLab 的最终配置文件应类似于以下内容。
/etc/gitlab/gitlab.rb
external_url 'http://mywebsite.com/gitlab'
gitlab_workhorse['listen_network'] = "tcp"
gitlab_workhorse['listen_addr'] = "127.0.0.1:8181"
web_server['external_users'] = ['apache']
nginx['enable'] = false
gitlab_rails['gitlab_default_projects_features_builds'] = false
现在运行一个sudo gitlab-ctl reconfigure
.让我们回到 Apache 配置:现在 GitLab 已设置完毕,但我们必须将所有请求重定向到http://mywebsite.com/gitlab到实际的 GitLab 服务器。我发现的大多数解决方案都建议将子文件夹与虚拟主机一起使用,但这似乎不适用于 GitLab。解决方案是使用Location
指令;你可以在主 apache 配置文件中附加这样的配置httpd.conf或创建一个新的 .conf 文件并将其放入/etc/httpd/conf.d/,这样它将自动包含在内(但请确保您的httpd.conf包含指令IncludeOptional conf.d/*.conf
)。配置如下。
/etc/httpd/conf.d/gitlab.conf
Header add Strict-Transport-Security: "max-age=15768000;includeSubdomains"
<Location /gitlab>
Require all granted
#Allow forwarding to gitlab-workhorse
ProxyPassReverse http://127.0.0.1:8181
ProxyPassReverse http://mywebsite.com/gitlab
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_URI} ^/uploads/.*
RewriteRule .* http://127.0.0.1:8181%{REQUEST_URI} [P,QSA,NE]
ErrorDocument 404 /404.html
ErrorDocument 422 /422.html
ErrorDocument 500 /500.html
ErrorDocument 502 /502.html
ErrorDocument 503 /503.html
</Location>
</VirtualHost>
<Location /gitlab>
请务必根据您希望可访问 GitLab 的相对 URL修改参数。
现在配置已完成,运行systemctl reload httpd
以重新配置 Apache 并使用 .restart 重新启动 GitLab sudo gitlab-ctl restart
。还有一件事:一定要允许 Apache 使用 http 套接字:sudo setsebool -P httpd_can_network_connect=1
。