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をアプリケーションサーバとして使う構成になります。
環境と前提
- ubuntu 14.04
- nginx 1.4.6
- unicorn 4.8.3
- rbenv 0.4.0
- Ruby 2.2.0
- Railsのルートディレクトリは
/var/www/railsapp - Ruby, Railsのインストールは完了している環境 (参考:ubuntu14.04にRuby on Rails環境を構築する手順)
- RailsではデータベースとしてMySQLを使用。RailsでMySQLを使用するための設定も完了済の環境(参考:Ruby on RailsでMySQLを使用する際に必要な作業手順)
作業概要
主な作業としては以下のようになります。
- 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.confにunicorn.sockの設置場所として以下のように記述することがあるかもしれません。
上記のように記述すると、unicorn起動時にエラーが発生します。これは、virtualboxの共有ディレクトリがソケットの設置を許可していないためです。よって、vagrantの共有ディレクトリ配下にunicorn.sockを設置しないように気をつける必要があります。例えば以下のように/tmpに設置するのもいいかもしれません。
私自身この事実をしらずに悩んだのでメモしておきます。
defaultの編集
続いて/etc/nginx/sites-availableにあるdefaultを以下のように編集します。
上記で各自の環境に合わせて変更する必要がある箇所は、以下の2箇所です。
/var/www/railsappの部分を各自のRailsのルートディレクトリのパスに置き換える必要があります。server_name localhost 192.168.0.10のlocalhostや192.168.0.10を各自の環境にあわせて合わせて変更する必要があります。私の場合はローカル内でRailsアプリにアクセスしたかったので、Railsが動作するサーバのIPアドレスである192.168.0.10を指定しています。
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.dにunicornという名前の起動スクリプトを作成します。
そしてこのファイルの中身として以下を記述します。なお、以下の/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/configにunicorn.rbを作成します。そして以下を記述します。
上記のunicorn.rbでは、app_pathがRailsのルートディレクトリのパスを値として持つため、listen app_path + '/tmp/unicorn.sock', backlog: 64はlisten '/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.confにserver unix:/tmp/unicorn.sock fail_timeout=0;として記述した場合はunicorn.rbをnginx.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などの場合に比べて体感的に高速になりました。
関連記事
公開日:2019/10/04 更新日:2019/10/04RailsとSendGridでメール送信処理を実装する
Ruby on RailsからAction Mailerを使用してSendGrid経由でメールを送信する処理を実装したのでその手順をまとめます。
公開日:2018/05/30 更新日:2018/05/30ブラウザの操作を自動化できるSeleniumをWSLからRubyで使う
フォーム送信や繰り返し行う必要があるブラウザ操作を自動化できるSeleniumをWindows Subsystem for Linux のUbuntuからRubyを用いて使用するための手順をメモします。
公開日:2018/05/27 更新日:2018/05/27rbenvとruby環境の構築手順
WindowsのWindows Subsystem for LinuxでUbuntuを使いはじめ、その中にrbenvとRuby環境を構築したのでその手順をメモします。なお、UbuntuであればWindows Subsystem for Linux、仮想マシン、純粋なUbuntuのいずれでも同じ手順になります。思っていた以上に簡単に構築できました。
公開日:2018/05/06 更新日:2018/05/06RubyでGoogleスプレッドシートを読み込み・書き込みする
Googleスプレッドシートを自分で作成したRubyコードから読み込んだり、書き込んだりするためのコードについてまとめます。
公開日:2016/01/10 更新日:2016/01/10Railsでwickedpdfを使ってPDF出力する
Ruby on RailsでPDF出力させるのに便利なgemはたくさんありますが、htmlをそのままPDF化してくれる「wickedpdf」が一番お手軽で楽でした。wickedpdfの導入手順と使用方法をメモします。