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

環境は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をサーバのものに書き換え

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

```yaml: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は実行時に環境変数で渡します。

```yaml: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にしました。
内容は最終的に採用したものに改造しています。

```bash:/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に記載した方が良いです

```bash:/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が生成されるので、そのログを確認