さくらVPS+Ubuntu 18+PerlでWebシステム開発 環境構築

さくらVPS+Ubuntu 18+PerlでWebシステム開発環境を行う手順のまとめ。

さくらVPSの申し込み

さくらVPSを申し込みます。

さくらVPS 料金・仕様一覧

さくらVPSへUbuntu 18をインストール

さくらVPSへUbuntu 18をインストールしましょう。インストール手順は、2020年8月16日に試したものです。

さくらVPSコントールパネルからログイン。

右上、サーバー新規追加をクリック。

ゾーンを選択。石狩 第1ゾーン。東京 第2ゾーン。大阪 第3ゾーン。

コストが安く、サービスを行う場所に近いゾーンを選ぶのが良いでしょう。

プラン選択。512, 1G, 2Gの中からまずは選択しましょう。ストレージは100G程度あったほうが、後ほど困らないと経験的に感じますが、最初に始めるなら、一番コストの小さなプランもお勧めです。

ストレージを増やしたい場合は、ストレージ変更オプションで、ストレージを増やしましょう。料金は初回のみです。ストレージ性能が下がるリスクについて書かれているので、速度をとるか容量をとるかで決めましょう。

次へ進む。

サーバーの名前は、任意項目なので、そのまま。

サーバーの説明も、任意項目なので、そのまま。

インストールするOSは、Ubuntu 18.04amd64(64bit)です。

管理ユーザ名は固定で「ubuntu」となっています。

「新しい管理ユーザのパスワード」と「新しい管理ユーザのパスワード(確認のため再入力)」を入力します。これは、実質的にはrootパスワードになります。

スタートアップスクリプトは、利用しません。

パケットフィルタの設定は、デフォルトでSSHの22番ポートのみとなっています。これは、後で変更します。

公開鍵の登録は、登録しないを選択します。

次へ進む。

支払いパターンを選択します。月払いか年間一括払いを選択できます。

支払い方法を選択します。クレジットカード、銀行振込、請求書払いを選択できます。

クーポンは、空白にしておきます。クーポンがあって、使いたい場合は入力してください。

次へ進む。

お申し込み確認の画面になりますので、同意するを選択して、申し込みをクリック。

これで、さくらVPSで、Ubuntu 18を使えるようになります。

パケットフィルタリング - ファイアーウォールの設定

Webシステム開発のために必要なポートを開放しましょう。この手順は、2020年8月16日に試したものです。

さくらVPSログイン。

左サイドバー、サーバーをクリック。

サーバー一覧から、作成したサーバーをクリック。

タブの一番右側の「パケットフィルタ」をクリック。

「パケットフィルタ設定へ」をクリック。

「解放ポートを追加する」をクリック。

HTTPとHTTPSのポートを開放

「フィルタの用途」で「Web」をクリック。HTTPの80番ポートと、HTTPSの443番ポートが解放されます。

「設定を保存する」をクリック。設定が完了しました。

同じ作業を繰り返します。

「パケットフィルタ」「パケットフィルタ設定へ」

SSHのポートを開放

SSHのデフォルトの22番ポートは非常にセキュリティリスクのあるポートです。

SSH用のあなた独自のポートを追加してください。ウェルナウンポートと、Webアプリケーションで使うポートを避けて選びます。

自分で選べないよーという方は「30000」番台のポート(32767まで)を一つ選びましょう。例を書いておきます。

  • 30012
  • 31463
  • 32130

さくらVPSでは、パケットフィルタリングでは、ポートの値は数値で 1 から 32767 の範囲で指定する必要があるようです。

「開放ポートを追加する」をクリック。

「フィルタの用途」で「カスタム」をクリック。

プロトコルは「TCP」を選択。

「ポート番号」に上記で選択したSSH用のポート番号を入力してください。

「設定を保存する」をクリック。設定が完了しました。

同じ作業を繰り返します。

「パケットフィルタ」「パケットフィルタ設定へ」

Mojolicious開発サーバー用のポートを開放

Mojolicious開発サーバー用のポートを開放しておきましょう。Mojoliciousは、PerlのWebフレームワークのひとつで、リアルタイムWebとクラウドサーバーに対応できます。

Mojolicious開発サーバー用のポートは

3000

です。

「開放ポートを追加する」をクリック。

「フィルタの用途」で「カスタム」をクリック。

プロトコルは「TCP」を選択。

「ポート番号」に「3000」を入力してください。

