あめのて

活字を垂れ流す

ConoHa で Ruby on Rails をとりあえず動かすまでにやったこと【CentOS7+Nginx+Unicorn】

スポンサーリンク

やっとRailsがサーバーで動いた……。
ここまで長かったなあ。

今回学んだことは、最初から細かいセッティングとか複雑な機能をいっぺんに付けようとしないで、まずは最低限で確実に動かしてみるべきだということですね。
1回動いてしまったら、細かい設定書き込んでも、動かなくなった時の原因がわかるから失敗しないんですよね。
まあ、当たり前で基本的なことなんでしょうけど、変な自信があったので最初から欲しい機能全部付けようとしてやってました。

とりあえず、そこそこに省略しながらまとめます。

セキュリティ関連

まずはサーバーをCentOSでssh鍵を指定して作ったらrootでログインします。

.sshフォルダを、自動で作成されるようにしておきましょう。

$ cp -r /root/.ssh/ /etc/skel/

新規ユーザーを作成してsudo権限を付与

$ adduser username
$ passwd username
$ usermod -G wheel username

/etc/ssh/sshd_configを編集してPort変更と PermitRootLogin を no にする書き換えをします。

こんな感じでコピーしてきてポートの書き換えを行います。

$ sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-alt.xml
$ sudo vim /etc/firewalld/services/ssh-alt.xml

こうやるとsshを消してssh-altを追加できる。

$ sudo firewall-cmd --reload
$ sudo firewall-cmd --add-service=ssh-alt
$ sudo firewall-cmd --permanent --add-service=ssh-alt
$ sudo firewall-cmd --remove-service=ssh
$ sudo firewall-cmd --permanent --remove-service=ssh
$ sudo systemctl restart sshd
$ sudo firewall-cmd --reload

同様にhttpとhttpsを追加したり、必要ポートの追加をしておきましょう。

Railsインストール

Rails使うのに必要なパッケージはこのぐらい

$ sudo yum install git make gcc-c++ patch libyaml-devel libffi-devel libicu-devel zlib-devel readline-devel sqlite sqlite-devel wget nodejs openssl-devel

どのディレクトリがいいのかイマイチわかんないけどとりあえずrbenvをクローン

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

PATHも追加しておこう。

rbenv installができないので以下を

$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ rbenv install -l
$ rbenv install 0.0.0
$ rbenv rehash
$ rbenv global 0.0.0
$ gem install bundler

これでいいはず

次はmariaDB

今からmysql使うならもうmariaDBにしておいて間違いない。

$ sudo yum -y install mariadb mariadb-server
$ sudo systemctl start mariadb.service
$ sudo systemctl enable mariadb.service
$ sudo vim /etc/my.cnf.d/server.cnf
[mysqld]
character-set-server = utf8

DBの設定は省略

Nginx

普通にインストール

$ sudo yum install nginx

/etc/nginx/conf.d/ にappname.confとかいう名前でファイルを作成

upstream appname {
  server unix:/var/www/appname/tmp/sockets/appname.sock;
}

server {
  listen 80;
  server_name stg.appname.net;

  root /var/www/appname/public;
  
  client_max_body_size 1000m;
  try_files $uri/index.html $uri @app;  

  location @app {
    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://appname;
  }
}

現在はこんな感じにしてある。
注意点としてはsockの場所が /tmp/ だとダメみたい。
といあえず今はこれで動いてる。

この状態で

$ sudo systemctl start nginx

ってやると起動して、ブラウザからWelcome to nginx on Fedora!ってページが見れるはず。

Unicorn

ん〜と、とりあえずgit clone してこよう。

Gemfileにgem 'unicorn'って書いて、サーバー側でsudo yum install unicorn-railsってした気がする。

config/unicorn.rb を作成して

# -*- coding: utf-8 -*-
APP_PATH = "/var/www/appname"

worker_processes 2
working_directory APP_PATH

listen APP_PATH + '/tmp/sockets/appname.sock'
pid APP_PATH + '/tmp/pids/appname.pid'

stderr_path APP_PATH + "/log/unicorn.stderr.log"
stdout_path APP_PATH + "/log/unicorn.stdout.log"

preload_app true

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

こんな感じにして、今動いてる。

それから起動スクリプトを書いたんだけど、これがよくわからない。
/etc/init.d/appnameを作成。
権限は755とかにしておく。

#!/bin/bash

. /etc/rc.d/init.d/functions


PROG_NAME=appname
USER=username
APP_ROOT=/var/www/appname
PID_FILE=$APP_ROOT/tmp/pids/appname.pid
RAILS_ENV=production
#RAILS_ENV=development
CONFIG_FILE=$APP_ROOT/config/unicorn.rb
CMD="/home/username/.rbenv/shims/bundle exec /home/username/.rbenv/shims/unicorn_rails"
ARGS="-c $CONFIG_FILE -D -E $RAILS_ENV"

export PATH=/usr/local/bin:$PATH

cd $APP_ROOT || exit 1

case $1 in
  start)
    daemon --user=$USER --pidfile=$PID_FILE $CMD $ARGS
    ;;
  stop)
    kill -QUIT `cat $PID_FILE`
    ;;
  *)
  echo >&2 "Usage: $0 <start|stop|restart>"
  exit 1
  ;;
esac

こんな感じにしてある。
でもこれ本当によくわからないし、stopできなかったりもするから手動でやったりしてる。

kill -QUIT `cat /var/www/appname/tmp/pids/appname.pid`

まあいいや。動くし。
ちなみに起動はこう

$ systemctl start appname

これで一応railsが動いている。
全然わかんないけど。

まとめ

なんとかはなっている。
まだDB使ってないから不安だけど。

最初はcapistranoを使ったデプロイまで全部まとめて設定しようと思ってたんだけど諦めました。
もうこのまま開発を初めて、capistranoはもうちょっと慣れてからやります。

やっと開発に入れる……。


追伸

secret_key_base とかもやらなきゃいけなかったわ

広告を非表示にする