ubuntu14.04でRailsをnginx + unicorn環境で動作させるための作業手順

はじめに

RailsをnginxとunicornによるWebサーバ環境で動作させるまでに思ったより苦労したのでその手順をメモしておきます。なお、以下の手順や使用する設定ファイルのほとんどは、以下のサイトを参考にしています。メールでお願いして使わせて頂いてます。大変参考になりました。

Setting Up Your Production Server With Nginx and Unicorn | Tealeaf Academy Blog

また、そもそもunicornとはなにかについては、以下のサイトが参考になると思います。(英語です)

Unicorn! | GitHub

今回構築する環境は、nginxをリバースプロキシとして使用し、unicornをアプリケーションサーバとして使う構成になります。

環境と前提


作業概要

主な作業としては以下のようになります。

  • nginxのインストールと設定
  • unicornのインストールと設定
  • 動作確認


nginxのインストールと設定

nginxのインストール

apt-getでupdateしてその後インストールでOKです。

nginxのインストール時のエラーと解決策

私の環境だと、上記のsudo apt-get install nginxを実行した時に以下のようなエラーが出ました。

このエラーの解決策としては、まず以下のコマンドでnginxをインストールするためのリポジトリを追加します。

続いて以下コマンドでアップデートし、その後でインストールを実行すれば無事に完了しました。

参考サイト様

VagrantでUbuntu+nginx+MySQL+PHP-FPMの最新環境を構築する | Qiita


nginx.confの修正

nginxのインストールが完了したら、次に/etc/nginx配下にあるnginx.confを以下のように修正します。

なお、上記のnginx.confで以下の部分は各自の環境に合わせて変更する必要があります。

上記の/var/www/railsapp/tmp/unicorn.sock/var/www/railsapp部分を各自のRailsのルートディレクトリパスに置き換える必要があります。また、Railsのルートディレクトリにtmpディレクトリがない場合はmkdir tmpで作成しておく必要があります。

vagrantを使用している場合の注意点

なお、vagrantを使用している場合に、vagrantの仮想マシン(virtualboxを使用)とホストマシンの共有フォルダ上にRailsのルートディレクトリを設置することがあると思います(vagrantのデフォルトだと、仮想マシンからみて/vagrantがホストマシンとの共有ディレクトリになっていると思います)。この場合に、nginx.confunicorn.sockの設置場所として以下のように記述することがあるかもしれません。

上記のように記述すると、unicorn起動時にエラーが発生します。これは、virtualboxの共有ディレクトリがソケットの設置を許可していないためです。よって、vagrantの共有ディレクトリ配下にunicorn.sockを設置しないように気をつける必要があります。例えば以下のように/tmpに設置するのもいいかもしれません。

私自身この事実をしらずに悩んだのでメモしておきます。

defaultの編集

続いて/etc/nginx/sites-availableにあるdefaultを以下のように編集します。

上記で各自の環境に合わせて変更する必要がある箇所は、以下の2箇所です。

  • /var/www/railsappの部分を各自のRailsのルートディレクトリのパスに置き換える必要があります。
  • server_name localhost 192.168.0.10localhost192.168.0.10を各自の環境にあわせて合わせて変更する必要があります。私の場合はローカル内でRailsアプリにアクセスしたかったので、Railsが動作するサーバのIPアドレスである192.168.0.10を指定しています。

最後に、Railsのルートディレクトリの所有者をwww-dataに変更し、アクセス権限として755を設定しておきます。

あとは以下のコマンドでnginxの設定ファイルを再読み込みし、さらに起動できるかを確認しておきます。

以上でnginxのインストールと設定は完了です。

unicornのインストールと設定

unicornのインストール

unicornをインストールするために下記をGemfileに追記します。

そしてRailsのルートディレクトリ(今回の場合は/var/www/railsapp)に移動したあとでbundle installを実行します。

以上でunicornのインストールは完了です。なお、上記のbundle install時にmysql2パッケージ関連でエラーが出る場合があります。An error occurred while installing mysql2 (0.3.11)...のようなエラーです。このエラーの解決策としては、以下コマンドを実行すればOKです。

