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
参考サイト
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
参考サイト
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
参考
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番ポートで登録して、一般ユーザーにプロセスを引き渡す方法
参考サイト③ foreverのデーモン化を自動起動する方法
ブログ再開した。!!