旧環境のRailsアプリケーションは4.1で作成されていました。新環境のRailsバージョンは5.02なので、そのままでは動作しません。アプリケーションのアップデート作業が必要です。
まず、Railsアプリケーションのフォルダをまるっとバックアップしておきます。アップデートコマンド実行時に一部のファイルが上書きされてしまいますので、このバックアップが必要になります。
続いてGemfileをRails 5.02用に書き換えます。Rails 5.0.2インストール直後に作成したサンプルアプリケーションのGemfileを参考にしましょう。サンプルアプリケーションのGemfileをコピーしてから、バックアップしたGemfileを参考に必要なライブラリを追加する方法がよいでしょう。
cp ../sample/Gemfile . vim Gemfile
編集例
source 'https://rubygems.org' git_source(:github) do |repo_name| repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/") "https://github.com/#{repo_name}.git" end # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '~> 5.0.2' # Use sqlite3 as the database for Active Record #gem 'sqlite3' ←mysql2に変更 gem 'mysql2' # Use Puma as the app server gem 'puma', '~> 3.0' # Use SCSS for stylesheets gem 'sass-rails', '~> 5.0' # Use Uglifier as compressor for JavaScript assets gem 'uglifier', '>= 1.3.0' # Use CoffeeScript for .coffee assets and views gem 'coffee-rails', '~> 4.2' # See https://github.com/rails/execjs#readme for more supported runtimes gem 'therubyracer', platforms: :ruby ←コメントを外す # Use jquery as the JavaScript library gem 'jquery-rails' # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks gem 'turbolinks', '~> 5' # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder gem 'jbuilder', '~> 2.5' # Use Redis adapter to run Action Cable in production # gem 'redis', '~> 3.0' # Use ActiveModel has_secure_password # gem 'bcrypt', '~> 3.1.7' # Use Capistrano for deployment # gem 'capistrano-rails', group: :development group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console gem 'byebug', platform: :mri end group :development do # Access an IRB console on exception pages or by using <%= console %> anywhere in the code. gem 'web-console', '>= 3.3.0' gem 'listen', '~> 3.0.5' # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring gem 'spring' gem 'spring-watcher-listen', '~> 2.0.0' end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] ↓必要なライブラリを追加 gem 'devise' gem 'less-rails' gem 'twitter-bootstrap-rails' gem 'kaminari' gem 'kaminari-bootstrap', '~> 3.0.1'
RubyからJavaScriptを実行するためにはExecJSが必要になります。ExecJSは最適なJavaScriptランタイムを自動的に選択し、そのランタイムをRubyオブジェクトとして利用するのです。ExecJSは以下のランタイムをサポートしています。
- therubyracer – Google V8 embedded within Ruby – V8をRubyから使えるようにするgem。高速に動く。Windows環境に入れようとしてもたぶん失敗する。Windows環境では Node.js を入れると動く。
- therubyrhino – Mozilla Rhino embedded within JRuby – JRubyの場合はこれ。
- Node.js – インストールされているNode.jsを呼び出す。
- Apple JavaScriptCore – Included with Mac OS X
- Microsoft Windows Script Host (JScript)
ExecJSにより利用できるランタイムが自動判別され、RubyからJavaScriptコードが実行できるのですから便利というかすごいですね。でもうまくいかなくて悩むはまりどころでもあります。
ということでほぼ標準なtherubyracerを使用します。rails new コマンドで自動生成されたGemfileから、therubyracerに付いている#を外します。
続いて、
bundle update
次に以下のコマンドでアプリケーションの設定ファイル等を更新します。
rails app:update
コンフリクトしたファイルを上書きするか聞かれますので、すべて Y にして上書きします。
conflict config/boot.rb Overwrite /var/www/abc/config/boot.rb? (enter "h" for help) [Ynaqdh] Y force config/boot.rb exist config conflict config/routes.rb Overwrite /var/www/abc/config/routes.rb? (enter "h" for help) [Ynaqdh] Y force config/routes.rb conflict config/application.rb Overwrite /var/www/abc/config/application.rb? (enter "h" for help) [Ynaqdh] Y force config/application.rb conflict config/environment.rb Overwrite /var/www/abc/config/environment.rb? (enter "h" for help) [Ynaqdh] Y force config/environment.rb conflict config/secrets.yml Overwrite /var/www/abc/config/secrets.yml? (enter "h" for help) [Ynaqdh] Y force config/secrets.yml create config/cable.yml create config/puma.rb create config/spring.rb exist config/environments conflict config/environments/development.rb Overwrite /var/www/abc/config/environments/development.rb? (enter "h" for help) [Ynaqdh] Y force config/environments/development.rb conflict config/environments/production.rb Overwrite /var/www/abc/config/environments/production.rb? (enter "h" for help) [Ynaqdh] Y force config/environments/production.rb conflict config/environments/test.rb Overwrite /var/www/abc/config/environments/test.rb? (enter "h" for help) [Ynaqdh] Y force config/environments/test.rb exist config/initializers create config/initializers/application_controller_renderer.rb conflict config/initializers/assets.rb Overwrite /var/www/abc/config/initializers/assets.rb? (enter "h" for help) [Ynaqdh] Y force config/initializers/assets.rb identical config/initializers/backtrace_silencers.rb conflict config/initializers/cookies_serializer.rb Overwrite /var/www/abc/config/initializers/cookies_serializer.rb? (enter "h" for help) [Ynaqdh] Y force config/initializers/cookies_serializer.rb create config/initializers/cors.rb identical config/initializers/filter_parameter_logging.rb identical config/initializers/inflections.rb identical config/initializers/mime_types.rb create config/initializers/new_framework_defaults.rb identical config/initializers/session_store.rb conflict config/initializers/wrap_parameters.rb Overwrite /var/www/abc/config/initializers/wrap_parameters.rb? (enter "h" for help) [Ynaqdh] Y force config/initializers/wrap_parameters.rb exist config/locales identical config/locales/en.yml gsub config/environments/development.rb identical config/cable.yml remove config/initializers/cors.rb exist bin identical bin/bundle conflict bin/rails Overwrite /var/www/abc/bin/rails? (enter "h" for help) [Ynaqdh] Y force bin/rails conflict bin/rake Overwrite /var/www/abc/bin/rake? (enter "h" for help) [Ynaqdh] Y force bin/rake create bin/setup create bin/update After this, check Rails upgrade guide at http://guides.rubyonrails.org/upgrading_ruby_on_rails.html for more details about upgrading your app.
上書きされたファイルは、一つ一つdiffツールを使用してバックアップファイルと比較し、必要なコードを追記・修正していきます。
バックアップとのdiffの結果、追記・修正したファイルは以下の通りでした。
- config/routes.rb
- config/application.rb
- config/environments/production.rb
Pumaの設定ファイルは以下の通り追加しました。
vim config/puma.rb
workers 2
preload_app!
on_worker_boot do
ActiveRecord::Base.establish_connection if defined?(ActiveRecord)
end
bind "unix:///var/www/abc/tmp/sockets/puma.sock"
port 3001
workersはCPUコア数と一致させます。これでクラスターモードとなって複数のワーカープロセスが立ち上がります。
preload_app!でワーカーを起動する前にアプリケーションをプリロード、さらにActiveRecordの接続プールを設定します。
ソケットにbindする設定を追加、ポート番号は3001を指定します。
Nginxの設定ファイルにもクラスターモードの設定をします。
vim /etc/nginx/nginx.conf
worker_processes 2; worker_cpu_affinity 01 10;
worker_processesはCPUコア数と一致させ、worker_cpu_affinityでどのCPUコアを使用するか2進数で指定します。
バーチャルサーバー毎の設定ファイルはこのようになりました。
vim /etc/nginx/conf.d/abc.conf
upstream abc_backend { server unix:///var/www/abc/tmp/sockets/puma.sock; } server { listen 443 ssl; server_name abc.com; ssl_certificate /etc/letsencrypt/live/abc.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/abc.com/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA512:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:ECDH+AESGCM:ECDH+AES256:DH+AESGCM:DH+AES256:RSA+AESGCM:!aNULL:!eNULL:!LOW:!RC4:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS; ssl_dhparam /etc/nginx/dhparam.pem; location / { proxy_pass http://abc_backend/; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto https; } } server { listen 80; server_name abc.com; root /var/www/abc/public; return 301 https://$host$request_uri; }
これで新環境でアプリケーションの本番稼働ができるようになりました。
SSL証明書は前環境から引き継いでいます。次回はLet’s Encryptのサーバー引き継ぎです。