はじめに
こちらの記事で同様の内容を記載していましたが、サーバの選定が不適切でした。RHEL(Red Hat Enterprise Linux release) 8.10 (Ootpa)のテストサーバとして利用するつもりで、CentOS Linux 7を利用していましたが、RHEL8とCentOS7だと構成が大きく異なるため不適切でした。前回記事の最後に、エラーが出たのも古いCentOS7を使用していたからかもしれません。そこで今回は、Rocky Linux 8を利用したいと思います。Rocky LinuxはCentOS 8のサポート終了を受けて誕生した、Red Hat Enterprise Linux (RHEL)と完全互換性を持つオープンソースのディストリビューションです。
使用したコードはこちらにあります。
レンタルサーバ環境
今回も、KAGOYAさんのVPSをレンタルすることにしました。
OS: Rocky Linux 8
メモリ: 1GB
ストレージ: 25GB SSD
node version: v16.20.2 ※nvmで管理
npm version: 8.19.4
サーバへの接続
まずは、kagoyaさんのページでログイン用認証キーを取得します。その後、以下のようにすると、サーバへ接続出来ます。
ssh -i ~/.ssh/ログイン用認証キー番号.key root@サーバIPアドレス
オプションの-iは、「接続に使用する公開鍵ファイルを指定する」ものです。
公開鍵を作成したユーザの下のフォルダに以下のように置くことで、sshで接続ができるようになりました。
~/.ssh/authorized_keys
具体的には以下です。
ssh -i ~/.ssh/ログイン用認証キー番号.key ユーザ名@サーバIPアドレス
鍵ファイルの権限についても600(所有者のみが読み書き可能)と設定しました。
chmod 600 ~/.ssh/authorized_keys
サーバへのファイルコピー
サーバへのファイルコピーは以下のコマンドを実行します。
scp -i ~/.ssh/ログイン用認証キー番.key -r ~/コピー元フォルダ root@サーバIPアドレス:~/
FTP設定
サーバにFTP接続するために、FTP接続を待ち受けているデーモンの一つである「vsftpd」をサーバにインストールしました。こちらのサイトを参考にしました。さらに、ファイアウォールの設定を行いました。ポート21は自動的に開放されたようです。コマンドライン上での接続が成功しました。
次にFTP接続するために、ユーザー名とパスワードを設定しました。
以下のコマンドでユーザーを作成します。
adduser newusername
以下のコマンドでパスワードを設定します。
passwd newusername
こちらのサイトも参考にしました。
FileZillaでもうまくいきました。
nvmのインストール
サーバにnvmをインストールしました。
インストール方法はgithubの公式サイトを参考にしました。
以下のコマンドでインストール出来ました。
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
インストール後にnvmコマンドが見つからないというメッセージが出る場合には、ターミナルを再起動するか、bash環境においては以下のコマンドを実行すると正常にnvmコマンドが使用できます。
source ~/.bashrc
node.jsのインストール
nvmを利用して、開発環境のホスティングサーバに合わせて
node version: v16.20.2
をインストールします。
以下のコマンドでインストール出来るはずですが、tarコマンドがシステムにインストールされていないというエラーが発生しました。
nvm install v16.20.2
そのため、まずは以下のコマンドでtarコマンドをインストールします。
sudo yum install -y tar
しかし、またもやエラーが発生しました。現在のユーザがsudo権限を持っていないというエラーです。
rootユーザーでサーバにログインし直して、以下のコマンドを実行して、sudoersファイルを編集します。
visudo
ファイルの最後に以下の記述を加えました。これで記載のユーザ名はsudo権限を持つはずです。
ユーザ名 ALL=(ALL) ALL
再度、ユーザでサーバにログインし直して、tarコマンドをインストールしました。今度はうまくいきました。
次に、node.jsをインストールします。こちらもうまくいきました。
npmのバージョンは8.19.4がインストールされています。
モジュールのインストール
以下のようにしてモジュールをインストールします。
npm install config express cors morgan winston winston-daily-rotate-file @mapbox/mbtiles spdy hjson hh-mm-ss
静的フォルダからベクトルタイルを配信
node app0.js
とするとエラーは発生はしないのですが、
http://サーバのIPアドレス:3000/
としても、ページが表示されません。どうやらサーバでポート3000を開放していないことが原因のようなので、開放しました。
sudo firewall-cmd --list-ports // 開放されたポートの確認
sudo firewall-cmd --add-port=3000/tcp --permanent // ポート3000を開放
sudo firewall-cmd --reload // 変更を反映させるためにファイアウォールを再読み込み
しかし、これでもウェブサイトは表示されません。
→後から試すと、なぜかうまく表示されました。
作成したユーザではうまく表示されないのかもしれないと思い、rootユーザとしてファイルをコピーするところから再度試してみました。そうするとなぜかウェブサイトは表示され、地図も表示されました。権限の問題などで作成したユーザではうまく表示されなかったのかもしれません。
MBTilesファイルからベクトルタイルを配信
node app.js
とすることで、こちらも地図が表示されました。
以前の記事でsqlite3のバージョンについての注意事項について記載しましたが、今回はバージョンを意識しなくてもうまくいきました。やはり前回のエラーは、CentOSのバージョン7を利用していたことによるエラーのようです。今回は、node_modulesフォルダのsqlite3はバージョン5.1.7となっていました。
httpからhttpsにする
Let's Encryptを利用したSSLサーバー証明書の入手
作業し始めた時には、すでに取得したSSLサーバー証明書に現在のドメインを追加する方法を考えていましたが、エラーが発生してどうすることも出来なかったので、以前のVPSのサーバ(インスタンス)は全て削除し、再度新しいサーバを作成して、新たに証明書を取得することにしました。
Nginxのインストール
こちらのページの方法を利用しようと思いましたが、まずはNginxのインストールが必要なようなので、インストールします。
こちらのNginxのページにインストール方法がありましたので、以下のコマンドを実行します。
sudo yum install epel-release
sudo yum update
sudo yum install nginx
sudo nginx -v
nginx version: nginx/1.14.1
がインストール出来ました。
こちらのページにNginxの起動方法が記載されていました。
sudo systemctl start nginx
sudo systemctl enable nginx
とします。
その後、
http://サーバIPアドレス
としても、Nginxのウェルカムページが表示されませんでした。
こちらのページのトラブルシューティングを試してみました。Webサーバ上から接続出来ましたが、外からは出来ないのでファイアウォールが原因のようです。以下のコマンドでポート80へのアクセスを有効にします。
sudo firewall-cmd --add-port=80/tcp --permanent
sudo firewall-cmd --reload
無事にNginxのウェルカムページが表示されました。
Certbotを利用したSSLサーバー証明書の入手
こちらのcertbotのページ
に沿って作業をします。
snapdのインストール
snapとはパッケージ管理システムで、snapdとはそのデーモンです。snapdは、Snapパッケージのインストールや管理を行うためのインターフェースを提供します。
私はこちらのrocky linuxのページのインストールを実行しました。
Certbotのインストール
次に以下のようにしてCertbotをインストールします。
sudo snap install --classic certbot
Certbotコマンドを実行するために以下を実施
sudo ln -s /snap/bin/certbot /usr/bin/certbot
証明書入手
証明書入手のためのコマンドを実施
sudo certbot --nginx
表示に従ってドメイン名などを入力すると証明書が無事に発行されました。以下に保存されています。
Certificate is saved at:
/etc/letsencrypt/live/ドメイン名/fullchain.pem
Key is saved at:
/etc/letsencrypt/live/ドメイン名/privkey.pem
証明書の自動更新も行ってくれるようです。
https://ドメイン名
とするとサイトが表示されました。
証明書の場所変更
前回の記事に記載したとおり、以下の場所にコピーしました。cert.pemは名前も変更しています。
privkeyPath: ./key/privkey.pem
fullchainPath: ./key/cert.pem
node appHttps.js
を実行します。
HTTPSでの地図表示
index.htmlのページからHTTPSのページに飛ぶことが出来ました。なぜか最初はうまくベクトルタイルが表示されませんでしたが、再度ページを読み込むと表示されました。挙動が不安定な気がします。何度も読み込む5回に1回くらい成功します。
結局は、作成したユーザでも地図は表示されましたが、引き続きは挙動は不安定です。
以下のスクリーンショットのように、「(failed)net::ERR_HTTP2_PROTOCOL_ERROR」というエラーメッセージが出ます。
chromeで実験していましたが、Edgeでやってみるとなぜかエラーが出ませんでした。
chatGPTに聞いてみたところ、HTTP/2の仕様の実装の違いや、SSL/TLSの設定の不整合があるかもしれないとのことでした。
まとめ
自分なりに試行錯誤で行った過程を記録しました。Nginxのインストールも行いましたが、本当にインストールが必要だったかどうかなど、疑問点も多く今後もネットワーク関係について勉強していきたいと思います。
Reference