Apache-2.2

如何正確地為 GitLab 配置 Apaches mod_proxy 在一個 suburl 下結合其他 suburl

  • November 17, 2019

我有一台伺服器,我想在其上執行 GitLab 以及其他服務。在Google搜尋了一段時間後,我發現我需要做一些 mod_proxy 技巧來讓 Apache2 將請求轉發到 GitLab。但是現在,當我嘗試訪問伺服器上任何不是 /git 下的 GitLab URL 的 URL 時,我只會得到一個錯誤。我什至無法訪問我顯然應該訪問的 apaches 標準 index.html 頁面。該伺服器在 Ubuntu 14.04 LTS 下執行。gitlab 的配置文件是:

#This configuration has been tested on GitLab 6.0.0 and GitLab 6.0.1
#Note this config assumes unicorn is listening on default port 8080.
#Module dependencies
#  mod_rewrite
#  mod_proxy
#  mod_proxy_http
<VirtualHost *:80>
 ServerName lmmweb
 ServerSignature Off

 ProxyPreserveHost On

 # Ensure that encoded slashes are not decoded but left in their encoded state.
 # http://doc.gitlab.com/ce/api/projects.html#get-single-project
 AllowEncodedSlashes NoDecode

<Location /git>
 # New authorization commands for apache 2.4 and up
 # http://httpd.apache.org/docs/2.4/upgrading.html#access
 Require all granted

 ProxyPassReverse http://127.0.0.1:8080
</Location>

 #apache equivalent of nginx try files
 # http://serverfault.com/questions/290784/what-is-apaches-equivalent-of-nginxs-try-files
 # http://stackoverflow.com/questions/10954516/apache2-proxypass-for-rails-app-gitlab
 RewriteEngine on
 RewriteCond %{DOCUMENT_ROOT}/git/%{REQUEST_FILENAME} !-f
 RewriteRule /git/.* http:  //  127.0.0.1  :8080%{REQUEST_URI} [P,QSA]

 # needed for downloading attachments
 DocumentRoot /home/git/gitlab/public

 #Set up apache error documents, if back end goes down (i.e. 503 error) then a maintenance/deploy page is thrown up.
 ErrorDocument 404 /404.html
 ErrorDocument 422 /422.html
 ErrorDocument 500 /500.html
 ErrorDocument 503 /deploy.html

 LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b" common_forwarded
 ErrorLog  /var/log/apache2/gitlab/error.log

</VirtualHost>

我很確定 RewriteRules 內部一定有故障,但找不到。我在 http:// 的 RewriteRule 中包含了雙空格……因為由於缺乏聲譽,我遇到了一些錯誤。

最好的問候和感謝您的幫助。

我找到了解決方案:

問題是覆蓋了所有其他定義的虛擬主機。我的設置有必要讓這個 gitlab 實例在不同的埠下執行,然後從主配置代理到這個。

所以我的虛擬主機現在<VirtualHost:8081>和之前都是Listen 8081. 在我想要配置子網址的配置文件中,我添加了:

<Location /git>
 ProxyPass http://mydomain:8081/git
 ProxyPassReverse http://mydomain:8081/git
</Location>

巧合的是,我在看到您的答案前幾分鐘就解決了這個問題,但這並不是故事的結局。碰巧在創建新項目時(也可能在其他地方)Gitlab 仍然報告生成的 URLhttp而不是https協議。例如,一個人希望僅作為反向代理傳遞中的 localhost 訪問 gitlab nginx 伺服器(使用 Omnibus 安裝時,這裡似乎就是這種情況)。為此,您需要以下 Apache 配置:

ProxyPreserveHost On
<Location /gitlab>
   ProxyPass http://localhost:8929/gitlab
   ProxyPassReverse http://localhost:8929/gitlab
   # Necessary so Gitlab can return https addresses on some generated URLs
   RequestHeader set X-FORWARDED-PROTOCOL https
   RequestHeader set X-Forwarded-Ssl on
</Location>

然後必須將以下變數注入到 Gitlab 環境中,或者寫入到 中gitlab.rb,因此該服務只能作為 localhost 訪問:

 external_url 'http://localhost:8929/gitlab'
 # nginx['listen_port'] = 80 # I use this when mapping host 8929 to 80 in docker container
 nginx['listen_https'] = false
 gitlab_rails['gitlab_shell_ssh_port'] = 2222
 # Following is necessary otherwise Gitlab will generate git URLs pointing to localhost
 gitlab_rails['gitlab_ssh_host'] = 'git.myexeternaldomain.com'

引用自:https://serverfault.com/questions/657817