げんきちの秘密基地

エンジニアリングが世の中の思いを実現してきた歴史に気づき、29歳未経験からWEBエンジニアとして転生!【Danger】綺麗事を割と本気で言ってきます【GitHub】https://github.com/0840kg【Twitter】https://twitter.com/0840kg

デプロイで最低限抑えるべきポイント3選

ぞす!げんきちです!\\\\٩( 'ω' )و ////

 

「いや、誰だよ」って方は、下記リンクを見てやってください。

  1. はじめまして!げんきちです! - げんきちの秘密基地

  2. 僕がエンジニアになりたい理由 - げんきちの秘密基地

目次〜

f:id:Genkichi:20190312000333j:plain

 

最近AWSを学習しています。

初学者の身としては、railsから急にインフラっぽくなって面食らってます。

そこでメンターさんと相談しながら要点を絞りました。

かなり備忘録的にですが、まとめました...🙇‍♂️

 

デプロイで最低限抑えるべきポイント3選

・ブラウザ→Webサーバ→アプリケーションサーバという流れを理解できる。

・ログの場所がわかり、エラーログなどを確認ができる。

・ソケットとかlistenがわかり、サーバ間の接続を確認できる。

 

きっかけ

Capistranoを設定して、自動デプロイしたら画面が壊れました。

原因は、assetsファイルの指定時にスペルミスしてました/(^o^)\

 

Railsの仕事

アセットパイプラインとは

JavaScriptCSSのアセットを最小化 (minify: スペースや改行を詰めるなど) または圧縮して連結するためのフレームワーク

spockets-rails gemによって実装され、デフォルトで有効になっている。

 

www.transnet.ne.jp

 

主要な機能

①アセットを連結すること

ブラウザがWebページをレンダリングするためのリクエスト数を減らせる。

SprocketsはすべてのJavaScriptファイルを1つのマスター.jsファイルに連結し、すべてのCSSファイルを1つのマスター.cssファイルに連結してくれる。

 

②アセットの最小化 (一種の圧縮)

例:ホワイトスペースとコメントを削除すること。

 

railsguides.jp

 

とりあえず、railsでは以下の仕事まで行う。

public/aseets配下にあるアセットファイルをプレコンパイルする。

 

ターミナル

rails assets:precompile

 

プレコンパイルとは

= pre(事前に)、コンパイル(変換)すること。

= 前もって読み込みやすい状態にしておくこと。

 

このプレコンパイルされた情報をWebサーバ(Nginx)が見られるように設定する。

 

Nginxの仕事

設定

/etc/nginx/conf.d/rails.conf

server {
  listen 80;
  server_name <Elastic IP>;

  root /var/www/<アプリケーション名>/current/public;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
    root   /var/www/<アプリケーション名>/current/public;
  }

省略

}

 

listen 80 ≒ 80番ポートにいったらNginxが待っているイメージ。

通信はデフォルトで80番ポートにいく。

:80は、省略可能。 

qiita.com

 

役割

クライアントから/var/www/<アプリケーション名>/public;の処理をリクエストされた場合は、自分でレスポンスを返す。

それ以外の場合、動的なコンテンツの生成をアプリケーションサーバ(Unicorn)に依頼する。

Unicornとの接続口(Unicornのソケットファイルが存在する場所)も指定する。

 

Unicornの仕事

設定

/etc/nginx/conf.d/rails.conf

upstream app_server {
  server unix:/var/www/<アプリケーション名>/shared/tmp/sockets/unicorn.sock;
}

 

Unicornにも、unix:/var/www/<アプリケーション名>/tmp/sockets/unicorn.sock;で待っていてくれるように(listen状態に)設定する。

 

config/unicorn.rb

app_path = File.expand_path('../../../', __FILE__)
working_directory "#{app_path}/current"
listen "#{app_path}/shared/tmp/sockets/unicorn.sock"

 

また、プロセスIDやエラーの記録場所も指定する。

pid "#{app_path}/shared/tmp/pids/unicorn.pid"
stderr_path "#{app_path}/shared/log/unicorn.stderr.log"
stdout_path "#{app_path}/shared/log/unicorn.stdout.log"

 

以下のコマンドでエラーが確認できます。

stderr = standard errorの略 = 標準エラー出力先。

less log/unicorn.stderr.log

 

ここまでで無事に以下の道が通りました!

①ブラウザ →

②Webサーバ(Nginx)→

アプリケーションサーバUnicorn

 

この後の流れです。

Unicorn

Rack→

アプリケーション(rails

 

Rackというミドルウェアが翻訳をすることで、アプリケーションサーバとアプリケーション本体がコミュニケーションを取ることができる。

railsの場合、Rackはデフォルトで備わっているため、設定は必要ない。

 

まとめ(?)

今回は②のNginxのroot指定が以下のようになっていたことが原因でした。

正)root /var/www/<アプリケーション名>/current/public;

誤】root /var/www/<アプリケーション名>/curent/public;

 

つまり、存在しないディレクトリを指定していたために、アセットファイルが適用されていなかったことを理解することができました。

 

<一日一新>

新校舎。机の下が広くて足を組みやすい。

 

<学習進捗>

学習開始からの期間 :91日
今日までの合計時間:896h
今日までに到達すべき目標時間:829h
目標との解離:67h
10,000時間」まで、

 

残り・・・9,104時間!」

 

以上です。

読んでくれた方々、ありがとうございました!((_ _ (´ω` )ペコ。

genkichi.hateblo.jp

genkichi.hateblo.jp

 

f:id:www08056561815:20190224095507g:plain

twitter.com