yujiroのプログラミング

勉強内容をアウトプットし、サボらないようにする為のブログ

<DAY98>unicoronを用いた本番環境構築

\ Follow me!! /

学習状況

●学習日数 98日

●学習時間(本日)9.5時間

●累計学習時間 431.0時間

●一日あたりの平均学習時間 4.39時間

unicoronの要点まとめ

unicoronって何??

アプリケーション本体を格納して、
動的処理を行うためのサーバー。

railsで使うまでの流れ

gem導入

```
group :production do
gem 'unicorn', '5.4.1'
end
```
bundle install

config/unicorn.rbファイルの設定

手動で上記ディレクトリに作成する。
これはunicornの動きを設定する内容
```
app_path = File.expand_path('../../', __FILE__)

worker_processes 1

working_directory app_path
pid "#{app_path}/tmp/pids/unicorn.pid"
listen "#{app_path}/tmp/sockets/unicorn.sock"
stderr_path "#{app_path}/log/unicorn.stderr.log"
stdout_path "#{app_path}/log/unicorn.stdout.log"

listen 3000
timeout 60

preload_app true
GC.respond_to?(:copy_on_write_friendly=) && GC.copy_on_write_friendly = true

check_client_connection false

run_once = true

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

if run_once
run_once = false # prevent from firing again
end

old_pid = "#{server.config[:pid]}.oldbin"
if File.exist?(old_pid) && server.pid != old_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 => e
logger.error e
end
end
end

after_fork do |_server, _worker|
defined?(ActiveRecord::Base) && ActiveRecord::Base.establish_connection
end

```

設定を済ませたコードをgithubにクローンする

以下のコマンドを入力して、ディレクトリを作成
ターミナル(サーバー)
```
~$ sudo mkdir /var/www/
~$ sudo chown ec2-user /var/www/
```

gituhubからコードのURLをコピーして

以下ディレクトリにクローンさせる
```
~$ cd /var/www/
www]$ git clone https://github.com/<レポジトリ名>.git
```

クローンしたディレクトリに移動し、

rbenvでインストールされたRubyが使われているかチェック

```
[ <レポジトリ名>]$ gem install bundler
[<レポジトリ名>]$ bundle install
```

環境変数に設定

データベースのパスワードなど、Githubにアップロードすることができない情報は、環境変数というものを利用して設定
これらの情報は、Railsからは ENV['<環境変数名>'] という変数からアクセスできる
環境変数は /etc/environment というファイルに保存

エディタを立ち上げて
```
sudo vim /etc/environment
```
書き込む内容はこれ
```
DATABASE_PASSWORD='MySQLのrootユーザーのパスワード'
SECRET_KEY_BASE='先程コピーしたsecret_key_base'
```

secret_key_baseを生成

ターミナル(サーバー)
```<レポジトリ名>]$ rake secret
```

環境変数設定後

一度ログアウトしてさらにログインしなおす

```
ssh -i [ダウンロードした鍵の名前].pem ec2-user@[作成したEC2インスタンスと紐付けたElastic IP]

```

環境変数確認のコマンド

```
env | grep SECRET_KEY_BASE
env | grep DATABASE_PASSWORD

```

ローカル環境に環境変数読み込みを定義

config/database.yml(ローカル)

```
production:
<<: *default database: ~~~(-------------) username: root password: <%= ENV['DATABASE_PASSWORD'] %>
socket: /var/lib/mysql/mysql.sock
```

本番環境に変更内容をPULLしてDATABASE作成

ターミナル(サーバー)
```
<レポジトリ名>]$ rails db:create RAILS_ENV=production
Created database '<データベース名>'<レポジトリ名>]$ rails db:migrate RAILS_ENV=production
...
```

アセットファイルをコンパイルする

本番環境では自動でしてくれないために手動で設定が必要

RAILS_SERVE_STATIC_FILES=1とつける事でアセットされたデーターを見つけてくれる
```
$ rails assets:precompile

$ RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production
```



railsの起動

```
unicorn_rails -c config/unicorn.rb -E productio

```

Nginxの導入と設定

補足(SSHキー鍵の登録)

githubの場合
EC2インスタンスSSH鍵ペアを作成.

```
ssh-keygen -t rsa -b 4096
```

以下のコマンドで生成されたSSH公開鍵を表示

```
cat ~/.ssh/id_rsa.pub
```
githubに登録

github.com

実際に登録できているかどうか確認
```
ssh -T git@github.com```