nginxで静的htmlページを独自ドメインで公開できるようにするまでのメモ。

Front Matter CMSとAstroを使って、ローカル環境で記事を書いていく体制は構築できたので、そろそろhtmlによる記事をネットに公開するための準備を進めていきます。
なお、サーバー用PCのOSはUbuntu 22.04です。

nginxをインストールしてオリジナルのhtmlを表示させるまで

とりあえず上記サイトに従って、htmlを公開するために必要なnginxをインストール。

ApacheとNginxについて比較 #nginx - Qiita

apacheとnginxどっちがいいのか迷ったけど、静的ページならばnginxの方が向いているらしいので、こっちで。
それにしても、nginxはエンジンエックスって読むのが正しいらしいんですが、どう見てもエヌジンクスじゃない?

それはさておき、ローカルIPアドレスでhtmlが表示されるところまではできました。
同じPCにはすでにDockerを使って、EPGStationとMirakurunを導入済みなのですが、それらと競合はしませんでした。よかった。

nginxで表示させたいページはvar/www/htmlに保管することになりますが、このフォルダはroot権限がかかっているので、ファイルマネージャーから中身を編集しようにも、一般ユーザーでログインしていると変更できなくて面倒です。
かといって外部に公開するファイルなので、chmodコマンドでパーミッションを777に変更するのは、オールフリーすぎて危険です。

sudo chown -R username:username var/www/html/sample

というわけでchownコマンドで、フォルダ所有者を一般ユーザーに変更しておきました。
パーミッションは755のままなので、所有者とroot以外は中身を変更できないはずです。
chmodとchownは間違いやすいので注意。

次に、独自ドメインで外部からアクセスできるようにします。
あらかじめファイアウォール(ufw)を有効にしておきます。

UbuntuにNginxをインストールしてWebサーバー構築【マルチドメイン】 | ジコログ

上記サイトなどに従って、ufwを起動しつつ外部からのアクセスはnginxだけ許可します。
ポート番号80および443のみ許可したので、今度は独自ドメインにアクセスされたときに、肝心のwebサイトが表示されるようにしたい。

アクセス情報【使用中のIPアドレス確認】

まずは定番の上記のサイトで、わが家のネット回線のグローバルIPアドレスをチェック。

現在ドメインはConohaで契約しているので、Conohaの管理画面を開いてDNS設定に移動。
さっきのIPアドレスをAレコードに登録します。
グローバルIPアドレスはまれに変動するので、できれば対策が必要なのですが、いったんこのままいきます。

(Conohaは管理画面の読み込みが遅すぎるのがつらいので、いずれ移管したい…。結局はGMO系列だということ。良いところはこのはちゃんだけ。)

ルーターの設定画面に入って、80番と443番ポートをTCPのみ開放します。IPアドレスはローカルネットワークのサーバーのものを指定。
当環境ではeo光の専用ルーターを使っています。

ポートチェック【外部からポート開放確認】

上記サイトにて独自ドメインのポートが開放されていることを確認。ひとまず80番はOKでした。
443番はダメって言われてしまいましたが、いったん後回し。

ポート開放ができたところで、nginxの参考サイトの続きに戻り、confファイルを作成してnginxを再起動します。

そしてブラウザから独自ドメインにアクセスすると…あれ?いつまで経ってもアクセスできない。しまいにはタイムアウト。
これはDNS設定の追加が、まだ完全に反映されていないのが原因であり、一時間近く経ったあとにもう一度アクセス。

やっと独自ドメインで、自前のサーバーにアクセスできるようになりました。
ドメインやグローバルIPアドレスの後ろに、80と443以外のポート番号をつけても、他のサービスにはアクセスできないことを確認済み。
ローカルネットワーク専用のシステムに、外部からアクセスされたらたまらないので。

これで記事の公開ができないことはないのですが、SSLがかかっていないので、セキュリティ的に問題です。
今どき、httpから始まるサイトじゃ誰もアクセスしてくれません。httpsでないと。

Ubuntu + nginx + LetsEncryptでSSL/TLSを設定する #Ubuntu - Qiita

とりあえずこれに従ってSSL証明書を取得。
certbot実行時、メールアドレスの入力を求められますが、空にはできないので、とりあえず普段使っているアドレスを入力。
そのあと2つ質問されますが、Y→Nの順に入力。

certbot完了後、nginxのconfは勝手に更新されます。SSLで表示するようにしてくれています。
そしていざサイトにアクセスすると…あれ?またタイムアウトになる。
どうやらしばらく待機が必要だったようで、何分か経ったあとにもう一度アクセスすると、無事にhttpsから始まるアドレスでアクセスできるようになりました。
なお、httpの方にアクセスすると、自動的にhttpsの方にリダイレクトしてくれました。

これで終わり。あとはコンテンツ作成に専念あるのみ。