Railsでproductionモードで起動するときの作業

やるべきことまとめ

  • productionモード用の設定
  • productionモード用DBのセットアップ
  • アセットのプリコンパイル
  • SECRET_KEY_BASEの設定
  • 環境変数を指定してサービス起動

productionモード用の設定

最低限、DB接続先(config/database.yml)と、migrateは必要。

 production:
  <<: *default
  adapter: mysql2
  encoding: utf8
  reconnect: false
  pool: 5
  host: <DBのIPアドレス、ホスト名など> #AWSなら、内部ネットワークのIPアドレスで指定するとレスポンス面もトラフィック面も効率が良い。
  database: <データベース名>
  username: <%= ENV['RAILS_DATABASE_USER'] %> #環境変数に外出しが良い。
  password: <%= ENV['RAILS_DATABASE_PASSWORD'] %> #環境変数に外出しが良い。 

productionモード用DBのセットアップ

rake db:migrate RAILS_ENV=production

アセットコンパイル

rake assets:precompile  RAILS_ENV=production

SECRET_KEY_BASEの設定

config/secrets.ymlがこうなっていることを、念のため確認する。
developmentモード、testモードはsecrets.ymlに直書きしているが、productionモードはプロジェクトから外出しする前提になっている。
Gitなどソース共有時にproductionモード用の値を共有・公開してしまわないようにという理由らしい。

production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

環境変数を指定してサービス起動

#環境変数にSECRET_KEY_BASE、RAILS_ENVを設定して、サービス開始
#config/puma.rbでデーモン化ONを入れたり外したりすれば、デーモン化なのかコンソールでログをモニタリングしたりを切り替えられる。
export SECRET_KEY_BASE=`rake secret`;export RAILS_ENV=production;pumactl start

環境変数を指定してサービス起動するように自動起動スクリプトに反映する。/etc/init.d/puma

 #変更前
  sh -c "$PUMA_BIN start"
 #変更後
  sh -c "export SECRET_KEY_BASE=`rake secret`;export RAILS_ENV=production; $PUMA_BIN start"

Pumaを使ってデーモン化&自動起動設定したRailsをNginXと連携する。

pumaデーモン化の自動起動は必須。

rails側をまず自動起動させておく必要がある。この記事にまとめてある。
hamakichitaro.hatenablog.com

pumaにソケットを定義しておく。config/puma.rb

bind "unix:///<プロジェクトルートをフルパス指定>/tmp/sockets/puma.sock"

nginxをインストール

sudo apt-get update
sudo apt-get install nginx

nginxに、ソケット経由で連携するよう設定する。/etc/nginx/conf.d/puma.conf

upstream <アプリ名> {
    # Path to Puma SOCK file, as defined previously
    server unix://<プロジェクトルートをフルパス指定>/tmp/sockets/puma.sock       fail_timeout=0;
    # 例  unix:///home/username/web-app/tmp/sockets/puma.sock
  }

