環境は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をサーバのものに書き換え
例えば、下記のファイルなど、アプリで定義しているサーバをアップするサーバのものに修正する
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は実行時に環境変数で渡します。
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にしました。
内容は最終的に採用したものに改造しています。
# 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に記載した方が良いです
(途中略)
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が生成されるので、そのログを確認