【rails環境構築】nginx + unicornをvagrantでいってやる

f:id:utr066:20170521233955p:plain

railsの環境構築でかなり手間どったのでメモ。

CentOSをインストール

好きなディレクトリで以下を実行

vagrant box add 好きな名前 https://github.com/CommanderK5/packer-centos-template/releases/download/0.6.7/vagrant-centos-6.7.box

vagrant の設定フォルダを作成

vagrant init 好きな名前

vagrantfileを編集。

20行目config.vm.box_check_update = false
35行目config.vm.network "private_network", ip: "192.168.33.10"
52行目config.vm.provider "virtualbox" do |vb|
57行目vb.memory = "1024"
58行目end

同期フォルダを指定

config.vm.synced_folder ".", "/vagrant"

※注意ポイント /vagrantはvagrant ssh後の/home/vagrantではない。 vagrant ssh後のcd /vagrantを指しています。

vagrant up
vagrant ssh

mysqlをインストール

# デジタル署名をインポートする
$ sudo rpm --import http://dev.mysql.com/doc/refman/5.7/en/checking-gpg-signature.html

# yumリポジトリの設定をインストールする
$ sudo rpm -ihv http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm

# yumリポジトリをlistする
$ yum --disablerepo=\* --enablerepo='mysql57-community*' list available

# MySQL Server 5.7をインストールする
$ sudo yum --enablerepo='mysql57-community*' install -y mysql-community-server

Mysql起動
$ sudo service mysqld start

mysqlに入る

初期のパスワードがあるので、確認。

sudo cat /var/log/mysqld.log | grep "temporary password"

上記のパスワードで入ったらパスワードを再設定。

set password for root@localhost=password('*******');

ただ単にこれでもいけるっぽい。

$ sudo yum install mysql-server
Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

こんなエラーが出たら以下のコマンドを打ってみて。

sudo /etc/init.d/mysqld restart

参考: qiita.com

rubyインストール

rbenvインストール

sudo yum install gcc make openssl-devel libffi-devel readline-devel git
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
exec $SHELL -l

ruby-buildインストール

git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv install --list(インストールリスト確認)

rubyインストール

rbenv install 好きなバージョン
BUILD FAILED (CentOS release 6.7 (Final) using ruby-build 20170405-4-g365d)

上記のようなエラーが出てきたら以下を実行。

sudo rpm -Uvh http://www.city-fan.org/ftp/contrib/yum-repo/city-fan.org-release-1-13.rhel6.noarch.rpm
sudo vi /etc/yum.repos.d/city-fan.org.repo
  enabled=1を以下のように編集。
  enabled=0
sudo yum update --enablerepo=city-fan.org libcurl

再度rbenv install (好きなバージョン)を行う。

rbenv install 好きなバージョン

それでもまだ以下のようなエラーが出る場合。

BUILD FAILED (CentOS release 6.7 (Final) using ruby-build 20170405-6-gc7a4f34)

以下を実行

