Challenge!

rails5.0+nginx1.11.8+puma3.6.2+CentOS6.7でrails環境構築

webアプリケーションを動かす上で 忘れちゃうんでメモ 間違ってたらごめんなさい

構成

ruby 2.3.1 rails 5.0.1 nginx capistrano puma conoha - centOS 6.7 64bit

目次

VPS

vpsは検討の末conohaのvpsを使用 ssh接続のための接続等は省略しておきます。 とりあえずrootでログイン

ログイン

ssh root@xxx.xxx.xx.xx (xxx.xxx.xx.xxはサーバのIPアドレス)

公開鍵を設定してない場合

簡単に設定が可能

$ brew install ssh-copy-id
# -i オプションを使うと、登録する公開鍵を選べる。
$ ssh-copy-id hoge_user@hogehoge.hoge.com

rbenvをinstall

rubyを管理するためにrbenvをインストール rbenvをinstallをしてPATHを通す installが遅すぎる!って方はこちら

qiita.com

$ $ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

環境設定の末行に追記

#~/.bash_profile

export PATH="~/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

再読込

source ~/.bash_profile

ruby_buildをインストール

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

SSL

$ sudo yum -y install openssl-devel

さぁインストール

$ yum install -y readline-devel
$ rbenv install 2.3.1
$ rbenv rehash
$ rbenv global 2.3.1

bundlerのインストール

$ gem install bundler

nginxをinstall及び設定

yum でインストールするため、yumリポジトリを登録

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

Mainlineをインストールしたいので、「/etc/yum.repos.d/nginx.repo 」を修正 stable の場合 nginx.repo は修正しなくて良いらしい。 参照:http://qiita.com/ymaru/items/4a56f1619c960981180f

# vim /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/6/$basearch/
gpgcheck=0
enabled=1

installする

sudo yum install nginx
#/etc/nginx/conf.d/hoge.conf

upstream #{app_name} {
  # uncomment the following line if multiple application servers are used.
  # this will force nginx to send requests from the same client to the same
  # application server.
  # ip_hash;
  server unix:/var/www/#{app_name}/shared/tmp/sockets/puma.sock fail_timeout=0;
}

server {
  listen 80 default deferred;
  server_name colors-link.com;
  root /var/www/#{app_name}/current/public;
  access_log /var/www/#{app_name}/current/log/nginx.access.log;
  error_log /var/www/#{app_name}/current/log/production.log;

  location ^~ /assets/ {
    # gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @#{app_name};
  location @#{app_name} {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://#{app_name};
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
}

起動する

sudo service nginx start

ちょいハマったところ

  • 設定を変更したらrestartする
  • server unix:
  • server_name
# nginxをrestartする
$ sudo service nginx restart

mysqlのinstall

インストール

$ yum -y install mysql-devel
$ yum -y install mysql-server

起動

$ /etc/rc.d/init.d/mysqld start

接続

$ mysql 

Capistranoでデプロイ

Capistrano設定

#Gemfile

group :development do
  gem 'capistrano'
  gem 'capistrano-rails'
  gem 'capistrano3-puma'
  gem 'capistrano-rbenv'
  gem 'capistrano-rbenv-vars'
  gem 'capistrano-bundler'
end
bundle install
bundle exec cap install
#Capfile

require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/rails'
require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'capistrano/puma'

# Load custom tasks from `lib/capistrano/tasks` if you have any defined
Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }

require "capistrano/scm/git"
install_plugin Capistrano::SCM::Git
#deploy.rb

# config valid only for current version of Capistrano
lock '3.7.1'

server "#{ip_address}", user: 'root', roles: %w{app db web}

set :application, '#{app_name}'
set :repo_url, 'git@bitbucket.org:shotay/#{app_name}.git'

set :pty, true
# rbenvの設定
set :rbenv_type, :user
set :rbenv_ruby, '2.3.1'
# set :rbenv_prefix, "RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}/bin/rbenv exec"
set :rbenv_map_bins, %w{rake gem bundle ruby rails}
set :rbenv_roles, :all

