レンタルVPSでWebサーバを公開して、EC2から移行する

2026年2月23日 ~ 25日

■ 日記

 1年間、軍儀のブラウザアプリを公開していた。(https://weblog.2410.dev/2025/01/hunterhunterweb.html)
ちょうどアニメの時期と重なったのか、公開して半年くらいたってから、毎日それなり(0~4ゲームくらい)の利用があったので、なんとなく満足していた。

しかしまあ2026年の2月で、AWSの無料期間が終了した。
無料期間といってもEC2が無料なだけでほかのAWSナントカカントカで毎月100円くらいかかっていたのだが、とにかく無料期間が終わり、月の使用料金が10$を超えた。
10ドル。事前に設定していた金額だ。設定どおり、EC2インスタンスが停止した。
大した利用者数でもないのに2週間たらずで停止したので、このままAWSを使い続けると毎月2000円以上かかるっぽい。

公開当時は1年の無料期間分で運営やめようかな~どうしようかな~とか言っていたんだけれど、ぽつぽつとメンテナンスを続けたり、利用者の様子を見たりしていると愛着がわいたというか、もうすこし続けてみるか、という気になってきた。

なので、別のサーバに移行することにした。
新居はConohaのVPSだ。32,476円/36カ月! 試用期間もなく突然3年契約なんてしてよかったのか、お金を払ってから不安になってきた。

さくらのVPSを使おうかなと思ったけど、さくらはアカウント作成してクレジットカード登録した後に「実は、お前が契約しようとしてるプランはOSに制限があるんだよね」と後出しされた。後出しは許さない。怒りのアカウント削除だ。

■ ConohaのVPS

「コンソール」からブラウザコンソールが立ち上がるので、Linuxの様子を適当に見る。
ssh環境を整えたら、ブラウザコンソールは使いづらいので手元のターミナルからsshする。

ConohaのVPSのインスタンス画面

「コンソール」からブラウザコンソールが立ち上がるので、Linuxの様子を適当に見る。
ssh環境を整えたら、ブラウザコンソールは使いづらいので手元のターミナルからsshする。

nginxをインストールして、/var/wwwとかにindex.htmlを設置して、配布されたIPアドレスにアクセス。
なにも取得できないというか、アクセスがコケることを確認する(なんか失敗した?)。

■ ドメイン紐づけ

ドメインはGoogle domainsで契約していたから、今はSquarespaceが管理している。
Squarespaceにログインして、DNS設定を見直す。

AWSのDNSサーバに紐づけていたNSレコードを削除して、ConohaのDNSサーバに紐づけたNSレコードを作成する。
SquarespaceのDNS管理画面

Conoha側でも、ドメインリストに2410.devを追加して、Aレコードにgungiを追加する。



これでしばらく待って、gungi.2410.devで163.44.118.110にアクセスするようなっているか確認する。
Conohaは3600だから多分1時間で更新されるのかな?
Squarespaceでは4時間となっている。3600は小さい気がするから、サーバに対するアクセス回数を減らす意味で18000に設定。
この日はこれで寝た。

1日待ってから確認したところ、
$ ping gungi.2410.dev
PING gungi.2410.dev (163.44.118.110) 56(84) bytes of data.
pingは通らないが、名前解決は期待通りになっていた。

■ NGINX (HTTP)

EC2のnginx.confを持ってきてもうまく動かない。
あれ?と思ってデフォルトに戻したけどやっぱり動かない。

$ sudo systemctl restart nginx

で動くんじゃなかったの?

$ curl 163.44.118.110
curl: (7) Failed to connect to 163.44.118.110 port 80 after 27 ms: Connection refused

pingも通らない。

$ nc -zv 163.44.118.110 80
nc: connect to 163.44.118.110 port 80 (tcp) failed: Connection refused

Conoha側では443番ポートも80番ポートも開けたつもりだし…。

ここを参考にしてみる。
https://webmanual.doc778.com/learning/development/11647

ufwでファイアウォールを確認

$ sudo ufw status
Status: active
To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

sshしか通してないじゃん!
80番ポートを開ける。

$ sudo ufw default deny incoming \
&& sudo ufw default allow outgoing \
&& sudo ufw allow 22/tcp \
&& sudo ufw allow 80/tcp \
&& sudo ufw enable \
&& sudo ufw status verbose
$ sudo ufw status
Status: active
To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
22/tcp                     ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
22/tcp (v6)                ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)

/etc/nginx/nginx.confに、httpの設定を追加して、curlが成功した。

■ SSL証明書発行

https://qiita.com/Kuroi_Cc/items/ec2e9b9e20b268f0d155

nginx.confのhttp部分に

location /.well-known/acme-challenge/ {
        root /usr/share/nginx/html/_letsencrypt;
}

を追加。

