Nginx はサーバー IP を指すドメイン/URL では動作しません

Nginx はサーバー IP を指すドメイン/URL では動作しません

私が設定した設定(下記)は、localhost私のドメインでは機能しますが、機能しません。目標は、外部からポート3000にアクセスすることです。基本認証なので、自分だけがアクセスできるようになります。 に移動すると にlocalhostアップグレードされhttps、認証を完了する必要があり、その後、意図したとおりにポート 3000 が表示されます。ただし、に移動してもapi.example.com認証は求められず、接続はアップグレードされず、 のみが表示されます。ポート 3000 を開いてポート転送を行い、 に移動すると、ポートにアクセスできますが、認証は必要なく、 は使用されず、私の目標はポート転送を回避することです。この構成は の指示によるものなので、何が問題なのかわかりません。なぜこの構成でサブドメインが機能しないのでしょうか?Invalid Host headerapi.example.com:3000https

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

upstream supabase {
    server 127.0.0.1:3000;
}

server {
    listen      80;
    server_name localhost *host IP* api.example.com;
    access_log  off;
    rewrite ^ https://$host$request_uri? permanent;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name localhost *host IP* api.example.com;

    ssl_certificate /etc/api.example.com/fullchain.pem;
    ssl_certificate_key /etc/api.example.com/privkey.pem;

    # STUDIO
    location / {
        auth_basic "Authentication Required";
        auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_set_header Host $host;
        proxy_pass http://supabase;
        proxy_redirect off;
        proxy_set_header Upgrade $http_upgrade;
    }
}

ファイアウォール:

 sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
80/tcp (Nginx HTTP)        ALLOW IN    Anywhere
80                         ALLOW IN    Anywhere
443                        ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
443/tcp                    ALLOW IN    Anywhere
8000                       ALLOW IN    Anywhere
80,443/tcp (Nginx Full)    ALLOW IN    Anywhere
443/tcp (Nginx HTTPS)      ALLOW IN    Anywhere
80/tcp (Nginx HTTP (v6))   ALLOW IN    Anywhere (v6)
80 (v6)                    ALLOW IN    Anywhere (v6)
443 (v6)                   ALLOW IN    Anywhere (v6)
80/tcp (v6)                ALLOW IN    Anywhere (v6)
443/tcp (v6)               ALLOW IN    Anywhere (v6)
8000 (v6)                  ALLOW IN    Anywhere (v6)
80,443/tcp (Nginx Full (v6)) ALLOW IN    Anywhere (v6)
443/tcp (Nginx HTTPS (v6)) ALLOW IN    Anywhere (v6)

答え1

ポート 80 のサーバー ブロックには名前のみがlocalhost構成されています。

server_name localhost;

ここではドメインapi.example.comがありません。そのため、HTTP 経由のそのドメインへのリクエストは、nginx のデフォルト設定のデフォルト サーバー ブロックによってキャプチャされます。

SSL サーバー ブロックで行ったように、ここでドメインを追加します。

server_name localhost api.example.com;

答え2

あなたのDNS名が本当にapi.example.comであるかどうかは疑わしいですが、ここでそれを公開しないのは良い習慣です。ただし、無効なホスト名(つまり、az、0-9、'.'、'-'以外の文字を含むホスト名)を指定した場合、このエラーが発生することが予想されます。これは意図的ではない可能性があります。名前のリストから末尾の';'を省略すると、おそらく同じ結果になります。このようなシナリオでは、nginxは構成ファイルの読み込みを拒否します。いつも適用する前に設定をテストすることをお勧めしますnginx -t。「systemctl reload nginx」では設定に問題があることはわかりません。

関連情報