「設定を保存する」をクリック。設定が完了しました。

開発者が複数いる場合は、必要に応じて、パケットフィルタから別のポートを開放しましょう(3001番、3002番など)。

同じ作業を繰り返します。

「パケットフィルタ」「パケットフィルタ設定へ」

Mojolicious本番サーバー用のポート開放

Mojolicious本番サーバー用のポートを開放しておきましょう。これは、試験に使用します。

Mojolicious本番サーバー用のポートは

8080

です。

「開放ポートを追加する」をクリック。

「フィルタの用途」で「カスタム」をクリック。

プロトコルは「TCP」を選択。

「ポート番号」に「8080」を入力してください。

「設定を保存する」をクリック。設定が完了しました。

開発者が複数いる場合は、必要に応じて、パケットフィルタから別のポートを開放しましょう(3001番、3002番など)。

Webコンソールからの作業

Webコンソールからの作業について解説します。

まずVPSサービスを申し込んだ後のサーバーの操作は、まずWebコンソールからのコマンドで始めます。

この記事では、Webコンソールは、Webブラウザから利用できるCUI端末のことです。

最低限やっておかなければならないことは、Webアプリケーション用のユーザーの作成です。

Webアプリケーションのユーザーの作成の作業が終われば、SSHクライアントと呼ばれるツールを使って、WindowsやMacOSからUbuntuサーバーにアクセスできるようになります。

Webコンソールからすべてのコマンド実行を行えますが、効率を考えた場合は、SSHクライアントとSSH上でサーバー上のファイルを編集できるソフトウェアをWindowsやMacOS上にインストールして使うのが、現実的です。

Webコンソールを表示する

Webコンソールを表示しましょう。

さくらVPSへログインします。

対象のサーバーをクリックします。

サイト上部「コンソール」をクリックします。

「シリアルコンソール(β版)」をクリックします。シリアルコンソールが起動します。シリアルコンソールは、Webコンソールの一つです。シリアルコンソールを使ってコマンド実行を行っていきます。

シリアルコンソールが起動したら、一度Enterキーを押してください。

次のようにloginユーザーを入力できるようになります。

tk2-250-35845 login:

「ubuntu」と入力して、Enterを押してください。

ubuntu

以下のようにパスワードを聞かれます。

Password:

初期パスワードを入力して、Enterを押してください。ログインできれば成功です。以下のように表示されます。

ubuntu@tk2-250-35845:~$

この状態になれば、Linuxのコマンドが実行できます。

Webアプリケーション用のユーザーの追加

Webアプリケーション用のユーザー「myapp」を追加しましょう。この名前は任意で構いませんが、これ以降の手順では「myapp」を使って解説します。

ユーザーの追加

ユーザーを追加するにはuseraddコマンドを使用します。「-m」オプションで、ホームディレクトリが作られます。

sudoコマンドは、管理者権限で実行するためのコマンドだとここでは想定してください。

# ユーザーの追加(ホームディレクトリあり。シェルにbashを使う)
sudo useradd -m myapp -s /bin/bash

sudoコマンドを実行するとパスワードを聞かれますので、初期パスワードを入力してください。

パスワードの設定

Webアプリケーション用のユーザー「myapp」のパスワードを設定しましょう。「myapp」はsudoグループに追加して、管理者権限を持たせますので、安全な長さと複雑さのパスワードにしておくことを推奨します。

パスワードはpasswdコマンドで設定できます。

sudo passwd myapp

パスワードの入力と確認のための再入力を求められるので設定します。

sudoグループに登録

アプリケーションユーザー「myapp」をgpasswdコマンドを使って、sudoグループに登録します。「myapp」ユーザーに管理者権限を与えます。

sudo gpasswd -a myapp sudo

SSHクライアントの利用

パソコン上からSSHでサーバーへの接続して、コマンド実行とファイル編集ができるようにしましょう。

SSHクライアントでコマンド実行

SSHクライアントでSSHサーバーに接続してコマンド実行するツールに、Windowsの場合はTeraTermがあります。

PuTTYなどの他のWindowsで動くSSHクライアントもありますので、お好みで。

Macの場合は、ターミナルからsshコマンドが使えます。

SCPを使ってサーバー上のファイルを編集

SCPというSSH上に構築されるプロトコルを使うとサーバー上のファイルを編集できます。

SCPクライアントとして、Windowsの場合はWinSCPがあります。

