🌟

WebArenaのVPSを使ってMQTTやWebサーバを作ってみる

2024/06/14に公開

実験用にインターネット上に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のページで確認できます。
https://help.arena.ne.jp/hc/ja/articles/360049807634-SSH接続でインスタンスにログインする-Linux

ログイン後、管理者権限に入るのは以下のようにします。

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のサービスを再起動します。

動作確認

動作を確認します。今回はこちらのアプリを使って動作確認を行いました。
https://mqttx.app/

Firewallの設定

外部からのアクセスを制限するためにファイヤーウォールの設定をします。とりあえずWebArena Indigoの管理コンソールで必要なポートのみ接続されるよう設定しました。

以上でVPS上にサーバの構築が行えました。

Discussion