追記 2020/07/15
8080ポートはgitlabのrailsアプリケーションのポートなのだけど、ここに直接プロキシするのではなく、gitlabのHTTPのルーティングを行っているgitlab-workhorseの8181ポートに繋げないと駄目だった
自分が在籍している学科ではオンプレ上にgitlabを構築して運用している。
gitlabが動いているサーバーはオンプレ上に構築したKVMで動かしているVMなのだけど、歴史的理由でこのサーバーでは他にjenkinsやredmineなども動作している。
もともとredmine-> jenkins -> gitlabの順でサーバー上に構築されたこともあり、サーバー全体のwebサーバーはapacheで動いている。
問題がgitlabのinstallでgitlab-ceを使っていたのだけれど、gitlab-ceはデフォルトでgitlabにまつわるすべてのミドルウェアなどもインストールして構築してくれる。 具体的に言うとデータベースとしてPostgreSQL、webサーバーとしてnginxを同梱している。
現状の学科のgitlabは、このgitlab-ceに同梱されているnginxをポート8000番で起動させ、apacheからそのnginxにプロキシをしていた。つまりapache -> nginx -> gitlabの順でHTTPリクエストが伝搬 される。
具体的に見るとこういう感じだった。大変ですね。
$ lsof -i :8000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 5769 root 9u IPv4 131461357 0t0 TCP *:irdmi (LISTEN) nginx 5770 gitlab-www 9u IPv4 131461357 0t0 TCP *:irdmi (LISTEN) nginx 5770 gitlab-www 19u IPv4 131528575 0t0 TCP localhost:irdmi->localhost:52234 (ESTABLISHED) nginx 5770 gitlab-www 20u IPv4 131524330 0t0 TCP localhost:irdmi->localhost:52192 (ESTABLISHED) nginx 5771 gitlab-www 9u IPv4 131461357 0t0 TCP *:irdmi (LISTEN) nginx 5771 gitlab-www 18u IPv4 131526937 0t0 TCP localhost:irdmi->localhost:52196 (ESTABLISHED) nginx 5771 gitlab-www 19u IPv4 131530893 0t0 TCP localhost:irdmi->localhost:52244 (ESTABLISHED) nginx 5772 gitlab-www 9u IPv4 131461357 0t0 TCP *:irdmi (LISTEN) nginx 5772 gitlab-www 15u IPv4 131530209 0t0 TCP localhost:irdmi->localhost:52230 (ESTABLISHED) nginx 5773 gitlab-www 9u IPv4 131461357 0t0 TCP *:irdmi (LISTEN) httpd 7873 apache 16u IPv4 131524319 0t0 TCP localhost:52186->localhost:irdmi (CLOSE_WAIT) httpd 7874 apache 16u IPv4 131527717 0t0 TCP localhost:52192->localhost:irdmi (ESTABLISHED) httpd 8583 apache 16u IPv4 131528766 0t0 TCP localhost:52198->localhost:irdmi (CLOSE_WAIT) httpd 8831 apache 16u IPv4 131525112 0t0 TCP localhost:52164->localhost:irdmi (CLOSE_WAIT) httpd 9433 apache 16u IPv4 131524337 0t0 TCP localhost:52196->localhost:irdmi (ESTABLISHED) httpd 10272 apache 16u IPv4 131524317 0t0 TCP localhost:52184->localhost:irdmi (CLOSE_WAIT) httpd 11736 apache 16u IPv4 131529561 0t0 TCP localhost:52244->localhost:irdmi (ESTABLISHED) httpd 24102 apache 16u IPv4 131528566 0t0 TCP localhost:52230->localhost:irdmi (ESTABLISHED) httpd 24103 apache 16u IPv4 131525592 0t0 TCP localhost:52188->localhost:irdmi (CLOSE_WAIT) httpd 24111 apache 16u IPv4 131530228 0t0 TCP localhost:52234->localhost:irdmi (ESTABLISHED) httpd 24166 apache 16u IPv4 131526971 0t0 TCP localhost:52200->localhost:irdmi (CLOSE_WAIT)
この構成であまり問題は無かったのだけれど、諸事情でgitlabのHTTPヘッダにAccess-Control-Allow-Origin
の設定をする必要が出た。現状の構成だとApache側でAccess-Control-Allow-Origin
を付与しておけば良いと思ったのだけれど、実際はapache -> nginxに伝搬される際に、nginx側でヘッダ情報が落とされることが判明した。さらにgitlab-ceが生成するnginxの設定ファイルでAccess-Control-Allow-Origin
を付与するのが結構めんどくさそうだった。
というわけでapache -> nginx -> gitlab-ceのプロキシを止めて、apache -> gitlab-ceに一本化したい。本来ならapacheやめてnginxにしたいのだけれど、redmineやjenkinsのプロキシ設定も変更する必要があり、やや工数的にめんどいので段階的にやることにした。
gitlab側の設定
まずはnginxを止めなければならない。
これらはgitlab側の設定ファイルgitlab.rb
を編集することで停止できる。
若干違うけれど、gitlab公式の同梱されてないnginxを使う方法が参考になった。 docs.gitlab.com
とりあえずnginxの使用を止める
nginx['enable'] = false
この後に続く nginx['hoge']
的な記述はすべてコメントアウトしておく。
末尾にこの2行を追加する(これは効果があるかどうかは不明)
gitlab_workhorse['listen_network'] = "tcp" gitlab_workhorse['listen_addr'] = "127.0.0.1:8181"
apache側
今まではこんな感じの設定だった
<VirtualHost *:443> ServerName gitlab.ie.u-ryukyu.ac.jp ProxyRequests off ProxyPass / https://127.0.0.1:8000/ ProxyPassReverse / https://127.0.0.1:8000/ SSLEngine on SSLProxyEngine on SSLProxyCheckPeerCN off SSLProxyCheckPeerName off SSLCertificateFile hoge.cer SSLCertificateKeyFile hoge.key SSLCertificateChainFile hoge.cer </VirtualHost>
何も考えずにnginxにプロキシしていたが、apacheからgitlabに直接プロキシする場合はある程度設定を書き加える必要がある。
様々な人がブログエントリで設定例を書いていたが、最終的にはgitlab公式が出しているapacheの設定例が一番正しかった。
httpsでやってることもあるので、この例の通りにやらないとリポジトリの中身が表示されないとか、LDAPログインした後にコールバックされないなどの悲しさが存在する。
ここまで設定したらgitrlabとapacheを再起動すればよい
gitlab-ctl reconfigure gitlab-ctl restart gitlab-ctl reconfigure systemctl restart httpd