UbuntuでRailsアプリケーションを動かすため環境設定

はじめに

サーバをレンタルし、Railsアプリケーションを動作させるまでの環境設定メモ。

1. さくらのVPSを申請

以下のプランでひとまず申請。ここからスタート。
プラン:さくらのVPS(v4) SSD 512 TK02

2. カスタムOSインストールでUbuntu 14.04をインストー

さくらのVPSHTML5コンソールで設定を進める。

help.sakura.ad.jp

作成したユーザでsshログイン。ここからはsshで設定を進めていく。

3. ひとまずapt-getを最新化

$ apt-get update
$ apt-get upgrade

4. 編集用にvimを入れよう

$ sudo apt-get install vim

5. zshにしよう

$ sudo apt-get install zsh

6. zsh設定ファイルを準備

〜〜後ほど〜〜

7. sshdの設定

--- snip ---
#Port 22
Port XXXXXX #(49152〜65535)
...
#PermitRootLogin yes
PermitRootLogin no
...
#X11Forwarding yes
#X11DisplayOffset 10
X11Forwarding no
$ sudo service ssh reload

8. ufwを使ってiptableを設定

Ubuntuufwというiptableラッパーを使ってファイヤーウォールを設定する

http://babie.hatenablog.com/entry/20110220/

9. 他にも入れる

$ sudo apt-get install git
$ sudo apt-get install tmux

9-1. git用に鍵を設定

$ mkdir .ssh
$ cd .ssh
$ ssh-keygen

10. rbenv, ruby-build,ruby のインストー

$ sudo apt-get install build-essential
$ sudo apt-get install libssl-dev
$ sudo apt-get install -y libreadline-dev

rbenv, ruby-buildをgitでインストールし rbenvのPATHを.zshenvに記述

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo '' >> ~/.zshenv
$ echo '# rbenv' >> ~/.zshenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshenv
$ echo 'eval "$(rbenv init -)"' >> ~/.zshenv
$ source ~/.zshenv
$ rbenv -v

$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

rbenvで好きなバージョンのrubyをインストー

$ rbenv install -l
$ rbenv install 2.3.0
$ rbenv global 2.3.0

11. mysqlをインストー

$ sudo apt-get install mysql-server
$ sudo apt-get install libmysqlclient-dev

ここまで来れば、あとはRailsアプリケーションを立てて動作させるのみ

Rails+Nginx+unicorn:サブディレクトリで複数のアプリを動作させる

はじめに

背景

この記事では、1台のサーバで複数のアプリを動作させるためのNginx、unicornの設定を記載します。

想定するシーンは「遊び用のレンタルサーバを借り、その中にいくつもRailsアプリを動作させたい」です。
アプリ1「http://123.456.789.000/app1」アプリ2「http://123.456.789.000/app2」のような形式で動作させます。

遊びが本格化してきたら、ドメインを当てて、SSLにしたいなー

記事公開時の環境は以下です。

RubyVersion                 2.3.0p0
RubyGems Version            2.5.2   
RailsVersion                5.0.2

NginxVersion                1.4.6 (Ubuntu)
UnicornVersion              5.3.0

構成のお勉強

Webサーバ:Nginx(他にもApacheなどが有名)
サーバ単位で動作させる。

アプリケーションサーバunicorn(他にもPassenger, Thin, Mongrelが有名)
Railsアプリケーション単位で動作させる。

アクセスをNginxが管理し、各アプリケーション等(unicorn)へ振り分けるイメージです。
Nginxとunicornの接続にはunixソケットを利用します。
インターネット == Nginx == [unicorn - Rails App]

事前準備

サーバ

事前にサーバの準備は完了している前提です。
サーバはさくらVPS Utuntu14.04を利用します。
プラン:さくらのVPS(v4) SSD 512 TK02

※TODO:そのうち記事に書く

前提

  • 任意のディレクト/rails1にあるRailsアプリケーションをサブディレクトhttp://123.456.789.000/app1で動作させる
  • rails1のパスは/home/user/rails1とする
  • Railsの動作環境はより手軽に動作させる想定でdevelopment

1. Nginxの設定

/etc/nginx

Nginxを設定していきます。Nginxのインストールが完了していれば、/etc/nginxに関連ファイルが作成されているはずです。

/etc/nginxにあるnginx.confがNginxの全体設定ファイル。
さらに、そこから詳細設定ファイルをconf.d/(もしくはsite-enable)をインクルードします。

