新規 NGINX サーバがホストの定義ファイル読み込まない問題を解決

Oracle Cloud Infrastructure (OCI) の Cloud Free Tier に含まれる、無期限の無料 AMD サーバインスタンスにウェブサーバを立てようと調べたところ、少ない CPU とメモリでは Apache より NGINX の方がまだなんとかなりそうな雰囲気だったので、Ubuntu 22.04 + NGINX の構成で行くことにしました。いじってみると大まかにやることは Apache 2 とほぼ同じなので安心していたところ、Let’s Encrypt の証明書のインストールでハマったので、内容を残しておきます。まぁ実際はホストの設定が読み込まれないという NGINX だけの問題だったのですけど。なのでおそらくこの記事が役に立つという人は、独学で NGINX サーバを構築し始めた人だろうと思います。

環境

NGINX は公式の手順に従って最新の Stable バージョンをインストールしています。だからハマった、という事かもしれません。とりあえずバージョン一式はこんな感じです:

# uname -a
Linux ubuntu22-04 6.8.0-1018-oracle #19~22.04.1-Ubuntu SMP Mon Dec  9 23:57:57 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
# nginx -v
nginx version: nginx/1.26.2
# certbot --version
certbot 1.21.0

不具合の内容

OCI 側の Ingress Rules と Ubuntu の ufw で TCP 80 と 443 を開け、NGINX をインストールして開始すると、デフォルトのページは IP アドレスの指定で外からでも見られるようになりました。ここまでは順調です。その後、独自ドメインを使った簡単なウェブページがみられるようにしたところでハマりました。

DNS に A レコードを追加して、ドキュメントルートに index.html 置いて、 /etc/nginx/sites-available にホストの設定ファイルを書き、sites-enabled にシンボリックリンクを作って、nginx をリスタートして、みたいな手順はほぼ Apache 2 と同じなのでささーっと進められたのですが、ローカルからアクセスしても作ったページが開きません。サーバ上でcurl -H "Host: web.peddals.com" http://localhost"を実行しても、Nginx デフォルトの HTML が表示されるだけです。

ボクが所有するドメイン peddasl.com は HSTS preload の設定がしてあり、サブドメインも対象にしています。なので、全てのウェブアクセスは自動的にセキュアな HTTPS に切り替わります。考えてみればホストの設定ファイルには非セキュアな 80版ポートの指定しか書いていなかったので、あぁそれか、と。で、調べてみると Let’s Encrypt のcertbotが自動的に設定ファイルを HTTPS に書き換えてくれるようなので、とりあえず証明書をインストールしてみました。そしてここでエラーが発生します。検索で引っかかるように、実行結果をほぼそのまま載せておきます:

# apt install certbot python3-certbot-nginx
(インストールログ省略)
# certbot --nginx -d web.peddals.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel): xxx@email.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.4-April-3-2024.pdf. You must agree in
order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N
Account registered.
Requesting a certificate for web.peddals.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/web.peddals.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/web.peddals.com/privkey.pem
This certificate expires on 2025-04-01.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Could not install certificate

NEXT STEPS:
- The certificate was saved, but could not be installed (installer: nginx). After fixing the error shown below, try installing it again by running:
certbot install --cert-name web.peddals.com

Could not automatically find a matching server block for web.peddals.com. Set the `server_name` directive to use the Nginx installer.
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.

証明書 (Certificate) の保存はできたけど、対象の web.peddals.com のサーバブロックが見つからなかったのでインストールできなかった、修正してからcertbot install --cert-name web.peddals.comを実行して、ということです。何度もホストの設定ファイルを見直したり作り直したり nginx サービスを restart したりreload したり、nginx をアンインストールして再度インストールしたりしても直らず、Qwen2.5 Coder 32B とチャットを繰り返してやっと解決できました。nginx -Tにホストの設定内容が表示されない、これがポイントです。

解決方法

