Ruby on Rails 4.1でUnicorn + Nginxでデプロイ(Ubuntu)
皆さんこんにちは
お元気ですか。私は元気です。
思ったよりも手こずったUnicorn + Nginxでのデプロイを行ってみます。
既にRailsはinstallされているとします。
まずは、Unicornから
Unicorn
Gemfile
gem unicorn
Unicornの設定
configの直下にunicorn.rbを置き、以下のように記載する。
@app_path = '/home/[apppath]' #自分のディレクトリを入力してください。 worker_processes 2 working_directory "#{@app_path}/" preload_app true timeout 30 #listen "/tmp/unicorn.sock", :backlog => 64 listen 8080, :tcp_nopush => true pid "/tmp/unicorn.pid" stderr_path "#{@app_path}/log/unicorn.stderr.log" stdout_path "#{@app_path}/log/unicorn.stdout.log"
起動
bundle exec unicorn_rails -c config/unicorn.rb -E development -D
もしこの地点でエラーが出るようであれば、logを見に行こう、場所はlog/unicorn.stderr.logにある
エラー対策
You have already activated rack 1.6.0, but your Gemfile requires rack 1.5.2. Prepending `bundle exec` to your command may solve this
最後のコマンドでbundle execを付け忘れることで発生するエラー
Unknown database '[db]_production'Run `$ bin/rake db:create db:migrate` to create your database (ActiveRecord::NoDatabaseError)
データベース作成を忘れている時に発生する。productionの作り忘れ時に発生する。
Can't connect to local MySQL server through socket '/tmp/mysql.sock'
mysql.sockがない時に発生します。
以下のコマンドを打ってsockの場所を探して設定を更新してください。
mysqladmin version -p
Nginx
インストール
sudo apt-get install nginx
設定ファイル
場所は/etc/nginx/nginx.confにあります。
upstream unicorn_server { server localhost:8080; } server { listen 80; client_max_body_size 4G; server_name _; keepalive_timeout 5; # Location of our static files root [rails appの場所]/public; try_files $uri @unicorn; location @unicorn { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://unicorn_server; } error_page 500 502 503 504 /500.html; location = /500.html { root [rails appの場所]/public; } }
nginx の再起動
sudo /etc/init.d/nginx restart
動作確認
いつものサンプルが映れば問題無いです。
その他
Unicornのシャットダウン
$ps -ef | grep unicorn | grep -v grep tereka 25234 1 1 16:54 ? 00:00:04 unicorn master -E production -c config/unicorn.rb -D tereka 25240 25234 0 16:55 ? 00:00:00 unicorn worker[0] -E production -c config/unicorn.rb -D tereka 25243 25234 0 16:55 ? 00:00:00 unicorn worker[1] -E production -c config/unicorn.rb -D $kill -QUIT 25234
Nginxの文法確認
sudo nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Ruby on rails4 のエラーメッセージを見やすくしよう
皆さんこんにちは
お元気ですか。私は元気です。
さて、Ruby on rails4での標準ではViewで以下のようなエラーが出ます。
意味はわかるがよくわからん。泣いていいと思う。(もちろんよく読めばわかります)
が、いちいちよく見ないとわからないのは面倒です。ぶっちゃけ色々と影響します。
やっぱりエラー処理はすくすくと処理しないとめんどくさい。
これを見やすくするためにgemでbetter_errorsをインストールします。
Gemfileに以下の文章を記載してください。
gem 'better_errors'
毎度恒例、bundle installを実行します。
bundle install
そして実際にエラーを確認してみましょう。
とても見やすくなっていますね。
簡単に導入できるので、ぜひ導入してみましょう。
Ruby on rails4でページング機能をつける(Kaminari)
皆さんこんにちは
お元気ですか。私は元気です。
さて、Webサイトを作成するにあたりこんなものを見たことはないでしょうか?
これをrailsで使ってみましょう。Railsではgemでkaminariをインストールすることで使うことができます。
こんなの
まず、Gemfileに以下の文章を追加してみましょう。
gem 'kaminari'
そして、bundle install
bundle install
Controllerに以下の文章を記載する。
page に◯ページ目、perにページに表示を行う数を記載する。
@NewBook = Book.page(params[:page]).per(20).order(:id)
erbに以下のような記載をする。
すると、ページャーが表示される
<%= paginate(@NewBook) %>
よければ、Webサイト作る時に是非使ってみてください
Ruby on Rails のサーバーにPOSTが送れない!?(Can't verify CSRF token authenticity)
皆さんこんにちは
お元気ですか。お腹すいた。じゃがいもつくろう。
Railsで作ったサーバーに対してPostを送信すると以下のような
エラーが出て困った。
Can't verify CSRF token authenticity Completed 422 Unprocessable Entity in 1ms ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
ところでCSRFとはなんでしょうか?Cross-Site Request Forgeriesの略で、POSTするところに誘導するような攻撃のようです。これを防ぐ為に実装されたとかなんとか。
解決方法
ApplicationControllerのprotect_from_forgery, :exceptionの箇所を、null_sessionとする。作った時のコメントに書いてあるとは…、
class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :null_session end
調べたところによるとRailsのバージョンによって挙動が違うので気をつけなければいけません。
Ruby on rails 4で簡単に管理画面をつくろう
皆さんこんにちは
お元気ですか。私は元気です。
さて、今回はRuby on railsでActiveAdminを使った簡単で格好良い管理画面を作る方法をご紹介します。
ActiveAdminを利用した管理画面の作り方
Railsのversionは4.0.5です。
まずは、以下のテキストをGemfileに追加
gem 'activeadmin', github: 'gregbell/active_admin' gem 'devise'
gem activeadminでインストール可能なもののバージョンが古いので、githubで指定して落とします。
その後bundle install,
rails g active_admin:install
rake db:migrate
rails s
上記のコマンドを実行すると、実行の準備が完了しました。
http://0.0.0.0:3000/adminに接続すると以下のような画面になります。
id:admin@example.com password:passwordを入力すると入れます。
loginすると…。
この地点でアクセスすることができます。しかし、モデルを監視対象に入れていないので何も表示することができません。
実際に監視対象に入れてみましょう。
rails g active_admin:resource book[model名]
一つデータを作ってから見てみると…
ちゃんと表示できてますね!こんな感じで簡単に管理画面を見ることができます。