server {
                listen 80;
                server_name gungi.2410.dev;
                root /var/www/nginx;
                index index.html;
                location / {
                        try_files $uri $uri/ =404;
                }
                location /.well-known/acme-challenge/ {
                        root /usr/share/nginx/html/_letsencrypt;
                }
        }

$ sudo nginx -tでnginx.confに問題がないか確認する。

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

successfulが出ている。

nginxを再起動。

$ sudo systemctl restart nginx

準備ができたはずなので、certbotを実行する。
certbotでのSSL証明書更新には回数制限だかなにかがあるので、--dry-runオプションをつけて問題がないか確認する。

$ sudo certbot certonly --webroot --dry-run
:
space separated) (Enter 'c' to cancel): gungi.2410.dev
Simulating a certificate request for gungi.2410.dev
Input the webroot for gungi.2410.dev: (Enter 'c' to cancel): _letsencrypt

Certbot failed to authenticate some domains (authenticator: webroot). The Certificate Authority reported these problems:
  Domain: gungi.2410.dev
  Type:   unauthorized
  Detail: 163.44.118.110: Invalid response from http://gungi.2410.dev/.well-known/acme-challenge/XXXXXXXX_XXXXXXXX: 404

Hint: The Certificate Authority failed to download the temporary challenge files created by Certbot. Ensure that the listed domains serve their content from the provided --webroot-path/-w and that files created there can be downloaded from the internet.

Some challenges have failed.
Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details.

certbotの実行に失敗した。
あれ??

参考サイトを再度確認し、nginx.confのserver{以下をコピペしなおして見返す。

location /.well-known/acme-challenge/ {
                        root /usr/share/nginx/html/_letsencrypt;
                }

ここのlocationは自分の環境に合わせて修正しないといけなかった。
今回は/var/www以下で公開しているので、root /var/www....に修正。

$ sudo certbot certonly --webroot --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log
:
space separated) (Enter 'c' to cancel): gungi.2410.dev
Simulating a certificate request for gungi.2410.dev
Input the webroot for gungi.2410.dev: (Enter 'c' to cancel): _letsencrypt
The dry run was successful.

certbotの--dry-runに成功した。
--dry-runを外して、正式に実行する。
メールアドレスがどうとか、規約に同意を求められたりするので指示に従う。
Successfullyと表示されて無事更新に成功した。

■ NGINX (HTTPS)

SSL証明書の発行が完了したので、nginx.confを書き換えてhttpsに対応できるようにする。
証明書の手続きを行わないままだと、以降元からnginxをコピペしてもうまくいかない。
http通信はhttpsにリダイレクトする設定にしていたので、動作確認などでロックが発生した。(http通信じゃないと動作確認できない → http通信はhttpsにリダイレクトする → 証明書がないのでhttps通信ができない → 当然http通信も止まる)

でもcertbot実行成功後、ふと疑問に思ったけど、certbotは80番ポートでhttp通信しないといけないはずだから、nginx.confをコピペしただけで動くべきなのでは……?
ロックじゃなくてファイアウォールの問題だったのかもしれない。

EC2で動かしていたnginxのconfファイルをコピペして$ sudo nginx -t
正常に動きそうだということを確認して、$ sudo systemctl restart nginxできた。

しかしhttpsでアクセスしようとするとブラウザでは「接続がタイムアウトしました」が表示されてサーバにアクセスできない。

■ ファイアウォール

上記のuwsの設定だと、443portを開放していなかった。
EC2でどのように設定していたか確認する。

EC2@$ sudo ufw status
Status: active
To                         Action      From
--                         ------      ----
Nginx HTTP                 ALLOW       Anywhere
Nginx HTTPS                ALLOW       Anywhere
22                         LIMIT       Anywhere
Nginx HTTP (v6)            ALLOW       Anywhere (v6)
Nginx HTTPS (v6)           ALLOW       Anywhere (v6)
22 (v6)                    LIMIT       Anywhere (v6)

なんだっけコレ。
EC2のとき参考にした記事 https://qiita.com/shimakaze_soft/items/c3cce2bfb7d584e1fbceを確認。

$ sudo ufw default DENY
$ sudo ufw allow 22
$ sudo ufw limit 22

sshが途中で切れてもいいように22番portの設定。
不要な設定が残っているので、
$ sudo ufw delete <rule number> 
で重複したり邪魔なルールを削除する。

きれいになったら、引き続き記事を参考にファイアウォールの設定を行う。

$ sudo ufw allow 'Nginx HTTP'
$ sudo ufw allow 'Nginx HTTPS'
$ sudo ufw status
Status: active
To                         Action      From
--                         ------      ----
22                         LIMIT       Anywhere
Nginx HTTP                 ALLOW       Anywhere
Nginx HTTPS                ALLOW       Anywhere
22 (v6)                    LIMIT       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)
Nginx HTTPS (v6)           ALLOW       Anywhere (v6)