server {
    listen 80;
    server_name <IPアドレスまたはホスト名で指定>;   #nginxでリクエストを受け付ける窓口

    root <プロジェクトルートをフルパス指定>/public;


    location / {
        proxy_pass http://localhost:3000;         #railsサービスを指定。例は、nginxと同じサーバーのポート3000でrailsがサービスしている。
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }

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

nginxを再起動

sudo service nginx restart

参考サイト

qiita.com

Ubuntu上のRailsアプリをpumaでデーモン化と自動起動設定する。

pumaのデーモン化

まずは、シンプルにpumaをデーモン化してみよう。
puma -p 3000 -e production -C config/puma.rb -d 

もしくは

pumactl start 

pumactlは、config/puma.rbに設定をすべて記述してシンプルな実行をするタイプのコマンド。実行時にパラメータを指定する方式では、パラメータ管理をしにくいし、実行時のパラメータ指定ミスなど起こりやすいから。

デーモン化されてサービスが動作していることの確認
lsof -i 

ポート3000でrubyの待ち受けが動いていることがわかる。
PIDもここでわかる。PIDはconfig/puma.rbでpid管理ファイルを指定しておけば、pid管理ファイルを参照するのが良い。

サービスを終了する。
kill -QUIT XXXX   # pid指定
kill -s SIGTERM  XXXX   # pid指定

もしくはpidをファイルに出力している場合にはファイルを参照して実行するコマンドが良い。

kill -s SIGTERM `(cat tmp/pids/puma.pid)`    # -QUIT でも良い

pumaのデーモン化を自動起動に組み込む。

自動実行スクリプト /etc/init.d/pumaを作る。

#!/bin/bash


NAME=puma
USER=<user_name>
APP_NAME=<app_name>
APP_DIR=/home/$USER/railsWork/$APP_NAME  #webアプリのプロジェクトルートをフルパスで指定
TMP_DIR=$APP_DIR/tmp
PID_DIR=$TMP_DIR/pids
PID_FILE=$PID_DIR/puma.pid  #config/puma.rb で指定しているpidファイルと同じパス&ファイル名を指定する。
PUMA_BIN=/home/$USER/.rbenv/shims/pumactl  #rbenvの使用をしている前提のスクリプトにした。
HOME=/home/$USER
NODE_VERSION=v8.10.0    #railsアプリが前提としているnode.jsのバージョン。nvmでインストールしてある前提でこのスクリプトにした。


# home/.bashrcに組み込んでいたnvmのロードスクリプト。インタラクティブモードのときしか.bashrcは読まれないので、同じスクリプトをここに仕込む。
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm

# nvmのdefault設定がしてあれば動くが、defaultのままではdefaultのバージョンが変わったときに問題が起きる可能性があるので、やはりバージョンを指定しておくべき。そのためのnvmだし。
nvm use $NODE_VERSION





start() {
  cd $APP_DIR;
  echo "--------------------------------"
  echo "Starting puma init script."
  echo 
  echo "---init script config parameters---"
  echo "USER= $USER"
  echo "APP_NAME= $APP_NAME"
  echo "APP_DIR= $APP_DIR"
  echo "TMP_DIR= $TMP_DIR"
  echo "PID_FILE= $PID_FILE"
  echo "NODE_VERSION= $NODE_VERSION"
  echo 
  echo "---context information---"
  echo "pwd=" `pwd`
  echo "NVM_VERSION=" `nvm --version`
  echo "NODE_VERSION=" `node --version`
  echo 
  echo "---start the service.---"

  sh -c "$PUMA_BIN start"
  echo 
  echo "--------------------------------"

}

stop() {
  echo -n "Stopping puma"
  kill -s SIGTERM `cat $PID_FILE`
}

restart() {
  stop
  start
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    restart
    ;;
  *)
    N=/etc/init.d/$NAME
    echo "Usage: $N {start|stop|restart}" >&2
    exit 1
    ;;
esac

自動実行スクリプトを実行許可する。

sudo chmod +x /etc/init.d/puma

参考サイト

qiita.com

UbuntuにNVM+Node.jsをインストール

nvm

公式サイトで示されているcurlを使うでやってみた。
自動で.bashrcに下記が追加してくれた。

cd
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash

#インストールして、さらに
#.bashrcに下記2行が自動で追加された。
# export NVM_DIR="$HOME/.nvm"
# [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm

nvm --version  #動作確認

node.js をバージョン指定でインストール

nvmを使ってnode.jsをインストール

nvm ls-remote    #インストールできるバージョン番号の一覧表示 
nvm ls-remote --lts    #インストールできるバージョン番号の一覧表示 (LTS限定表示)
nvm install v8.10.0  #バージョン番号をする。例えば v8.10.0
nvm alias default v8.10.0  #デフォルトで使うバージョン番号を指定する。
nvm use v8.10.0      #使用するバージョンを切り替える。
nvm current        #確認
nvm which v8.10.0   #バージョン指定で、どこにパスが通っているのかを確認

node --version  #動作確認

Ubuntu16.04にEmacs25をインストール

  • リポジトリを登録してインストールを実行する。
sudo add-apt-repository ppa:kelleyk/emacs
sudo apt-get update
sudo apt-get install emacs25
  • Emacs24がインストールされていた場合はupdate-alternativesで設定変更してEmacs25に切り替える。
sudo update-alternatives --config emacs

参考

qiita.com

xfce4でメニューバーやパネルが消えた!!

いつの間にか、xfceのメニューバーやパネルが消えてしまった。
ログインしなおしても再起動してもダメ。
ターミナルでパネルを起動するとメニューバーとパネルが表示されることを確認した。

xfce4-panel   #起動コマンド

でもこれだと Ctrl+c で終了するとメニューバーもパネルも消えてしまう。
セッションマネージャーで自動起動に登録しておけばOK。

EC2上のUbuntuデスクトップ環境を構築してX2Goで接続する。

準備

  • Ubuntuのインスタンスを起動
  • SSHで接続
  • ひと通りのアップデート
 sudo apt-get update
 sudo apt-get upgrade

Ubuntuに日本語環境セットアップ

  • Japanese Teamによる追加パッケージのリポジトリを追加する。(Ubuntu 16.04 LTSの場合)
wget -q https://www.ubuntulinux.jp/ubuntu-ja-archive-keyring.gpg -O- | sudo apt-key add -
wget -q https://www.ubuntulinux.jp/ubuntu-jp-ppa-keyring.gpg -O- | sudo apt-key add -
sudo wget https://www.ubuntulinux.jp/sources.list.d/xenial.list -O /etc/apt/sources.list.d/ubuntu-ja.list
sudo apt-get update
sudo apt-get install language-pack-ja-base language-pack-ja

sudo update-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
source /etc/default/locale 
echo $LANG   # ja_JP.UTF-8と表示される。変更された。
passwd            # 試しに何かしてみる。日本語でプロンプトが表示されればOK
  • 日本語 Remix DVDに追加されているパッケージと同じものをインストールする場合は、以下のコマンドを実行します。
sudo apt-get install ubuntu-defaults-ja
  • タイムゾーンを日本語化
sudo dpkg-reconfigure tzdata
#asia-tokyoを選択する。

Ubuntuデスクトップxfceインストール

sudo apt-get update
sudo apt-get install xubuntu-desktop  #xfceが好きだから。

X2Goサーバーインストール

sudo apt-add-repository -y ppa:x2go/stable
sudo apt-get update
sudo apt-get -y install x2goserver x2goserver-xsession
                          • -

やってないけど、メモ

デスクトップ接続用のログインユーザー作成

sudo adduser <ユーザー名>
usermod -aG sudo <ユーザー名> #管理者権限付与

EC2上でnode.jsをインストール、WEBサイト構築メモ

 

EC2にnode.jsをインストールしてWEBサービスを起動する方法

ネットワーク回り、EC2の構築などの基本はこの記事では除外する。

 

①EC2が動く状態にする。

省略

 

②EC2にリモートログイン

省略

 

②node.jsをグローバルにインストールする準備

yumのリポジトリにはnode.jsが無いので、まずはリポジトリ登録してから。

公式ページに載っている。Installing Node.js via package manager | Node.js

curl --silent --location https://rpm.nodesource.com/setup_9.x |sudo bash - 

 

③node.jsをグローバルにインストールする。 

sudo yum -y install nodejs

 

③デーモン化するパッケージ foreverをインストール

sudo install -g forever

 

④foreverでデーモン登録

cd プロジェクトルート

sudo forever start app.js

 

⑤foreverで動いているプロセスの状態を確認

sudo forever  list

 

⑥サーバーのリッスン状態を確認

sudo lsof -i -n -P

 

 

ちなみに、node.jsでWEBサーバーをウェルノウンポート80で起動する方法

普通、スクリプト内でポート80を指定、listen(80) で実行すると、権限不足のエラーになる。これはsudoで実行すれば解決するらしい。

sudo node app.js

あとは、sudo で実行するのをデーモン化すれば良いことになる。

ただし、sudoで実行するとプロセスの所有者がrootになっているのが危険らしい。

下記参考サイトに則って、listenメソッドの中で別ユーザーにプロセスを引き継ぐとよいらしい。

 

 

 

foreverのデーモン登録を自動起動する方法 

①initd-foreverというのを使うらしい。そのインストール方法。

sudo npm install -g initd-forever

 

②プロジェクトルートで、起動スクリプトを作成する。

cd <プロジェクトルート>
sudo initd-forever -n <プロジェクトルート>

③起動スクリプトの中身を編集して、エントリポイントになるスクリプトファイルを指定する。

nodeApp="/home/<ユーザー名>/<プロジェクトルート>/app.js"

 

※特に修正する必要がなかった。プロジェクトにnpm initして、package.jsonのstartコマンドに node app.jsを登録してあったからなのか?

 

④起動スクリプトを実行可能にして、init.dディレクトリに置く。

sudo chmod +x <プロジェクトルート>

 

sudo mv <プロジェクトルート> /etc/init.d

※シンボリックリンクを入れる方が普通?

 

⑤サービスを有効化する。


    sudo chkconfig --add <プロジェクトルート>
    sudo chkconfig <プロジェクトルート> on
    sudo chkconfig <プロジェクトルート> --list
    sudo service <プロジェクトルート> start

 

 

 

以下、参考サイト

 

 

参考サイト① node.jsをec2のyumに登録する方法

Installing Node.js via package manager | Node.js ※Debian系、RedHat系などURLや登録方法の違いに応じて丁寧に説明されている。

 

参考サイト② 80番ポートで登録して、一般ユーザーにプロセスを引き渡す方法

qiita.com

 参考サイト③ foreverのデーモン化を自動起動する方法

qiita.com

 

 

 

ブログ再開した。!!

NSubstitute

NUnitのモックを使いこなせるようになってみようと思ってやってみた。 NUnit.mocks.DynamicMock を使ったら、警告が出た。

警告 1 'NUnit.Mocks.DynamicMock' は古い形式です: 'NUnit now uses NSubstitute'

 

というわけで、NSubstituteを使ってみた。

 

続きを読む

WickedPdf

SqaleでWickedPdfを使えた。

もともとSqaleサーバーにはwkhtmltopdfはインストールされていないようだが、Gemでバイナリをインストールしてしまうことで簡単に使えるようになる。'wkhtmltopdf-binary' gem。

 

続きを読む

データ削除リンクの確認プロンプトconfirmをBootStrapのモーダルに置き換える。

rails標準の確認プロンプトはかっこ悪いので、BootStrapのモーダルを使うようにカスタマイズした。data-confirm属性を持っているとこのモーダルが使われるようになった。また、data-confirm属性の内容にhtmlタグ付きの文字列をセットすることで、確認プロンプトの中身を自由にHTMLで表現できるようになった。

 

続きを読む