のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

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

動作確認

いつものサンプルが映れば問題無いです。
f:id:tereka:20150104023348p:plain

その他

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で以下のようなエラーが出ます。

f:id:tereka:20140911141946p:plain

意味はわかるがよくわからん。泣いていいと思う。(もちろんよく読めばわかります)
が、いちいちよく見ないとわからないのは面倒です。ぶっちゃけ色々と影響します。
やっぱりエラー処理はすくすくと処理しないとめんどくさい。

これを見やすくするためにgemでbetter_errorsをインストールします。
Gemfileに以下の文章を記載してください。

gem 'better_errors'

毎度恒例、bundle installを実行します。

bundle install

そして実際にエラーを確認してみましょう。

f:id:tereka:20140911143126p:plain

とても見やすくなっていますね。
簡単に導入できるので、ぜひ導入してみましょう。

Ruby on rails4でページング機能をつける(Kaminari)

皆さんこんにちは
お元気ですか。私は元気です。

さて、Webサイトを作成するにあたりこんなものを見たことはないでしょうか?
これをrailsで使ってみましょう。Railsではgemでkaminariをインストールすることで使うことができます。

こんなの

f:id:tereka:20140911105948p:plain

まず、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に接続すると以下のような画面になります。

f:id:tereka:20140902224119p:plain


id:admin@example.com password:passwordを入力すると入れます。

loginすると…。

f:id:tereka:20140902231804p:plain

この地点でアクセスすることができます。しかし、モデルを監視対象に入れていないので何も表示することができません。

実際に監視対象に入れてみましょう。

rails g active_admin:resource book[model名]

一つデータを作ってから見てみると…

f:id:tereka:20140902232113p:plain

ちゃんと表示できてますね!こんな感じで簡単に管理画面を見ることができます。