apache -> nginx -> gitlab-ceのプロキシを止める

追記 2020/07/15

8080ポートはgitlabのrailsアプリケーションのポートなのだけど、ここに直接プロキシするのではなく、gitlabのHTTPのルーティングを行っているgitlab-workhorseの8181ポートに繋げないと駄目だった


自分が在籍している学科ではオンプレ上にgitlabを構築して運用している。

gitlab.ie.u-ryukyu.ac.jp

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の設定例が一番正しかった。

gitlab.com

httpsでやってることもあるので、この例の通りにやらないとリポジトリの中身が表示されないとか、LDAPログインした後にコールバックされないなどの悲しさが存在する。

ここまで設定したらgitrlabとapacheを再起動すればよい

gitlab-ctl reconfigure
gitlab-ctl restart
gitlab-ctl reconfigure
systemctl restart httpd