MacにもWindowsのWinSCPの代わりになるようなソフトウェアがあるので、インストールしましょう。

SSHサーバーの設定

SSHクライアントを使って、SSHでサーバーに接続します。デフォルトでは、SSHのポート番号は22番になっています。

サーバーのセキュリティを高めるために、先ほど、さくらVPSのパケットフィルタで追加で解放したSSHのポートに変更しましょう。

タイムゾーンの設定

タイムゾーンを「Asia/Tokyo」に設定しましょう。timedatectlでタイムゾーンの設定・確認ができます。

# タイムゾーンを「Asia/Tokyo」に設定
sudo timedatectl set-timezone Asia/Tokyo

タイムゾーンの確認。

# タイムゾーンの確認
timedatectl

パッケージのインストール

Perl Webシステム開発で必要になるパッケージをインストールしましょう。

aptのアップデート

aptコマンドは、パッケージのインストールコマンドですが、apt自体が古いとパッケージのダウンロードが失敗する場合があるのでaptをアップデートします。

sudo apt update

コンパイラ・リンカ

コンパイラ・リンカのインストールです。makeのインストールgccのインストールg++のインストールを行いましょう。Perlのモジュールのコンパイルに必要です。

aptでインストールする手順は一行ずつ実行していくことをお勧めします。手順がとばされたり、インストールされていることを確認せずに、進んでいくという経験が多いという理由で。

sudo apt install -y make
sudo apt install -y gcc
sudo apt install -y g++

テキストエディタ

Ubuntuのデフォルトのviは機能が限定されているので、より便利なvimのインストールを行いましょう。

sudo apt install -y vim

HTTPクライアント

手順でよく利用されるHTTPクライアントであるcurlのインストールをしておきます。

sudo apt install -y curl

SSL通信

SSL通信のためにlibssl-devのインストールを行いましょう。

sudo apt install -y libssl-dev

画像処理

画像処理のためにlibpng-devのインストールlibgif-devのインストールlibjpeg-devのインストールを行いましょう。

sudo apt install -y libpng-dev
sudo apt install -y libgif-dev
sudo apt install -y libjpeg-dev

圧縮・解凍

圧縮・解凍のためにzipのインストールを行いましょう。

sudo apt install -y zip

ネットワーク

ifconfigが使えるようにnet-toolsのインストールを行いましょう。ipコマンドがLinuxでは推奨されていますが、使いたいサーバー管理者も多そうなので。

sudo apt install -y net-tools

リポジトリ管理

リポジトリ管理のためにgitのインストールを行いましょう。

sudo apt install -y git

Perl

システムPerlのためのしばしば使うであろうツールとモジュールをインストールしましょう。perl-docパッケージのインストールlibio-socket-ssl-perlのインストールlibreadline-devのインストールlibterm-readline-gnu-perlのインストールを行います。

sudo apt install -y perl-doc
sudo apt install -y libio-socket-ssl-perl
sudo apt install -y libreadline-dev
sudo apt install -y libterm-readline-gnu-perl

SSL証明書

SSL証明書の自動発行のためにcertbotのインストールを行います。

sudo apt install -y certbot

データ用ディレクトリの作成

Webアプリケーションがデータを保存するためのデータ用のディレクトリを作成しましょう。「myapp」ユーザーだけではなく、他の開発ユーザーも書き込めるように設定しておきます。

「/datadrive」をmkdirコマンドでデータ用ディレクトリを作成します。

sudo mkdir /datadrive

次に、このデータ用ディレクトリに、Webアプリケーションユーザー「myapp」と他の開発ユーザーが書き込めるようにします。

上記の手順の「myapp」ユーザーに関する部分だけを抜き出しました。

sudo groupadd myapp-group
sudo gpasswd -a myapp myapp-group
sudo chgrp -R myapp-group /datadrive
sudo chmod 775 /datadrive
sudo chmod g+s /datadrive

# 確認
ls -l / | grep datadrive

これで、データ用ディレクトリが完成しました。

Redisサーバー

揮発性の情報の保存サーバーであるRedisサーバーのインストールRedisサーバーの起動確認を行います。

Redisは、主にユーザー認証とセッション管理に利用します。

RedisのPub/Sub機能を利用してpush通知、リアルタイム更新、リアルタイムチャットなどのリアルタイムWebに対応することもできます。

Redisサーバーのインストール

Redsiサーバーをインストールします。

sudo apt install -y redis-server

Redisのインストールはすぐ終わっているはずですが、Redisサーバーの起動に内部で失敗するために、処理に時間がかかります。リトライなどをしているのでしょうか。しばらく待ちましょう。

Redisサーバーの起動確認

Redsiサーバーの起動確認を行います。

sudo systemctl status redis-server

Redisサーバーのデフォルト設定では、IPv6が有効化されていない場合は、起動に失敗するようです。さくらのVPSのUbuntu 18では、IPv6が、デフォルトで設定されていません。

Redis設定ファイルの編集

Redis設定ファイルをviエディタで編集します。間違った場合のためにバックアップもとっておきます。

sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.bak
sudo vi /etc/redis/redis.conf

以下を

bind 127.0.0.1 ::1

以下に変更

bind 127.0.0.1

Redisの起動と確認

Redisの起動と確認を行います。

sudo systemctl start redis-server
sudo systemctl status redis-server

データベースサーバー MariaDB

データベースサーバーであるMariaDBのインストールと起動確認を行います。

データベースサーバーと関連ライブラリのインストール

データベースサーバーMariaDBと関連ライブラリをインストールします。mariadb-clientのインストールmariadb-serverのインストールlibmysqlclient-dev のインストールlibmariadb-devのインストールを行います。

sudo apt install -y mariadb-client
sudo apt install -y mariadb-server
sudo apt install -y libmariadbclient-dev
sudo apt install -y libmariadb-dev

データベースサーバーの起動確認

MariaDBが起動していることを確認します。

sudo systemctl status mariadb

rootユーザーでMariaDBに接続

まず最初にMariaDBのrootユーザーでMariaDBに接続しましょう。

rootユーザーで接続するためには、mysqlコマンドをsudoで実行します。ユーザー名はrootです。

sudo mysql -uroot

MariaDBへの接続を終了するには「quit」と入力してEnterを押します。

quit

データベースの作成

ここでは、Webアプリケーション用のデータベースを作成します。データベース名は、myappdbにしておきます。データベース名の変更には、少し工夫はいりますが、後でデータベース名の変更は可能です。

create database myappdb;

作成したデータベースを確認するために、データベースの一覧を表示します。

show databases;

アプリケーションユーザーの作成

アプリケーション用のユーザー「myapp」を作成します。

# myappユーザーの作成
create user myapp;

権限とパスワードの設定

myappユーザーにselect,update,insert,delete権限を与えパスワードを設定します。

パスワードは「identified by」の後ろに続いている文字列です。この部分を、自分で設定してください。

# myappユーザーにselect,update,insert,delete権限を与える
grant insert,update,delete,select on myappdb.* to 'myapp'@'localhost' identified by 'eifjutab&';

PerlでDBD::mysqlをインストールするときに、testデータベースへの接続権限必要になるので、設定しておきます。

create database test;
grant all privileges on test.* to 'myapp'@'localhost' identified by 's3kr1t';

アプリケーションユーザーでの接続確認

接続を抜けて、新しく作成した「myapp」ユーザーで、MariaDBに接続できることを確認します。

# rootユーザーで接続
mysql -umyapp -p

MaridDBの初期設定の詳しい解説はMariaDBの初期設定とユーザーの作成が参考になります。

Perl Web開発環境の構築

Perl Web開発環境の構築としてユーザー環境にPerlをインストールし、Mojoliciousの小さなWebアプリケーションを立ち上げます。

Perlのインストール

ここでは、Perlのトラブルがなるべく少ない「perl-5.20.3」をインストールします。

公式なセキュリティフィックスのサポートが存在するバージョンが良い場合は、最新版のPerlかその前のバージョンのPerlをインストールしましょう。

以下の手順からperlbrewでユーザー環境にPerlをインストールするための必要な部分を抜き出します。plenvで行いたい場合は、以下の手順の中にあるので参考にしてください。

Perlのインストールは、ソースコードからビルドされ、さらに試験が実行されるので、非常に時間がかかります。10分~20分くらいかかる気がするので、お茶でも飲みましょう。

# perlbrewのインストール
wget -O - http://install.perlbrew.pl | bash

# perlbrewの設定を~/.bashrcに書き込み
echo "source ~/perl5/perlbrew/etc/bashrc" >> ~/.bashrc

# ~/.bashrcを再読み込み
source  ~/.bashrc

# Perlのインストール
perlbrew install perl-5.20.3

# インストールしたPerlへの切り替え
perlbrew switch perl-5.20.3

# Perlのバージョン確認
perl -v

# cpanmのインストール
perlbrew install-cpanm

Webアプリケーションの立ち上げ

次にMojoliciousのインストールとWebアプリケーションの起動を行います。

以下の記事の内容を実行してください。最後の「ApacheからのリバースプキシによるWebアプリケーションへの接続」の部分以外の手順を実行しましょう。

バッチプログラムがライブラリのパスを発見できるようにする

バッチプログラムがWebアプリケーションのライブラリのパスを発見できるようにしておきましょう。Webアプリケーションに加えて、バッチプログラムを作成する場合の準備をしておきます。

「~/.bashrc」に追加しましょう。

vi ~/.bashrc

以下の内容を追記します。

export PERL5LIB=/home/myapp/webapp/lib

ドメイン名の取得とDNSサーバーの設定

ドメインを取得して、ドメイン名とサーバーIPアドレスを紐づけましょう。ドメイン名は、インターネット上でWebサイトを公開するためと、メール送信サーバーの設定のために必要です。

さくらVPSの場合のサーバーのIPアドレスは、VPSコントロールパネルの「IPv4」「ネットワーク情報」「アドレス」に記載されています。

以下の記事の中のAレコードの設定のみを行ってください。

この記事のここからの例では、ドメイン名として「build-sakuravps-ubuntu18.perlclub.net」を使用します。

メールアドレスの作成とDNSサーバーの設定

メールアドレスの作成とDNSサーバーの設定を行いましょう。

cron

定期プログラム実行の常駐アプリケーションであるcronの起動確認を行います。

cronの起動確認

以下の記事の「sudo systemctl status cron」を実行してApacheが起動していることを確認してください。

crontabの設定

crontabの初期設定をしておきましょう。

cronの設定はcrontabに書きます。crontabは、ユーザーごとに持つことができます。myappというユーザーでcrontabを編集すると、それはmyappのcrontabになります。

crontabを編集するには「-e」オプションを使用します。

crontab -e

エディタが起動します。

cronの落とし穴として、ユーザー環境にインストールしたPerlが使われないというものがあります。これを解決するためにPATH環境変数を設定します。

env | grep -P '^PATH'

表示された値を以下のように設定します。

PATH=/home/myapp/perl5/perlbrew/bin:/home/myapp/perl5/perlbrew/perls/perl-5.16.2/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/myapp/bin

cronの自動実行でエラーが発生した場合にメールが来るように設定しておきましょう。

MAILTO=kimoto_test@perlclub.net

バッチプログラムがWebアプリケーションのライブラリのパスを読み込んでくれるように設定しておきましょう。

PERL5LIB=/home/myapp/webapp/lib

保存して終了しましょう。

Apache

WebサーバーであるApacheのインストールと設定を行います。HTTPSで接続できるようにSSLの設定を行います。Mojoliciousアプリケーションに接続できるようにバーチャルホストとリバースプロキシの設定を行います。

ドメイン名の取得とDNSサーバーの設定で、使用するドメインが正しくサーバーのIPアドレスに紐づけられていることが前提です。

Apacheのインストール

Apacheのインストールを行います。

sudo apt install -y apache2

Apacheの起動確認

Apacheの起動確認を行います。

sudo systemctl status apache2

Apacheモジュール

リバースプロキシの設定とSSLの設定とWebSocketの設定に必要なApacheモジュールを有効にします。

mod_ssl, mod_rewrite, mod_headers, mod_proxy, mod_proxy_http, proxy_wstunnelを有効にします。

# mod_sslを有効化
sudo a2enmod ssl

# mod_rewriteを有効化
sudo a2enmod rewrite

# mod_headersを有効化
sudo a2enmod headers

# mod_proxyを有効化
sudo a2enmod proxy

# mod_proxy_http
sudo a2enmod proxy_http

# mod_proxy_wstunnel
sudo a2enmod proxy_wstunnel

Apacheを再起動します。

sudo systemctl restart apache2

Apacheの状態確認を行います。

sudo systemctl status apache2

バーチャルホストとリバースプロキシの設定

バーチャルホストとリバースプロキシを設定してApacheへのHTTP接続をMojoliciousアプリケーションに転送します。以下の手順から、必要な部分を抜粋します。

設定ファイルを以下のディレクトリに配置します。

/etc/apache2/sites-available

この設定ファイルのディレクトリについては、以下のページで詳しく解説しています。