エラーの類いが何も無かったので苦労しましたが、結論としては、/etc/nginx/nginx.conf ファイルに /etc/nginx/sites-enabled/* が書かれていなかったため、そもそも追加したホストの設定が読み込まれていなかったというのが原因でした。なぜそうなのか、という根本原因までは深追いしていませんのであしからず。おそらく普通にapt install nginxで Ubuntu 公式リポジトリからインストールすれば発生しないんじゃないかと思います。

NGINX サーバでホストの設定が読み込まれないという不具合で困っている場合は、以下をお試しください。Let’s Encrypt のインストールも正常に完了します。

1. nginx -Tでホストの設定が表示されない事を確認

2. grep sites-enabled /etc/nginx/nginx.confで何も表示されない事を確認

3. /etc/nginx/nginx.confhttpブロックに/etc/nginx/sites-enabled/*;を書き加える (ハイライトした 32行目)


user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

4. systemctl restart nginxでサービスを再起動

Let’s Encrypt によるホスト定義ファイルの変更ビフォー&アフター

用途によって色々変更や書き加えることがあるでしょうが、HTTP を HTTPS にしてくれて、インストールログを見る限り更新も自動でやってくれるみたいなので、なんか助かりますね。本番でやる場合は、certbot を実行する前に念のためオリジナルの定義ファイルをバックアップしておくのが良いと思います。

オリジナル:

server {
    listen 80;
    server_name web.peddals.com;

    location / {
        root /var/www/web.peddals.com;
        index index.html index.htm;
    }

    error_page 404 /404.html;
    location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    }
}

Let’s Encrypt による書き換え後:

server {
    server_name web.peddals.com;

    location / {
        root /var/www/web.peddals.com;
        index index.html;
    }

    error_page 404 /404.html;
    location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/web.peddals.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/web.peddals.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = web.peddals.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    server_name web.peddals.com;
    return 404; # managed by Certbot


}

そういえばこんなニュースがありましたね

Gigazine さんの ↓ の記事を読んでいたので、若干警戒 (?) していた NGINX ですが、今回ついにいじり初めました。

NGINXのコア開発者が親会社と決別、新たに「freenginx」という名前でフォーク版を作成開始 https://gigazine.net/news/20240215-freenginx

ネガティブな動きが無い限りは、当面 NGINX を使い続けてみようかと思います。

Image by Stable Diffusion (Mochi Diffusion)

ウェブで躍動するエンジン!を思い描いて、自動車なんかのエンジンぽいものを期待していたんですが、どちらかというとギアで構成された装置が多く生成されました。ま、こんなもんでしょ。

Date:
2025年1月2日 18:59:00

Model:
realisticVision-v51VAE_original_768x512_cn

Size:
768 x 512

Include in Image:
mechanical machine’s engine floating on world wide web

Exclude from Image:

Seed:
3347794983

Steps:
20

Guidance Scale:
20.0

Scheduler:
DPM-Solver++

ML Compute Unit:
CPU & GPU

Oracle Cloud の MFA リセット方法

しばらくぶりに OCI (Oracle Cloud Infrastructure) にログインしようとしたところ、MFA のパスコードで入れない。何度か試すとアカウントがロックされる。パスワードの再設定とアカウントのロック解除はできるが、MFA のコードだけはトップ画像の通り「無効なパスコード」といって受け付けてくれない。という状況に陥り、サポートの方々のご協力で無事 MFA のリセットができました。公式・非公式ともにあまり役立つ情報がみつからなかったので、まとめておきます。スマホの機種変更をした、バイパスコードは手元にない、他にアドミンユーザはいない、というときに必要な手順になります。ちなみにボクは Free Tier の利用ですので、有償サービスを契約していなくても使えます。

必要なもの

手元に準備しておいてください。

  • ウェブブラウザのウィンドウかタブ 2枚 (チャット用とログインテスト用)
  • 何らかの Authenticator アプリをインストールしたスマホ (ボクは Microsoft Authenticator)
  • Tenancy name (= クラウド・アカウント名)
  • Email address (登録に使用したメールアドレス)
  • Phone number (登録に使用した電話番号)
  • Last 4 digits of credit card (登録に使用したクレジットカードの下 4桁)
  • Expiery date (登録に使用したクレジットカードの有効期限 (月/年))
  • 多少の英語力
  • (サポート ID (CSI番号) は不要でした)

製品別サポート窓口

一応。金曜日の 21:30 頃フリーダイヤルへかけたら、日本人の方が対応くださいました。が、解決できなかったので、今回のケースではすっ飛ばしてかまわないでしょう。

https://www.oracle.com/jp/support/support-services-list

まず自力で試してみること

ボクのケースでは解決に至りませんでしたが、ChatBot で紹介されたのでまずはこちらを試してみても良いかもしれません。でもこれができたら結構脆弱な感じがしちゃうけどどうなんでしょう。

1) 以下 URL にアクセス

https://www.oracle.com/jp/cloud/sign-in.html

2) クラウド・アカウント名を入力して次に進む

3) ユーザ名 (メールアドレス) とパスワードを入力するページの URL を以下例のように編集して開く (太字部分を書き換え)

元の URL 例:

https://idcs-1234abcd5678efgh1234abcd5678efgh.identity.oraclecloud.com/ui/v1/signin

変更後例:

https://idcs-1234abcd5678efgh1234abcd5678efgh.identity.oraclecloud.com/ui/v1/myconsole?root=my-info&my-info=my_profile_security

4) うまくいくと、バイパスコードを表示できたりするらしいので、それを使用して MFA をパスする

【解決方法】チャットでサポートに MFA のリセットをお願いする

解決方法です。英語でサポートの方と直接チャットをして MFA をリセットしてもらいます。

1) 以下 URL へアクセス

https://www.oracle.com/cloud

2) 右下の Talk to sales をクリックして Chat now をクリック

3) Oracle Chatbot が開くので、Get Support → Cloud Infrastructure (OCI) including Free Trial をクリック

4) 下の方の Cloud Support Chat をクリック

5) Live Chat が開くので、国選択、メアド入力、最初の問い合わせ内容を選び、privacy term にチェックを入れたら Start chat をクリック

6) おそらく順番待ちのキューに入るので、担当の方が現れたら MFA のリセットをお願いしましょう。「please reset my MFA. I just replaced my mobile.」とでも書いて、後は要求に応える形で上に書いた「必要なもの」をつど提供します

7) MFA のリセットが行われたら、チャットを終了する前に Authenticator アプリに登録し、ログインできるか試しましょう。目の細かい 2D コードは Oracle Authenticator アプリ以外では多分使えないので、下にあるチェックボックス「オフライン・モードまたは別のオーセンティケータ」で他のアプリ用の QR コードを表示し、アプリから読み込んで登録します

OCI ログインURL: https://www.oracle.com/jp/cloud/sign-in.html

8) 無事 Authenticator が登録でき、MFA でログインできたらチャットにお礼を書き、アンケートに答えましょう

【重要・追加作業】バイパスコードの取得

今回のような不測の状況を避けるには、バイパスコードの取得が必要です。以下、その手順となります。バイパスコードは機種変したとき等に MFA のパスコードの代わりに入力するものです。一度使用すると使えなくなりますので、使った後は同じ手順で作り直して安全な方法で保管しておきましょう。

1) ログイン後、右上のアイコンから My profile をクリック

2) 自分の名前の下にある Security をクリック

3) Bypass codes の枠の中の Generate をクリックして生成し、コピーする (下の例はすでに 1つ生成した状態)。生成時にコピーを忘れた場合は、目のアイコンクリックで再表示できます

バイパスコードでログインする方法

パスワードを入れた後、パスコードを入力する画面で一番下の「かわりのログイン方法を表示」をクリックすると、バイパス・コードボタンが表示されます。そちらをクリックすると表示される「2ステップ検証」でバイパスコードの入力ができます。

おまけ (怖い話)

今回のトップ画像は、MFA のリセット後、無事 Authenticator アプリでログインできる状態になってから撮ったスクリーンショットになります。画像を加工しているときに気がついたのですが、おかしな部分があったので矢印を付けました。ボク以外の人にはわからないんですけど、今回 MFA の設定は 2回目なのに、Phone のサフィックスが -3 になっています。MFA が失敗していたとき、そこは Phone-1 でした。つまり、ボクの知らないスマホで MFA の登録が行われていた。。。?

この記事をここまで読んだあなた、Phone のサフィックスは正しいですか?

© Peddals.com