set :deploy_to, '/var/www/#{app_name}'
set :puma_rackup, -> { File.join(current_path, 'config.ru') }
set :puma_state, "#{shared_path}/tmp/pids/puma.state"
set :puma_pid, "#{shared_path}/tmp/pids/puma.pid"
set :puma_bind, "unix:#{shared_path}/tmp/sockets/puma.sock"
set :puma_conf, "#{shared_path}/puma.rb"
set :puma_access_log, "#{shared_path}/log/puma_error.log"
set :puma_error_log, "#{shared_path}/log/puma_access.log"
set :puma_role, :app
set :puma_env, fetch(:rack_env, fetch(:rails_env, 'production'))
set :puma_threads, [0, 16]
set :puma_workers, 0
set :puma_init_active_record, true
set :puma_preload_app, true


# Default branch is :master
# ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp

# Default deploy_to directory is /var/www/my_app_name


# Default value for :scm is :git
# set :scm, :git

# Default value for :format is :pretty
# set :format, :pretty

# Default value for :log_level is :debug
set :log_level, :warn

# Default value for :pty is false
# set :pty, true

# Default value for :linked_files is []
# set :linked_files, fetch(:linked_files, []).push('config/database.yml', 'config/secrets.yml')

# Default value for linked_dirs is []
set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system')

# Default value for default_env is {}
# set :default_env, { path: "/opt/ruby/bin:$PATH" }

# Default value for keep_releases is 5
set :keep_releases, 3

set :ssh_options, {
  keys: %w(~/.ssh/id_rsa),
  forward_agent: true,
  auth_methods: %w(publickey)
}

namespace :puma do
  desc 'Create Directories for Puma Pids and Socket'
  task :make_dirs do
    on roles(:app) do
      execute "mkdir /var/www/#{app_name}/shared/tmp/sockets -p"
      execute "mkdir /var/www/#{app_name}/shared/tmp/pids -p"
    end
  end
  before :start, :make_dirs
end

namespace :deploy do
  desc "Make sure local git is in sync with remote."
  task :check_revision do
    on roles(:app) do
      unless `git rev-parse HEAD` == `git rev-parse origin/master`
        puts "WARNING: HEAD is not the same as origin/master"
        puts "Run `git push` to sync changes."
        exit
      end
    end
  end

  desc 'Initial Deploy'
  task :initial do
    on roles(:app) do
      before 'deploy:restart', 'puma:start'
      invoke 'deploy'
    end
  end

  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      invoke 'puma:restart'
    end
  end

  before :starting,     :check_revision
  after  :finishing,    :compile_assets
  after  :finishing,    :cleanup
end


$ ssh-add ~/.ssh/id_rsa
$ bundle exec cap production deploy:initial

ちょいハマったところ

  • bundle installの部分でエラーが出る時下記二つ実行
yum install gcc-c++
yum install mysql-devel
  • 他の解説でよく使われていたset :scm, :gitを使用すると上手く動かなかったため、Capfileに下記を追加した
require "capistrano/scm/git"
install_plugin Capistrano::SCM::Git

ログの確認

$ tail -f /var/www/#{app_name}/shared/log/production.log

まとめ

VPSを借りての構築が初めてだったので結構ハマった。 yum installが面倒くさいときは下記実行

$ yum -y install git readline-devel gcc-c++ mysql-devel mysql-server openssl-devel

Faradayの使い方

FaradayというHTTPクライアントライブラリがとても良い
後で見返すためにメモ

Faradayの使い方

Gemfileはこんな感じ

  # httpリクエスト
  gem 'faraday'
  # リダイレクトを追う
  gem 'faraday_middleware'
  # クッキーを扱う
  gem 'faraday-cookie_jar'

ファイルのアップロードとかする時はmultipartを指定するのかな?
間違ってたらごめんなさい

    conn = Faraday.new(:url => 'https://www.hoge.com/') do |faraday|
      faraday.request :multipart
      faraday.request  :url_encoded
      faraday.adapter :net_http
    end

簡単にgetリクエストが出来る

    conn.get do |req|
      req.url '/foge'
    end

postしたい場合はPOSTを指定すれば簡単に出来る
下記はcookieを指定して、画像をアップロードする例

    conn.post do |req|
      req.url '/foge'
      req.headers['Cookie'] = cookie
      req.headers['Content-Type'] = 'image'
      req.body = {
        name: "hoge",
        image: Faraday::UploadIO.new('hoge.jpg', 'image/jpeg')
      }
    end

キーを付けないでPOST出来ました 下記はaudioを送信する例

    conn.post do |req|
      req.url '/foge'
      req.headers['Cookie'] = cookie
      req.headers['Content-Type'] = 'audio/l16; rate=16000;'
      req.body = File.binread("hoge.wav")
    end