サイトのドメイン名(ここではbuild-sakuravps-ubuntu18.perlclub.net)に「.conf」を付けた名前で、viコマンドで、設定ファイルを作成しましょう。

cd /etc/apache2/sites-available
sudo vi build-sakuravps-ubuntu18.perlclub.net.conf

バーチャルホストとリバースプロキシの設定ファイルの内容です。WebSocketとHTTPSに対応したリバースプロキシの設定です。SSL証明書は、デフォルトで準備されている自己SSL証明書を指定しています。これは、後で、正式なSSL証明書に差し替えます。

<VirtualHost *:80>
  ServerName build-sakuravps-ubuntu18.perlclub.net

  RewriteEngine on
  RewriteRule (.*)?$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>

<VirtualHost *:443>
  ServerName build-sakuravps-ubuntu18.perlclub.net

  <Proxy *>
    Require all granted
  </Proxy>

  ProxyRequests Off
  ProxyPreserveHost On
  ProxyPass /websocket ws://localhost:8080/websocket
  ProxyPass / http://localhost:8080/ keepalive=On
  ProxyPassReverse / http://localhost:8080/
  RequestHeader set X-Forwarded-Proto "https"

  SSLEngine on
  SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
  SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
</VirtualHost>

設定ファイルの有効化

設定が終わったら、設定ファイルを有効にします。

sudo a2ensite build-sakuravps-ubuntu18.perlclub.net.conf

設定ファイルの再読み込み

Apacheの設定ファイルを再読み込みします。再読み込みの前に、Apacheの設定ファイルのテストをしましょう。

sudo apachectl -t

Apacheを再起動します。

sudo systemctl reload apache2

以下のドメインででWebサイトが表示できれば成功です。SSLの警告がでるのは、この後、正式なSSL証明書の設定をすることで、修正されます。

https://build-sakuravps-ubuntu18.perlclub.net

SSL証明書の取得

HTTPSでリクエストを受けるために、Let's Encryptを使ってSSL証明書の発行を行います。

Let's Encryptは、HTTPリクエストによってSSL証明書の認証を行うので、Webアプリケーションを起動します。

# Webアプリケーションの起動
hypnotoad webapp.pl

ドメイン名は「build-sakuravps-ubuntu18.perlclub.net」という名前で取得しており、DNSサーバーにおける、ドメイン名とIPアドレスの対応の記述は済んでいることを、この記事では前提とします。適宜対応する部分を書き換えてください。

メールアドレスの作成の作業が終了しており「kimoto_test@perlclub.net」というメールアドレスで送受信できることをこの記事では前提とします。適宜対応する部分を書き換えてください。

SSL証明書をLet's Encryptで取得するには、certbotコマンドを実行してください。

sudo certbot certonly --agree-tos --non-interactive -d build-sakuravps-ubuntu18.perlclub.net --webroot -w /home/myapp/webapp/public --email kimoto_test@perlclub.net

以下のメッセージが含まれていれば成功です。

Congratulations! Your certificate and chain have been saved at:

SSL証明書が以下のディレクトリに作成されます。上から、SSLの証明書ファイル、SSL証明書の秘密鍵ファイル、中間証明書ファイルです。

/etc/letsencrypt/live/build-sakuravps-ubuntu18.perlclub.net/cert.pem
/etc/letsencrypt/live/build-sakuravps-ubuntu18.perlclub.net/privkey.pem
/etc/letsencrypt/live/build-sakuravps-ubuntu18.perlclub.net/chain.pem

lsコマンドで実際に見てみましょう。

sudo ls -l /etc/letsencrypt/live/build-sakuravps-ubuntu18.perlclub.net

Let's EncryptでのSSL証明書の更新する場合「certbot renew」コマンドを使用します。取得したすべてのSSL証明書に対して更新が必要かどうかの確認が行われ、更新期限が1ヵ月以内であれば証明書が更新されます。

sudo certbot renew -q --no-self-upgrade --post-hook "systemctl reload apache2"

このコマンドはcronの自動更新に設定しておくと、自動で更新されます。cronの設定については、後程解説します。

Apacheの設定ファイルにSSL証明書を追加

Apacheの設定ファイルにSSL証明書を追加します。

まずSSLの基本設定ファイルを作成します。これは、後でWebアプリケーションが増えた場合に共通して使うことを想定しています。

「conf-available/ssl-basic.conf」というファイル名でviエディタで作成します。

