LoginSignup
51

More than 5 years have passed since last update.

PassengerでRuby On Railsアプリを公開するまで

Last updated at Posted at 2015-12-02

環境はConoHa(Ubuntu14.04)です。
Apacheなんかのセットアップは前の記事を参照。
はまりまくったので整理しましたが、これでもいろいろ漏れているかもしれません。。

Passengerは、Railsアプリを実行するためのApacheモジュールで、Apache単独でRailsアプリケーションを実行できるようにするものです。

公開用にファイルをサーバに準備

ファイルを格納する

ローカルからscpでサーバにファイルをアップロード

$ scp -P 10000 -r /Users/username/RailsApp username@192.168.11.1:/home/username

configをサーバのものに書き換え

例えば、下記のファイルなど、アプリで定義しているサーバをアップするサーバのものに修正する

config/settings.yml
url: 'http://www.server.name:3000'

Gemfileに記載したものをインストール

ローカルで実行したのと同じです。サーバにもインストールをします。
そのほか、開発中にインストールしたものはサーバにもインストールして下さい。(例えば、ImageMagickなど)

$ bundle install --path vendor/bundler

DBの準備

開発時にsqlite3を使用していたのですが、公開にあたってはMySQLにしようと思い、その変更もしました。

権限の付与

パスワードpasswordのuserに、dbtableへの権限を付与
mysql> GRANT ALL PRIVILEGES ON dbtable.* TO user@localhost IDENTIFIED BY 'password' WITH GRANT OPTION;

構築

databaseもproduction環境のものを設定します。Userは権限付与したUserを、Passwordは実行時に環境変数で渡します。

config/database.yml
production:
  adapter: mysql2
  encoding: utf8
  database: databasename
  pool: 5
  username: user
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/run/mysqld/mysqld.sock

修正したら、DBをmigrateします。
$ rake db:migrate RAILS_ENV=production DATABASE_PASSWORD='password'

環境準備

Passengerのインストール

$ gem install passenger --no-ri --no-rdoc -V
$ rbenv rehash
$ passenger-install-apache2-module

※passenger-install-apache2-moduleでは、必要なソフトがない場合、どのapt-getコマンドでインストールできるか教えてくれるのでそのままコピペでインストールし、再度実行

Passengerを設定

passenger-install-apache2-moduleで出てきた情報をapacheのconfigに記述します。
コンソールを閉じてしまった場合など、もう一度見たい場合、下記コマンドで確認できます。
$ passenger-install-apache2-module --snippet

apache2.confに書けば良いらしいのですが、今回は新規ファイル(passenger.conf)に記載しました。また、Portは3000にしました。
内容は最終的に採用したものに改造しています。

/etc/apache2/site-available/passenger.conf
# Ruby on Rails root
<VirtualHost *:3000>
    # RailsEnvはproductionを指定
    RailsEnv production
    # Passengerの使用を明記
    PassengerEnabled on
    # 自分のサーバのドメインやIPアドレスに変更
    ServerName www.server.name
    # DocumentRootはpublicディレクトリと記載があるが、後述の方法で指定するためここでは通常のDocumentRootを指定
    DocumentRoot /var/www/html
    # DocumentRoot+RailsBaseURIがDocumentRootとなる
    RailsBaseURI /railsApp
  <Directory /var/www/html/railsApp>
    AllowOverride all
    Options -MultiViews
  </Directory>
</VirtualHost>

# Passenger Configuration
LoadModule passenger_module /home/username/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/passenger-5.0.21/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /home/username/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/passenger-5.0.21
  PassengerDefaultRuby /home/username/.rbenv/versions/2.2.2/bin/ruby
</IfModule>

# シンボルリンクを許可
PassengerResolveSymlinksInDocumentRoot on

現在動作している000-default.confを無効にし、passenger.confを有効にする

$ sudo a2dissite 000-default.conf
$ sudo a2ensite passenger.conf

RailsBaseURIに合わせて、実際のソースが置いてある場所にシンボリックリンクを作成する

(例)
ソースの置いてある場所(publicディレクトリの1つ上の階層):/home/username/railsApp
DocumentRoot(+RailsBaseURI):/var/www/html/railsApp
の場合、下記コマンドとなる
$ sudo ln -s /home/username/railsApp/public /var/www/html/railsApp

環境変数を設定する

bundle exec rake secret
export SECRET_KEY_BASE=(rake secretの値)
※再起動で消えてしまうので、bashrcに記載した方が良いです

/home/username/.bashrc
(途中略)
export SECRET_KEY_BASE=(rake secretの値)
(途中略)

bashrcに記述した場合は下記コマンドも実行

$ source ~/.bashrc

公開〜動作確認

Passengerを開始する

$ passenger start --environment production
※passenger startするのはプロジェクトのあるディレクトリです!!
 →そうしないとPassengerを実行したディレクトリを参照してしまい、404 Not Foundになります

Railsのアプリを開始する

$ DATABASE_PASSWORD=(password) bundle exec rails s -e production

動作確認方法

APIの場合、cURLでも確認できますが、Postmanを使うと便利です。
https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop

ページの場合はそのままブラウザで確認で良いかと思います。

エラーが発生したら

・Passengerのログを見る
  →Passenger実行ディレクトリ配下にlog/passenger.3000.logが生成されるので、そのログを確認

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
51