各アプリのconf.d[myapp].confを作成し、設定を記述。
unicornとの接続にはunixソケットを利用するため、ソケット部分はnginxとunicornの設定ファイルで揃えること。

# unixソケットを定義。任意だが、`/tmp/[環境]_unicorn.sock`などが一般的。
# ソケットの部分はNginxとunicornの設定ファイルで揃えること。
upstream unicorn {
  server unix:/home/vex13/project/p_v3/tmp/development_unicorn.sock fail_timeout=0;
}

server {
  listen 80;
  server_name [サーバのIP/ドメイン];

  # サブディレクトリ形式の設定
  location /app1[サブディレクトリ] {
    alias /home/user/rails1[サブディレクトリのパス];
    # 下記のlocationを利用
    try_files $uri/index.html $uri.html $uri @unicorn;
    
  }

  location @unicorn {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://unicorn;
  }
}

# 複数のアプリケーションを立てるなら、同様にしてupstream, serverを記述する
# もしくは上記server内にupstream, locationを追加する
server {
}

2. Nginxの起動

$ sudo nginx -t #nginxの設定ファイル構文テスト
$ sudo service nginx start

3. unicornの設定

/home/user/rails1/confing/development_unicorn.rb

unicorn用の設定ファイルを作成します。

rails_root = '/home/user/rails1' # Railsのルートパス
rails_env = ENV['RAILS_ENV'] || "development"

worker_processes 2
working_directory rails_root

# ここが重要!Nginxで設定したunixソケットのパスと同一のものにすること。
# Unicorn Socket
# listen  '/tmp/unicorn.sock'
listen "#{rails_root}/tmp/#{rails_env}_unicorn.sock"

# Unicorn PID file location
# pid '/path/to/pids/unicorn.pid'
pid "#{rails_root}/tmp/pids/#{rails_env}_unicorn.pid"

# Path to logs
# stderr_path '/path/to/log/unicorn.log'
# stdout_path '/path/to/log/unicorn.log'
stderr_path "#{rails_root}/log/#{rails_env}_unicorn_error.log"
stdout_path "#{rails_root}/log/#{rails_env}_unicorn.log"

# Time-out
timeout 300

4. config.ruを設定

/home/user/rails1/config.ru

Railsアプリケーション内でのルートパス等をサブディレクトリで動作できるように設定する。
※当該ファイルを削除してもunicornがよしなに計らってくれて動作することもある。
※私はこのファイルの存在にハマって何時間か失った。。

# This file is used by Rack-based servers to start the application.
RAILS_RELATIVE_URL_ROOT="/app1[サブディレクトリ]"
require ::File.expand_path('../config/environment',  __FILE__)
if RAILS_RELATIVE_URL_ROOT then
        map RAILS_RELATIVE_URL_ROOT do
                run Rails.application
        end
else
        run Rails.application
end

5. unicornの起動

別途、起動、停止、再起動のスクリプトを書くべし。※TODO:そのうち記事に書く

$ bundle exec unicorn_rails -c config/development_unicorn.rb -D -E development --path /app1

まとめ

これで、http://123.456.789.000/app1Railsアプリケーションが動作するでしょう。
※さらっと書いてますが、13が幾度となく失敗、絶望を繰り返した結果の備忘です。

参考

qiita.com

Railsのformで:remote => trueしてAjaxする(簡単、今風な非同期投稿)

Railsのformで、シンプルに画面遷移なくAjaxで登録・表示を行う方法。
さらにparticalを使ってすっきり。
他に正しいやり方があったらおしえて。

xxx.html.erb

重要なのは、form_tagに「:remote => ture」を追加すること。
RailsさんありがとうこれだけでAjax通信にしてくれる。

<%= form_tag ({:controller => "コントローラー名",:action => 'yyy(Ajax通信をキャッチするアクション名)'}), :remote => true, :id => 'new_entry' do %>
<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
<%= submit_tag '登録', :class => 'button on-right' %>

yyy - コントローラーでのキャッチ

コントローラーでAjax通信をキャッチするアクションを作成。
ここでメンバにした@eはあとでjs.erbやparticalテンプレートの中で使える!
さらに、renderを呼ぶことで、yyy.js.erbがレスポンスとして帰ってくるという、すばらしい仕様

def yyy
  @e = Entry.new(params[:entry]) # Entryモデルとして

  if @e.save
    render
  else
    render json: 'render error'
  end
end

yyy.js.erb

レスポンスを用いてhtml上の要素に登録内容を表示する。
なんとpartialだって使えちゃう
<%=j render 'yyy' %>によりparticalとして準備する_yyy.html.erbが使えるようになる
<%=j %>はエスケープ

$('#entry_list').prepend($("<%=j render 'yyy' %>").hide().fadeIn('slow'));

_yyy.html.erb - 要素レンダリング用partial

レンダリング用のpartialで、メンバ変数にした@eを用いて登録要素をレンダリング。すばらしい

<h1><%= @e.id %></h1>

規約は多いけど、理解するとかなり便利?

Rails4とMySQLでのプロジェクト作成

これからはきちんと覚書を残そう.

プロジェクトディレクトリを作成し,bundle init ,さらにbundle install

$ mkdir dk_port
$ cd dk_port
$ bundle init

bundle initで作成されたGemfileでrailsを有効にする

$ emacs Gemfile
source "https://rubygems.org"
 
gem 'rails'

bundleで入れるものは vender/bundle に配置する.railsコマンドについても,bundle exec ~~として利用する.

gem をインストールするパスを指定して,bundle installする.

$ bundle install --path vendor/bundle

rails new で プロジェクトを新規作成

ここで,プロジェクトを新規作成.データベースにはMySQLを指定する.

  • -d: データベースの種類を指定
  • -T: test::unitを含まない
  • –skip-bundle: bundle install
  • edge: github リポジトリ上の最新のコードから作成
$ bundle exec rails new . -d mysql -T --skip-bundle --edge

bundle install すると必要なGemが入る

$ emacs Gemfile
source 'https://rubygems.org'

gem 'rails',     github: 'rails/rails'
gem 'arel',      github: 'rails/arel'

# Use mysql as the database for Active Record
gem 'mysql2'

# Use edge version of sprockets-rails
gem 'sprockets-rails', github: 'rails/sprockets-rails'

# Use SCSS for stylesheets
gem 'sass-rails', github: 'rails/sass-rails'

# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'

# Use CoffeeScript for .js.coffee assets and views
gem 'coffee-rails', github: 'rails/coffee-rails'

# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby

# Use jquery as the JavaScript library
gem 'jquery-rails'

# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks'

# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 1.2'

group :doc do
  # bundle exec rake doc:rails generates the API under doc/api.
  gem 'sdoc', require: false
end

# Use ActiveModel has_secure_password
# gem 'bcrypt-ruby', '~> 3.1.2'

# Use unicorn as the app server
# gem 'unicorn'

# Use Capistrano for deployment
# gem 'capistrano', group: :development

# Use debugger
# gem 'debugger', group: [:development, :test]

Gitリポジトリを初期化

この辺りでgitを設定する.

$ git init
$ git add .
$ git commit -m "first commit"

プロジェクト用のMySQLユーザーを作成する

MySQLにログインしてユーザーを作成する.

$ mysql -u root -p
# パスワード入力

ユーザー作成.

mysql> GRANT ALL PRIVILEGES ON *.* TO ユーザー名@localhost IDENTIFIED BY 'パスワード';

ユーザーができているか確認

mysql> select host,user from mysql.user;

config/database.ymlで設定を編集

$ emacs config/database.yml
# MySQL.  Versions 4.1 and 5.0 are recommended.
#
# Install the MYSQL driver
#   gem install mysql2
#
# Ensure the MySQL gem is defined in your Gemfile
#   gem 'mysql2'
#
# And be sure to use new-style password hashing:
#   http://dev.mysql.com/doc/refman/5.0/en/old-client.html
development:
  adapter: mysql2
  encoding: utf8
  database: railsapp_development
  pool: 5
  username: DBユーザー名 #ここと
  password: DBパスワード #ここだけ
  socket: /tmp/mysql.sock
  host: localhost
  charset: utf8
  collation: utf8_general_ci
 
# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  adapter: mysql2
  encoding: utf8
  database: railsapp_test
  pool: 5
  username: DBユーザー名
  password: DBパスワード
  socket: /tmp/mysql.sock
  host: localhost
  charset: utf8
  collation: utf8_general_ci
 
production:
  adapter: mysql2
  encoding: utf8
  database: railsapp_production
  pool: 5
  username: DBユーザー名
  password: DBパスワード
  socket: /tmp/mysql.sock
  host: localhost
  charset: utf8
  collation: utf8_general_ci

rails g を用いてControllerを作成し,確認

$ bundle exec rails g controller Hello index
$ bundle exec rails s

http://localhost:3000/hello/index

削除するには

$ bundle exec rails destroy controller Hello index