1
/
5

研修4-2-1 -ウェブサーバの構築 Ruby 前編-

前回はPHPでウェブサーバを構築しました。

今回はRubyを使います。

目指すウェブアプリケーションの機能は前回と同様です。

まずはRubyの環境構築に手間取りました。

環境は以下の通りです。

ウェブサーバ:Nginx

アプリケーションサーバ:Unicorn

フレームワーク:Ruby on Rails

NginxとUnicornの連携に大変手間取りました。

ですのでRuby回は前後編構成です。

前編ではUnicorn, Nginxの連携を。

後編ではRailsとMySQLの連携を紹介します。

それではまずはrubyとrailsをインストールします。

# yum install ruby
# gem install rails

早速新しいアプリを作ります。

アプリを作成するディレクトリに移動して、

# rails new fox -d mysql

今回のアプリはfoxという名前にしました。

これまでファイルやディレクトリを作るたびにtestとかphp_testとか名前をつけていたら区別がつかなくなってきました。これからはユニークな名前をつけることで結びつけて記憶できることを期待します。

実はこの時点でRailsに付属しているWEBrickをサーバとして起動することもできます。

# cd fox
# rails server -b 0.0.0.0

これで、ブラウザからアクセスすることができます。簡単ですね。

今回はNginxをウェブサーバとして使うと決めたので封印します。

ともあれ、foxというディレクトリができました。

ディレクトリ内に移動して、Gemfileを編集してUnicornをインストールします。

# cd fox
# vi Gemfile
Gemfile
gem "unicorn" #これを追記するだけです。
# bundle install

これでものは揃いました。しかし、現段階ではUnicornとNginxが結びついていません。

お互いにお互いを認識させるため設定を編集する必要があります。

まずはUnicornの設定から行います。

こちらを参考にしました。

その前に、ソケットを置くディレクトリを作りましょう。

# mkdir /var/run/unicorn
# chmod 777 /var/run/unicorn

では設定ファイルを編集します。

# vi config/unicorn.rb
unicorn.rb
# -*- coding: utf-8 -*-
# ワーカーの数
worker_processes 2
# ソケット
listen "/var/run/unicorn/unicorn.socket"
pid '/tmp/unicorn.pid'
# ログ
log = '/"アプリのディレクトリ"/log/unicorn.log'
stderr_path '/"アプリのディレクトリ"/log/error.log'
stdout_path '/"アプリのディレクトリ"/log/unicorn.log'
preload_app true
GC.respond_to?(:copy_on_write_friendly=) and GC.copy_on_write_friendly = true
before_fork do |server, worker|
defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
old_pid = "#{ server.config[:pid] }.oldbin"
unless old_pid == server.pid
begin
sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
Process.kill :QUIT, File.read(old_pid).to_i
rescue Errno::ENOENT, Errno::ESRCH
end
end
end
after_fork do |server, worker|
defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end

注意すべきは、ソケットの場所をアプリ内のtmpディレクトリにするとエラーが出ることです。

では今指定したソケットをNginxの方にも教えます。

/etc/nginx/conf.d/に専用の設定ファイルを作ります。defaultの物と切り替えて使います。

defaultの物は名前を変えて無効化します。

# cd /etc/nginx/conf.d/
# mv default.conf default.conf.org
# vi fox.conf
fox.conf
upstream unicorn {
server unix:/var/run/unicorn/unicorn.socket;
}
server {
listen 80;
server_name 192.168.0.160;
root "アプリのディレクトリ";
access_log "アクセスログのディレクトリ";
error_log "エラーログのディレクトリ";
client_max_body_size 100m;
error_page 404 /404.html;
error_page 500 502 503 504 /500.html;
try_files $uri/index.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;
}

一度Nginxを再起動してから、Unicornを起動します。アプリのディレクトリに移動することも忘れないように気をつけます。

# systemctl restart nginx
# cd "アプリのディレクトリ"
# bundle exec unicorn -E production -c config/unicorn.rb -D

ブラウザからアクセスしてページが表示されれば成功です。

今回遭遇したエラーの内で詰まったところは以下の3つです。

ソケットが繋がっていないというエラー。

I, [2016-05-30T19:32:57.812294 #22866] INFO -- : unlinking existing socket=/var/run/unicorn/unicorn.socket

一度該当のソケットファイルを削除すると解決します。

シークレットキーを設定しろというエラー。

E, [2016-06-01T13:03:43.708159 #15623] ERROR -- : app error: Missing `secret_token` and `secret_key_base` for 'production' environment, set these values in `config/secrets.yml` (RuntimeError)

見に行ってみると環境変数でキーが設定されていました。

取り急ぎ、上のdevelopmentやtestを参考にキーを設定します。

config/secrets.yml
production:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

最後に、すでにUnicornを起動しているのに重ねて起動してしまった時のエラーです。

psコマンドで起動中のUnicornのプロセスIDを確認し、killコマンドで終了してから改めてUnicornを起動しましょう

# ps aux | grep unicorn
# kill "Unicornのpid"
# bundle exec unicorn -E production -c config/unicorn.rb -D

NginxとUnicornの連携に関しては以上です。

次回はRailsと既存のデータベース(PHPで参照したもの)の連携に関して紹介します。

株式会社アクシス's job postings
2 Likes
2 Likes

Weekly ranking

Show other rankings
Like Ryota Yamada's Story
Let Ryota Yamada's company know you're interested in their content