月500円の予算でVPSとドメイン名買ってみた

月500円なら、お小遣いでVPS使ってウェブアプリ作れるね！と思い立ったのでここにシェアします。最近太り気味なので、お菓子を買うときはVPSのことを思い出すようにします。うん。

# ワンコイン500円/月程度の予算でVPSとDNS関連をゲット

自腹で仮想環境を作って、好きなものを置いてどこからでもテストしたいなーとずっと思っていたところ、[WebArena VPSクラウド](https://web.arena.ne.jp/vps-cloud/)というお手頃環境を提供してくれるサービスを見つけました。2019/3/10時点では、1GB1Core20GBの最小構成で税抜き360円。運用実績もそれなり。

小さいですが、グローバルIPを持つクラウドをゲットしました。OSはCentOSとUbuntu両方あるので、お好みで。私はUbuntu。
sshでターミナルからログインしますが、キーペアで証明書を取得してログインします。証明書は1度しか発行できないので、自分が使用する端末に証明書をコピーして使います。

[.ssh/configファイルでSSH接続を管理する](https://qiita.com/0084ken/items/2e4e9ae44ec5e01328f1)

また、セキュリティグループで使うポートを登録します。ssh、ウェブ（セキュア含む）、データベースなどで使うポートを説明通りにフォームに書き込むだけです。

WebArenaのコントロールパネルとsshログインで、一通りの作業をすると分かるんですが、全体的に機能説明が不足してる感です。でもすごく安いので忖度ですね(^^) 

## WebArenaのubuntuパスワード

Ubuntuを選んだので、初期ユーザ名はubuntu、パスワードはなんとログインして出てくる{**n桁の文字列**}。即刻passwd変更しましょう。sudo suするときに、パスワード必要ですが、マニュアルで見つけられなかった…

```shell:
ubuntu@{**n桁の文字列**}:~$ 
```

## Apache、PHPなどのコマンド

あとはubuntuなので以下のコマンドでコマンド群を最新にします。apache2、何かと使ってしまうPHP7.2も普通に入れます。

```shell:
sudo su
apt update
apt upgrade
apt install apache2
apt install php7.2 libapache2-mod-php7.2 php-mbstring
```

## PHPエラーログの設定

```shell:/etc/php/7.2/apache2/php.ini
error_log = /var/log/php/php_errors.log
```

```
sudo su
mkdir /var/log/php
touch /var/log/php/php_errors.log
(envvarsよりAPACHE_RUN_USER=www-dataのため、ログファイルもwww-dataに変更)
chown www-data:www-data /var/log/php
chown www-data:www-data /var/log/php/php_errors.log
(logrotateの設定は省略)
```

[apacheのログをローテーションする【logrotate】の設定](https://pgmemo.tokyo/data/archives/312.html)


[aptコマンドチートシート](https://qiita.com/SUZUKI_Masaya/items/1fd9489e631c78e5b007)

# httpsサイトにするには独自ドメイン名とSSLが必要

現在、ウェブサービスを公開し、メジャーなブラウザで使えるようにするには、SSL証明書を取得し、httpプロトコルをセキュアにしなくてはならなくなりました。そのためには、SSL証明書を[certbot](https://certbot.eff.org) (Let's encrypt)から無料で取得し、ドメイン名もレジストラ（ドメイン管理している業者から認定されたドメイン登録業者）で取得する必要があります。ドメイン名の取得は、eNom Inc.とお名前.comと提携している[ムームードメイン](https://muumuu-domain.com)で安いのを見つけて完了しました。

それにしても、レジストラの選択が面倒でした。ドメイン名の値段は新規1年目と2年目以降の更新で値段が違います。しかも同じドメインでも微妙にコストが違う... 長く使いたいので、年1000円台くらいで変な意味もなさそうなドメインを選びました。海外のレジストラも探しましたが、更新費用が意外と割高で、為替で値段が変動するのも気になるので日本のレジストラに決めました。

## ムームードメインのコントロールパネル

購入したドメイン名とVPSインスタンスで振られたグローバルIPアドレスを結びつけるということを、実は初めてやりました。
いつもは、職場の隣の人にお願いするとDNSにちゃっちゃと登録してもらえるので、実際は何してるのかわかりませんでした（笑）

まず、ムームードメインのコントロールパネルにログインし、「ネームサーバ設定変更」で、「ムームードメインのネームサーバ（ムームーDNS）を使用する」を選択していることを確認します。私はDNSを建ててないのでムームードメインのDNSを利用します。

次に、「ムームーDNS」で取得ドメインの「変更」を選びます。そこで、「カスタム設定」を行います。要するに、ムームーDNSのメニューでは、ムームードメインでサービスをしているレンタルサーバ類に対して行う設定と、それ以外のサーバに対して行う設定で分けられているということらしいです。

というわけで、「設定2」以下にある、DNS設定を利用します。
まずは、購入したドメイン名とVPSのIPアドレスをAレコードに入力。サブドメインはCNAME、ドメイン名。
_acme-challengeは、certbotでサブドメインを設定する際に必要です。
（a wildcard certificate using Let's Encrypt's new ACMEv2 serverと言われています。）

|サブドメイン|種別|内容|優先度|
|---|---|---|---|
| |A|（VPSのグローバルIP）||	
|（サブドメイン名）|CNAME|（購入したドメイン名）||
|_acme-challenge|TXT|(ワイルドカード証明で必要なトークン1)|
|_acme-challenge|TXT|(ワイルドカード証明で必要なトークン2)|

## certbot設定（ワイルドカード）

```shell:
sudo su
apt update
apt install software-properties-common
add-apt-repository universe
add-apt-repository ppa:certbot/certbot
apt-get install certbot python-certbot-apache
certbot --apache

certbot certonly --manual --server https://acme-v02.api.letsencrypt.org/directory --preferred-challenges dns-01 --agree-tos --manual-public-ip-logging-ok -d '(購入したドメイン名)' -d '*.(購入したドメイン名)' -m (自分のメールアドレス)

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None

- - - - - - - - - - - - - - - - - - - - - - - - - 
You have an existing certificate that contains a portion of the domains you
requested (ref: /etc/letsencrypt/renewal/(購入したドメイン名).conf)

It contains these names: (購入したドメイン名)

You requested these names for the new certificate: (購入したドメイン名),
*.(購入したドメイン名).

Do you want to expand and replace this existing certificate with the new
certificate?
- - - - - - - - - - - - - - - - - - - - - - - - - 
(E)xpand/(C)ancel: E
Renewing an existing certificate
Performing the following challenges:
dns-01 challenge for (購入したドメイン名)
dns-01 challenge for (購入したドメイン名)

この後に以下のメッセージが2回発生して、トークンが表示される。トークンが表示されたら、ウェブブラウザを開き、上記表内のムームードメインDNS設定要領で、TXT値を設定する。

Please deploy a DNS TXT record under the name
_acme-challenge.(購入したドメイン名) with the following value:
（トークン）
Before continuing, verify the record is deployed.
```

2回目のトークンをTXT値に設定し、設定内容を変更した後、ターミナルに戻り、エンターキーを押す。
失敗しても、certbotコマンドを実行し直せば良いので大丈夫。

certbotは、大体において、成功するとCongratulations!と表示される。失敗すると、エラーが報告されたと言われる。

```shell:
IMPORTANT NOTES:
 - Congratulations! ...
 - または
 - The following errors were reported by the server:
```

Congratulationsになったら、apache2設定(/etc/apache2/sites-enabled/000-default-le-ssl.conf)を変更してお好みに調整する。

最近は``certbot renew``を定期的に実行すればいいらしいですが、試してません。