もし上記を実行してさらにエラーが出る場合や、別のエラーが出る場合は、こちらにいくつかのエラーとその解決策を載せているので参考になるかもしれません。

unicornをubuntuのサービスとして登録

unicornをubuntuのサービスとして登録してコマンドとして使用するために/etc/init.dunicornという名前の起動スクリプトを作成します。
そしてこのファイルの中身として以下を記述します。なお、以下の/etc/init.d/unicornの中身は冒頭に載せた参考サイト様のものをそのまま使わせて頂いてます。大変参考になりました

上記の/etc/init.d/unicornの記述のうち、各自の環境に合わせて変更する必要がある箇所、確認が必要な箇所は以下の4箇所です。

  • USER=user1は各自のubuntuのユーザ名(PCでログインしているユーザ名)を記述します。上記ではubuntuのユーザとしてuser1を記述していますが、このuser1を各自の環境にあわせて合わせて変更する必要があります。例えば、vagrantを使用している場合は、デフォルトのユーザ名はvagrantです。
  • APP_ROOT=/var/www/railsappは、各自のRailsのルートディレクトリを指定する必要があります。
  • RAILS_ENV=productionは、各自のRailsを動作させる環境を指定する必要があります。ここでは本番環境であるproductionを指定しています。
  • RBENV_RUBY_VERSION=cat $APP_ROOT/.ruby-versionは、各自のRailsルートディレクトリにある.ruby-versionというファイルを読み込んでいます。この.ruby-versionにはそのファイル名とおり、使用しているRubyのバージョン番号が記述されています。もしRailsルートディレクトリにこのファイルがなければ、自分で作成し、使用しているRubyのバージョン番号を記述しておく必要があります。Rubyのバージョンはruby -vで確認できます。また、私の場合は2.2.0を使用しているので単純に.ruby-versionには2.2.0とだけ記述しておけばOKです。

続いて今作成したunicornに実行権限を与えてさらにubuntuの起動と同時にunicornを起動させるためにupdate-rc.dを実行します。


unicornの設定ファイル作成

Railsのunicronの設定ファイルとして/var/www/railsapp/configunicorn.rbを作成します。そして以下を記述します。

上記のunicorn.rbでは、app_pathがRailsのルートディレクトリのパスを値として持つため、listen app_path + '/tmp/unicorn.sock', backlog: 64listen '/var/www/railsapp/tmp/unicorn.sock', backlog: 64と同義です。そしてこの部分はnginx.confに記述したserver unix:/var/www/railsapp/tmp/unicorn.sock fail_timeout=0;と合わせる必要があります。よって、もしvagrant(virtualboxを使用)の仮想マシンとホストマシンの共有フォルダ上にRailsのルートディレクトリを設置していて、nginx.confserver unix:/tmp/unicorn.sock fail_timeout=0;として記述した場合はunicorn.rbnginx.confに合わせて以下のように変更する必要があります。


動作確認

最後に動作確認を行います。以下のコマンドでnginx、unicornをそれぞれ起動します。

起動後、ブラウザを開いて192.168.0.10にアクセスして各自のRailsアプリにアクセスできればOKです。もしアクセスした際に403エラーが表示される場合は、各自のRailsルートディレクトリの権限などを確認すると解決につながるかもしれません。また、unicornが起動しない場合は、Railsルートディレクトリのlog/unicorn.logを参照すると原因がわかるかもしれません。あとは、rails s -b 0.0.0.0を実行してまずRails自体が正常に起動するかを確認するといいかもしれません。Railsが正常に起動できない状態だとunicornも起動できません。
なお、nginx, unicornは以下のコマンドで停止させることが可能です。


おわりに

Railsをnginx + unicornで動作させるまでの手順をメモしました。nginx + unicorn環境だとRailsアプリの動作がwebrickなどの場合に比べて体感的に高速になりました。

このエントリーをはてなブックマークに追加

SPONSORED LINK

この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL