Help us understand the problem. What is going on with this article?

AWS EC2でPerlのWebアプリケーションをホスティングさせる

More than 1 year has passed since last update.

ネットの情報が古いので、最新化のため記載(といってもほぼ参考になるのが多いが)。

  • 独自ドメインを使ったホスティング
    • 2019/6/5
  • Supervisorインストール
    • 2019/6/9

概要

  • PerlのWAFであるAmon2を使って作ったアプリケーションを、AWS EC2にデプロイ
  • EC2の再起動をしたときも起動するように、Supervisorというツールを使ってデーモン化

環境

  • AWS EC2 Ubuntu Server 18.04
  • Perl入学式で作ったSchedulerアプリ
  • すでに独自ドメイン設定は完了しており、 http://www.scheduler-amon2.xyz でindex.htmlにアクセスできるような設定をapacheに実施済みという前提

やりかた

アプリのデプロイ

作成したSchedulerアプリをEC2へgit glone

今回はEC2のIAMユーザであるubuntuユーザのホームディレクトリ直下に格納(/home/ubuntu直下)。
以下、すべての作業はubuntuユーザで行うものとする。

Perlと、Perlのモジュール管理機構を導入

ここを参照して、plenvを使ってperlの導入とcpanmの導入を行った。

cartonでモジュールインストール

console
cd /home/ubuntu/Scheduler
carton install

データベース作成

ほんらい、本番環境では使わないけど、練習なのでsqlite3で実施する。

console
sqlite3 db/production.db < sql/sqlite.sql

リバースプロキシ設定

Amon2だとWebアプリの起動ポートが5000番なので、80番アクセスのときにリバースプロキシで対応する。

モジュール有効化

console
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests

ファイル編集

/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
    DocumentRoot /home/ubuntu/Scheduler

    ProxyPreserveHost On
        ProxyPass / http://www.scheduler-amon2.xyz:5000/
        ProxyPassReverse / http://www.scheduler-amon2.xyz:5000/
</VirtualHost>

apache再起動

console
sudo systemctl restart apache2

Superviserを使ったデーモン化

起動用ファイルを作成

/home/ubuntu/Scheduler/scheduler.sh
#!/bin/bash

export HOME=/home/ubuntu
export PLENV_ROOT=$HOME/.plenv
export PATH=$PLENV_ROOT/bin:$PATH
eval "$(plenv init -)"
cd $HOME/Scheduler
exec plenv exec carton exec plackup -Ilib -R ./lib -E production --access-log /dev/null -p 5000 -a ./script/scheduler-server

exec plenv, exec carton, exec plackupとやっておかないと、コマンド実行がうまくいかない。ここらへん調べたけど結局、なぜexecと最初に打たないといけないのか腑に落ちなかった。あとで調べてみよう。

Supervisorのインストール

console
sudo apt-get install supervisor

pipを使う方法もあるが、今回はシステム管理コマンド(systemctl)の管理下にしたいのでapt-getを使うことにした。入ったバージョンは下記。最新バージョンは4.03

console
$ sudo dpkg -l | grep supervisor
ii  supervisor                     3.3.1-1.1                         all          System for controlling process state

インストールの確認。自動起動が有効(enable)になっているのが確認できる。

console
$ sudo systemctl status supervisor
● supervisor.service - Supervisor process control system for UNIX
   Loaded: loaded (/lib/systemd/system/supervisor.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2019-06-09 11:36:23 UTC; 53min ago
     Docs: http://supervisord.org
 Main PID: 743 (supervisord)
(以下略)

設定ファイルの作成

参考にしたサイトではiniファイルを作るということをしていたが、うまくいかなかった。
今回はすべて一緒くたにした。

/etc/supervisor/conf.d/supervisord.conf
[unix_http_server]
file=/var/run/supervisor.sock

[supervisord]
logfile=/var/log/supervisor/supervisord.log
loglevel=debug
pidfile=/var/run/supervisord.pid
nodaemon=false
minfds=1024
minprocs=200
environment=SHELL="/bin/sh"

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock
history_file=~/.sc_history

[rpcinterface:supervisor]
supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface

[group:supervisord]
programs=scheduler

[program:scheduler]
numprocs=1
autostart=true
autorestart=true
startsecs=4
user=ubuntu
redirect_stderr=true
stdout_logfile=/var/log/supervisor/scheduler_out.log
stdout_logfile_maxbytes=0
stdout_logfile_backups=0
stderr_logfile=/var/log/supervisor/scheduler_err.log
stderr_logfile_maxbytes=0
stderr_logfile_backups=0
directory=/home/ubuntu/Scheduler/
command=/home/ubuntu/Scheduler/scheduler.sh

supervisorサービス再起動 (※ 設定ファイルを読み込んで、変化があったプログラムだけ再起動してくれるタイプのコマンド)

console
sudo supervisorctl update

通常、supervisorを操作するときにはsupervisorctlコマンドを使って操作するのがお作法らしい。

以上。これでEC2を再起動したときにもWebアプリケーションが自動起動されるように設定された。
ログ取得、管理、操作、など、まだまだやりたいことは沢山ある。
さしあたって、つぎはCIツールを試してみたい。

参考情報

omokawa_yasu
Perlのカルチャーが好きなITエンジニアです。オンプレサーバ構築4年、株式会社の社長8年やってました。
https://omokawa765.hatenablog.com/
sight-visit
資格のオンライン予備校「資格スクエア」, 契約管理サービス「NINJA SIGN」を運営するスタートアップ
https://sight-visit.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away