cd /etc/apache2
sudo vi conf-available/ssl-basic.conf

以下の内容を追加します。

SSLEngine on
SSLProtocol             all -SSLv2 -SSLv3
SSLCipherSuite          ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
SSLHonorCipherOrder     on

次にWebアプリケーションの設定ファイルを編集します。自己SSL証明書の記載部分をLet's Encryptで作ったSSL証明書に変更します。

cd /etc/apache2/sites-available
sudo vi build-sakuravps-ubuntu18.perlclub.net.conf

元のSSL証明書の設定部分です。

  SSLEngine on
  SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
  SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

以下のように書き換えてください。

<VirtualHost *:80>
  ServerName build-sakuravps-ubuntu18.perlclub.net

  RewriteEngine on
  RewriteRule (.*)?$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>

<VirtualHost *:443>
  ServerName build-sakuravps-ubuntu18.perlclub.net

  <Proxy *>
    Require all granted
  </Proxy>

  ProxyRequests Off
  ProxyPreserveHost On
  ProxyPass /websocket ws://localhost:8080/websocket
  ProxyPass / http://localhost:8080/ keepalive=On
  ProxyPassReverse / http://localhost:8080/
  RequestHeader set X-Forwarded-Proto "https"
  
  # SSL証明書
  Include conf-available/ssl-basic.conf
  SSLCertificateFile /etc/letsencrypt/live/build-sakuravps-ubuntu18.perlclub.net/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/build-sakuravps-ubuntu18.perlclub.net/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/build-sakuravps-ubuntu18.perlclub.net/chain.pem
</VirtualHost>

Apacheの設定ファイルが正しいかテストを行います。

sudo apachectl -t

SSL証明書の更新後、SSL証明書を再読み込みするために、systemctlコマンドでApacheの再起動をします。

sudo systemctl reload apache2

WebサイトにアクセスしてSSL証明書が有効になっていればOKです。

Let's EncryptでのSSL証明書の更新の自動化

Let's EncryptでのSSL証明書の更新を手動で行うのは、手間がかかります。一週間に一回、自動的に更新するように設定しておきましょう。

一日一回の場合は、もしcertbotが間違っていた場合に、大量にSSL証明書を発行してしまって、しばらくSSL証明書が取得できないという事態になる可能性があるので、やめておいた方がリスクは避けられます。

1ヵ月に一回だと、もう少し頻度を上げた方が、間違っている場合の確認がしやすいかなと感じます。

というわけで、ここでは、1週間に1回、月曜日の9時に更新するという記述にしておきます。

rootのcrontabを修正するには「sudo」をつけてcrontabを起動します。

sudo crontab -e

以下のようにcrontabの内容を設定します。メールアドレスは、自分が受信できるメールアドレスを指定してください。

MAILTO=kimoto_test@perlclub.net

0 9 * * 1 certbot renew -q --no-self-upgrade --post-hook "systemctl reload apache2"

Webアプリケーションのsystemdによる管理

OPを再起動したときにMojoliciousアプリケーションも自動起動するようにMojoliciousアプリケーションをsystemdへ登録しましょう。

ここでは、perlbrewを使って、Perl 5.20.3をインストールしていることを前提とします。Mojoliciousアプリケーションも上記手順で「Webapp」という名前で作成したことを前提としています。

systemdの設定ファイル

「webapp」というサービス名で、systemdに登録します。以下のファイルを新規作成します。

sudo vi /lib/systemd/system/webapp.service

viコマンド開いて以下の内容を書き込んでください。

[Unit]
Description=My Mojolicious application
After=network.target

[Service]
Type=forking
PIDFile=/home/myapp/webapp/script/hypnotoad.pid
ExecStart=/home/myapp/perl5/perlbrew/perls/perl-5.20.3/bin/hypnotoad /home/myapp/webapp/script/webapp
ExecReload=/home/myapp/perl5/perlbrew/perls/perl-5.20.3/bin/hypnotoad /home/myapp/webapp/script/webapp
ExecStop=/home/myapp/perl5/perlbrew/perls/perl-5.20.3/bin/hypnotoad /home/myapp/webapp/script/webapp --stop
KillMode=process
User=myapp
Group=myapp-group
Environment=MY_SERVER_ENV=my_dev

[Install]
WantedBy=multi-user.target

サービスの有効化

サービスを有効化しましょう。

sudo systemctl enable webapp

もしMojoliciousアプリケーションがすでに起動している場合は、停止します。

