さくらVPS+Ubuntu 18+PerlでWebシステム開発 環境構築
さくらVPS+Ubuntu 18+PerlでWebシステム開発環境を行う手順のまとめ。
さくら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証明書を追加
まず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と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システム開発 環境構築の完成です。お疲れさまでした。