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が遅すぎる!って方はこちら
$ $ 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
$ 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及び設定
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
rubyで時刻を扱う
後で見返すようのメモ
時刻を扱う
t = Time.now
t.year
t.month
t.day
t.hour
t.min
t.sec
t.usec
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