興味本位でGitlabを自分の環境に設置してみたいなと思っていたところ、最近大変参考にさせてもらっているクラスメソッドさんの開発ブログに「社内 GitHub を実用的に構築! Amazon VPC 環境に GitLab サーバを構築してみた」の記事を発見しました。一通り読ませていただくと、手順が詳細に解説されており自分でも対応できそうなのでチャレンジしてみました。
最近Amazon Web Servicesにも興味を持っていたこともあり、最初は記事通りAWS上に設置したのですが、2年目以降のランニングコストを試算したところ、それなりにコストが必要なことが分かったことから、現在契約しているさくらのVPS上に設置することにしました。
実際にさくらのVPSで設置作業を行ったところ、記事通りの手順で問題なく、しかも簡単にGitlabサーバーが設置できました。AWSでの操作をさくらのVPSの操作に置き換えるのみでOKです。ただ1点、/etc/nginx/nginx.confの設定でuserをgitlabにすることに違和感を覚え色々調査を行いました。
- nginxをGitlabのみに使うのであればそのままでも良いのですが、おそらくこの先、別の用途でもnginxを利用する可能性が大きいことが、違和感の原因となっていると思います。
userをgitlabにしなければならない理由
クラスメソッドさんの記事でもgitlabhq Issue #2899へのリンクにて紹介されていますが、nginxの動作ユーザーをgitlabにしなければならないのは、gitlab.socketを利用してnginxとgitlabを連携させようとした時、Permission deniedとなることです(記事通り作業を行うと、/var/log/nginx/gitlab_error.logで確認できます)。
「gitlab.socket nginx permission denied」などで検索しても、解決方法は得られないでいました。
gitlab.socketは何をしているか...から見つけた解決法
そもそも、このgitlab.socketは何をしているのかと考え始めました。(UnicornやRailsについて初めてで、何も知らずに記事通りにコマンドを打ったので...。)ちょうどAmazonで注文した「WEB+DB PRESS Vol.72」が届いたのでnginx特集をめくっていたところ、UnicornというRailsのWebアプリケーションサーバーがあり、nginxとUnicornの通信にgitlab.socketを使用してTCPソケット通信を行っていることを知りました。
そこで、「unicorn nginx rails」というキーワードで検索をして記事を見ていったところ、ほとんどの記事で「-Dを指定してデーモンモードで起動」という記述があることに気付きました。gitlabにおいてはどうなっているかを確認したところ(対象は/etc/init.d/gitlab)、unicorn_railsはデーモンモードで起動していないようでした。そのため、次のようにデーモンモードで起動するようにし、nginxのuserをnginxに戻し、nginxとgitlabをrestartさせたところ、思惑通りGitlabが動作しました。めでたし。
DAEMON_OPTS="-c $APP_ROOT/config/unicorn.rb -E production -D"
あえてフォアグランドプロセスとして動作させていたのか気になるところですが、unicornの停止もPIDファイルでkillしていることから、ひとまずこれで問題ないのではということにして調査を終えることにしました。