/home/myapp/perl5/perlbrew/perls/perl-5.20.3/bin/hypnotoad /home/myapp/webapp/script/webapp --stop

Mojoliciousアプリケーションをsystemdの管理下でスタートしましょう。

sudo systemctl start webapp

Mojoliciousアプリケーションが起動しているかどうか確認しましょう。

sudo systemctl status webapp

Mojoliciousアプリケーションが再起動できるか確認しましょう。

sudo systemctl reload webapp

Mojoliciousアプリケーションが停止できるか確認しましょう。

sudo systemctl stop webapp

Mojoliciousアプリケーションを立ち上げておきましょう。

sudo systemctl start webapp

OSの再起動

OSを再起動を行ってMojoliciousアプリケーションが自動再起動されるか確認しましょう。

sudo reboot

メール送信

sendmailコマンドでメール送信ができるようにします。メール送信サーバーとして利用するpostfixのインストールを行います。クラウドメールサービスSendGridをpostfixと連携させる設定を行います。

postfixのインストール

メール送信サーバーpostfixのインストールを行いましょう。メール送信サーバーとして機能するpostfixをインストールするとメールを送信するためのsendmailコマンドが使える用になります。

sudo apt install -y postfix

インストールコマンドを実行すると、GUIのような画面が立ち上がります。

キーボードの右を押すと、Okが光ります。Enterを押します。

上下キーで「No configuration」を選択します。右キーを押すとOkに勧めるので、Enterを押します。

postfixがインストールされます。

SendGridへの申し込み

SendGridトップページから、メールアドレスを入力して申し込みます。

SendGrid申し込み

翌営業日までには、アカウントが発行されます。

SendGridとposfixの連携については、クラウドメール配信SendGridとPostfixとの連携で解説しているものを、必要な部分だけ、以下に書き出します。

APIキーを取得する

APIキーを取得しましょう。SendGridの管理画面にログインします。左のサイドバーの「Settings」をクリック。「API keys」をクリック。

右上の「Create API Key」をクリック。

「API Key name」に任意の名前を入力。(例)perlgenki。

「API Key Permissions」を「Full Access」に。

作成されたAPIキーが表示されます。一度しか表示されないので、コピペして、どこかに保存してください。もし画面を消してしまった場合は、削除して、作成しなおしましょう。

postfixの設定ファイルの編集

postfixの設定ファイルをviコマンドで編集します。

sudo vi /etc/postfix/main.cf

以下の内容を記述します。その他の設定はいらず、これだけOKです。

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_tls_security_level = encrypt
header_size_limit = 4096000
relayhost = [smtp.sendgrid.net]:587

ここで上で設定に記述したパスワードファイルを作成します。

sudo vi /etc/postfix/sasl_passwd

SendGridで取得したAPIキーを指定します。APIキーの部分を、取得したAPIキーに書き換えてください。

[smtp.sendgrid.net]:587 apikey:APIキー

次に、このファイルがrootアカウントでのみ読み書きができるよう制限されていることを確認して、postmap コマンドを使用してPostfixがこの新しいファイルを使用するようハッシュテーブルを更新します:

sudo chmod 600 /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd

最後にPostfixをsystemctlで、起動してください。

# 起動
sudo systemctl start postfix

# 再起動したい場合は以下で
sudo systemctl restart postfix

Postfixの状態を確認します。

sudo systemctl status postfix

sendmailコマンドでメール送信

sendmailコマンドでメールを送信してみましょう。[メール送信元] [メール送信先]のところを送信可能なのメールアドレスにしてください。

echo Hello | sendmail -f [メール送信元] [メール送信先]

sendmailでは、標準入力が、本文になります。

-fはfromでメール送信元を指定します。メール送信元がない場合は、メールがはじかれるという経験が多いので、指定しています。

その後ろに、メールの送信先を指定します。試験するときは、送信先、送信元どちらも同じで大丈夫です。

# 送信例
echo Hello | sendmail -f kimoto_test@perlclub.net kimoto_test@perlclub.net

メール送信ができればOKです。

完成!!!

さくらVPS+Ubuntu 18+PerlでWebシステム開発 環境構築の完成です。お疲れさまでした。

PerlでポータブルなLinuxファイル管理入門

業務に役立つPerl

Perlテキスト処理のエッセンス

ITエンジニアの求人情報など

 ITエンジニアの求人情報・Webサービス・ソフトウェア・スクールなどの情報。