EC2環境と同じufw設定になった。

■ HTTPS接続ができない?

$ curl https://gungi.2410.dev
curl: (56) OpenSSL SSL_read: error:0A000126:SSL routines::unexpected eof while reading, errno 0

ファイアウォールにはじかれることはなくなったが、SSLエラーが出ている。
慌てずにnginxを再起動したが効果なし。
そういえばUser-Agentに制限をかけていたんだっけ?
curlをやめてブラウザでアクセスしたけどこれも失敗。

あれ? certbotは成功したんだけど……?
--dry-runを再度実行する。「すでに有効な証明書を発行済みだよ!」というメッセージが出ることを期待したが、なぜか何事もないかのようにdry-runに成功してしまった。
/etc/letsencrypt/live/gungi.2410.dev/以下には、さっき作った証明書が保存されているようだが……?

$openssl version
@ec2$ openssl version
OpenSSL 3.0.13 30 Jan 2024 (Library: OpenSSL 3.0.13 30 Jan 2024)

sslのバージョンは同じ。

$ nginx -v
nginx version: nginx/1.24.0 (Ubuntu)

nginxのバージョンも同じ

ガチャガチャやっていたら、いつの間にかブラウザでのアクセスに成功するようになった。
なんだったんだろう。
特に何もしてない気がするから、キャッシュかなんか引っかかって、時間で解決したのかな……?

ひとまずWebサーバのhttps公開に成功したので、コンテンツを移管する。

■ Websocketサーバ実行環境構築

pythonバージョンの一致確認

$ python3 --version
Python 3.12.3
$ sudo apt install pip
$ python3 -m pip install websockets --break-system-packages
$ python3 -m pip install aioconsole --break-system-packages

■ 検索エンジン最適化(SEO)

AWSのメールを見る限り、2026年の2月20日にインスタンスが止まったっぽい。
ただ、利用者が2月16日以降いないみたいだったから、そのあたりからアクセスに問題があったのではないかと思っている。(たんに利用者がいなくなっただけの可能性もあるが……)

復旧を始めたのが2/23の23時ころで、DNSとか待ったりして、復旧が完了したのが2月25日の1時15分頃。

2月22日時点では「軍儀 web」で検索結果TOPだったのだが、25日時点ではもうgoogleの検索結果から除外されている。

最適化とかは面倒だから、ただ、「表示されなくなっちゃったあ」って言ってるだけなんだけど……。

これも1日くらい待ったら、また検索結果にちょっと出るようになった。

■ サーバの終活

ゲームログ抽出
githubにおいてないファイルの確認(機密情報とか載ってたり、適当に作ったデバッグ用プログラムとかメモtxt)
もう自分で何設定したかわかんないから、新しいサーバの様子見て問題なく動いてそうなら消しちゃっていいことにしようかな。
とりあえずEC2インスタンスは停止して、必要な時だけ起動する形にする。

移行のためにインスタンス再起動させてたけど、実働4~6時間くらいのはずなのに0.6$のコストがかかってるっぽい。すごいぜ。
インスタンス立ててなくても、Route53とか固定IPに???固定費用が掛かるはずだから、2カ月くらいで完全に削除したいね。2か月後の自分に期待。

■ EC2とConoha VPSの比較

契約プランによるから、サービスの比較というよりは、サーバが移行してこうなったよ、くらいのメモ
EC2
@EC2 $ free -h -s 10| awk '{ print strftime("%Y/%m/%d %H:%M:%S"), $0 }'
2026/02/25 02:21:08                total        used        free      shared  buff/cache   available
2026/02/25 02:21:08 Mem:           957Mi       373Mi       165Mi       908Ki       594Mi       583Mi
2026/02/25 02:21:08 Swap:             0B          0B          0B

@EC2 $ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- -------cpu-------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st gu
 2  0      0 169604  47824 560644    0    0   104   122   60    0  0  0 83  0 16  0

Conoha VPS (2GB)

$ free -h -s 10| awk '{ print strftime("%Y/%m/%d %H:%M:%S"), $0 }'
2026/02/25 02:20:58                total        used        free      shared  buff/cache   available
2026/02/25 02:20:58 Mem:           1.9Gi       382Mi       926Mi       1.1Mi       828Mi       1.5Gi
2026/02/25 02:20:58 Swap:          2.0Gi          0B       2.0Gi
$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- -------cpu-------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st gu
 1  0      0 948648  47340 801088    0    0    42    54  326    0  0  0 100  0  0  0

Conohaはこれで月1000円くらいらしい。
利用者規模的にはもっと小さいサイズでもよかったかも。
冷静に考えると、お金払いたくないなあってEC2の無料プランにしたのに、結局月1000円払うのか……なぜ……?
AWSで続けていたら4倍くらいはかかっていただろうと思うとまあいいのかな……?

コメント