sudo yum install -y openssl-devel readline-devel zlib-devel`
再度rbenv install 好きなバージョン
rbenv global(or local)  好きなバージョン

rails5インストール

gem install bundler #bundlerのインストール
gem install rails
rbenv rehash

railsプロジェクト作成

vagrantで共有したいのでvagrantfileで指定した共有ディレクトリに作成。

cd /vagrant
rails new testtest -d mysql(今回はmysqlを使う)

以下の様なエラーが出た場合

An error occurred while installing mysql2 (0.4.6), and Bundler cannot
continue.
Make sure that gem install mysql2 -v '0.4.6' succeeds before bundling.

以下を実行

sudo yum install mysql-devel

インストールしたら、railsプロジェクトに移動し、bundle install。

cd testtest
bundle

データベース作成

mysqlパスワード確認

grep -e 'A temporary password is generated for root@localhost' /var/log/mysqld.log

ログイン後パスワード変更

set password for root@localhost=password('*******');

database.ymlを編集

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: ********

データベース作成

rake db:create

それでも以下のエラーが出たら、vagrant reload してみましょう。

Mysql2::Error: Access denied for user 'root'@'localhost'

unicornインストール

以下のコメントアウトを外す。
# gem 'therubyracer', platforms: :ruby
これをしないとuglifierというgemがなんたらかんたらというエラーが出るはず。

unicornを追加
gem 'unicorn'
bundle

unicorn.rbを作成

config/unicorn.rbを作成しよう。 中身は以下のように。

@app_path = '/vagrant/testtest'
# 自分の作ったrailsプロジェクトがあるパスを指定。

worker_processes 2
working_directory "#{@app_path}/"

# This loads the application in the master process before forking
# worker processes
# Read more about it here:
# http://unicorn.bogomips.org/Unicorn/Configurator.html
preload_app true

timeout 30

# This is where we specify the socket.
# We will point the upstream Nginx module to this socket later on
listen "/tmp/unicorn.sock", :backlog => 64

pid "/tmp/unicorn.pid"

# Set the path of the log files inside the log folder of the testapp
stderr_path "#{@app_path}/log/unicorn.stderr.log"
stdout_path "#{@app_path}/log/unicorn.stdout.log"

before_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!

  old_pid = "#{server.config[:pid]}.oldbin"
    if old_pid != server.pid
      begin
        sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
        Process.kill(sig, File.read(old_pid).to_i)
      rescue Errno::ENOENT, Errno::ESRCH
      end
    end

    sleep 1
  end

after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end



参考URL

qiita.com

以下コマンドでunicorn起動。

bundle exec unicorn_rails -c config/unicorn.rb

unicornのコマンド色々あってよくわからん。上記だと起動したままになるっぽい。

unicorn -c /vagrant/rails_test/config/unicorn.rb -E development -D

何も出てこなかったら多分起動しています。 以下のコマンドでユニコーンが起動している確認できる。プロセスが出てきたら大丈夫だね。 出てこなかったらunicornのログを確認しよう。railsプロジェクト/log/unicorn.stderr.logがあるからそれ確認。

ps -ef | grep unicorn | grep -v grep

unicorn 起動エラー

bundler: failed to load command: unicorn_rails (/home/vagrant/.rbenv/versions/2.3.3/bin/unicorn_rails)

これはおそらく実行しているディレクトリが違う。プロジェクトのディレクトリで行おう。

bundler: failed to load command: unicorn_rails (/home/vagrant/.rbenv/versions/2.3.3/bin/unicorn_rails)
Bundler::GemRequireError: There was an error while trying to load the gem 'uglifier'.
Gem Load Error is: Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes.

下記のgemのコメントアウトを外しbundle installを行おう。 gem 'therubyracer', platforms: :ruby

エラー文は忘れたけど、sockが読み込めないよみたいなエラー

unixドメインソケットはVagrantの共有ディレクトリには置けないから、別の場所に指定しよう。 unicorn.rbの以下の部分だね。

listen "/tmp/unicorn.sock"

上記のようにやってたら大丈夫だと思うけど、他の場所を指定していたら場所を変えてみよう。

nginxインストール

sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
sudo yum install nginx
sudo service nginx start

nginxの設定ファイルを作成する

/etc/nginx/conf.d/railsプロジェクト名.confを新規作成 しよう。

upstream rails-unicorn {
    # nginxのソケット保存先指定
    server unix:/tmp/unicorn.sock;(uniconrnの設定ファイルと合わせる)
}

server {
    # port
    listen       80;
    # サーバーのIPアドレス
    server_name  192.168.33.10(vagrantfileにあるip);

    # DocumentRoot
    root   /vagrant/testtest/public(自身のプロジェクトパスを指定);
    try_files $uri $uri.html $uri/index.html @rails-unicorn;

    # charset
    charset utf8;
    # logs
    access_log  /var/log/nginx/access.log  main;
    error_log  /var/log/nginx/error.log  error;

    location @rails-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://rails-unicorn;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

/etc/nginx/nginx.confのuserをnginxに変更する。

sudu vi /etc/nginx/nginx.conf
user nginxをuser vagrantに変更

ipブラウザに打ってアクセス。f:id:utr066:20170521232818p:plain

何かエラーが起きたら

ログを確認しよう。

nginxのログ確認。
sudo cat /var/log/nginx/error.log

unicornのログ確認。
プロジェクト/log/unicorn.stderr.log
みたいなのがあるはずだから見てみよう。

mysql can't connect みたいなエラーが出た場合。たぶんsocketファイルがない。 mysqlを再起動すると、/var/lib/mysql/mysql.sockが自動的に作成されるので以下を実行。

sudo /etc/init.d/mysqld restart

まとめ

環境構築むずいなおい。