WebArenaのVPSを使ってMQTTやWebサーバを作ってみる
実験用にインターネット上にWebサーバ、MQTTのbrokerを立ち上げた時のメモです。
VPSにはWebArena Indigoを使いました。
VPSのインスタンスの準備
サービスに登録し、コントロールパネルにログインします。
まず、使用するSSH鍵を生成します。左側のメニューのSSH鍵を選択し、SSH鍵の生成をクリックして作成します。正常に作成が終わると以下のように生成した鍵が表示されます。この鍵を作成知った際に、秘密鍵のファイルが自動でダウンロードされます。秘密鍵は作成時にしかダウンロードできないので注意して保管してください。
次にインスタンスを作成します。左のインスタンスをクリックし、以下の画面を表示させます。
表示されたら、右上にある[インスタンスの作成]をクリックします。
以下のようにOSの種類やVPSの構成を選択する画面が表示されます。今回はUbuntu22.04を選択し、InstanceにはIPv4も使える1vCPU/1GB RAM/20GB SSD/100Mbpsのものを選択しました。
SSH鍵を複数作ってある場合、SSH鍵の選択のところで複数表示されるので、使用するものを選択します。
最後にinstance名を設定し、右下にある[インスタンスの作成]をクリックします。
作成が終わると、以下のように作成されたインスタンスのIPアドレスなどが表示されます。作成された直後はステータスがstoppedになっています。
作成ができたら、選択のプルダウンメニューから「インスタンスの起動」を選択し、インスタンスを起動します。
次にSSHに接続します。TeraTermを使う場合、SSH接続を選択し、秘密鍵を指定して接続します。
デフォルトのSSHポートは22です。
WindowsのTerminalで接続する際にはオプションで秘密鍵を指定します。
ssh ubuntu@(IPアドレス) -i (秘密鍵のファイルのパス)
この時、秘密鍵のファイルの所有者は以下のように使用するユーザーとAdministratorのみにしておかないとPermission Errorが発生して接続できません。
接続の際に使用する初期パスワードはWebArenaのページで確認できます。
ログイン後、管理者権限に入るのは以下のようにします。
sudo su -
ドメインの取得
SSL証明書を使ったりするためにドメインを取得します。Freenomeで無料で登録したかったのですが、システムの障害っぽい事象で登録できなかったのでスタードメインで取得しました。今ならxyzのドメインが1円だったので。
で、ドメインを取得したらDNSのAレコードとAAAレコードをインスタンスに割り当てられたIPアドレスに紐づけます。反映されてDNSで引けるようになるまで72時間ほどかかるようです。
証明書の取得
SSL通信を行うのに必要な証明書を取得します。今回は無料のLet's Encryptを使用します。
まずは証明書を取得するために必要なツールをインストールします。
sudo apt install letsencrypt
インストールが終わったら以下のコマンドを実行し、証明書を取得します。
sudo letsencrypt certonly --standalone -d (ドメイン名)
DNSのAレコードやAAAレコードに反映されていないと取得に失敗します。また、NGINXなどのHTTPサーバが動いていると失敗します。(ポート80を使うので)なので、証明書を取得する前にはHTTPサーバを停止しておきます。
作成された証明書は/etc/letsencrypt/live以下に格納されます。
証明書更新の自動化
Let's Encryptの証明書の有効期限が90日なので、自動で更新する設定を行います。crontabに更新の処理を追加して行います。以下のコマンドを実行し、crontabの設定を編集します。
sudo crontab -e
エディタが開いたら、以下の内容を追記して保存します。
00 02 01 * * sudo systemctl stop nginx; sudo letsencrypt renew; sudo systemctl start nginx
今回は毎月1日の午前2時に更新が行われるように設定しました。ここではnginxを停止し、証明書を更新したのちにnginxを再開しています。この証明書を使うサービスがある場合は、そちらも更新を行います。
HTTPサーバの設定
NGINXのインストール
今回はHTTPサーバにNGINXを使用しますので、以下のコマンドでパッケージを追加します。
sudo apt install nginx
インストールが終わったら、/etc/nginx.confでserver_tokensの設定をoffにします。これでエラー時にnginxのバージョンが表示されなくなります。
NGINXの設定
先ほど取得した証明書を使用するようにnginxの設定を行います。以下のような設定ファイルを作成し、/etc/nginx/site-availableと/etc/nginx/site-enabledに新保リンクリンクを貼っておきます。
server {
server_name (ドメイン名);
location / {
root (HTMLが格納されているルートディレクトリ);
index index.html;
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/(取得の時に使用したドメイン名)/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/(取得の時に使用したドメイン名)/privkey.pem;
}
作成が終わったら適当なファイルを置き、アクセスできるか確認します。
MQTTサーバの設定
今回はBrokerとしてmosquittoを使用します。MQTTS/MQTTS over WebSocket対応とし、ユーザー名とパスワードで認証が必要なように設定します。
mosquittoのインストール
以下のようにしてパッケージを追加します。
sudo apt install mosquitto mosquitto-clients
設定ファイルの修正
/etc/mosquitto/mosquitto.confの内容を修正します。今回はMQTTS(ポート番号8883)とMQTTS Over WebSocket(ポート番号9001)を使用するようし、またユーザー・パスワード認証を行うように設定を行います。修正した設定ファイル(mosquitto.conf)は以下のようになります。
allow_anonymous false
password_file /etc/mosquitto/pwfile
listener 8883 0.0.0.0
cafile /etc/mosquitto/certs/chain.pem
certfile /etc/mosquitto/certs/cert.pem
keyfile /etc/mosquitto/certs/privkey.pem
listener 9001 0.0.0.0
protocol websockets
cafile /etc/mosquitto/certs/chain.pem
certfile /etc/mosquitto/certs/cert.pem
keyfile /etc/mosquitto/certs/privkey.pem
証明書の設定
Let's Encryptで作成された証明書を使用します。そのまま指定できればよかったのですが、アクセス権の問題でうまく読み込めなず、どうにも設定がわからなかったので必要なファイルを/etc/mosquitto以下にコピーして、アクセス権を設定して動作するようになりました。
更新の時にハマりそうなのでもう少し確認が必要です。。。
ユーザー、パスワードの設定
アクセスする際にユーザー名、パスワードを使用するように設定します。
以下のコマンドでユーザー名を指定して実行します。
sudo mosquitto_passwd -c /etc/mosquitto/pwfile (ユーザー名)
パスワードが聞かれるので入力します。-cオプションは最初にユーザーを作成するときだけ必要になります。
次にmosquitto.confに以下の設定を追加し、ユーザー名、パスワードでのログインを有効にします。
allow_anounymous false
password_file /etc/mosquitto/pwfile
設定が終わったらmosquittoのサービスを再起動します。
動作確認
動作を確認します。今回はこちらのアプリを使って動作確認を行いました。
Firewallの設定
外部からのアクセスを制限するためにファイヤーウォールの設定をします。とりあえずWebArena Indigoの管理コンソールで必要なポートのみ接続されるよう設定しました。
以上でVPS上にサーバの構築が行えました。
Discussion