HTTP/3 で 1 つの IP で複数のドメインをリッスンできますか?

HTTP/3 で 1 つの IP で複数のドメインをリッスンできますか?

私は NGINX を使用しています。1 つの HTTP/3 ポートに複数のドメインを設定すると、NGINX でエラーが発生することがわかりました。

    server {
        listen 443 http3 reuseport;
        listen 443 ssl http2;
        server_name FIRST_DOMAIN;
        ssl_certificate     /etc/letsencrypt-ecdsa/live/FIRST_DOMAIN/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt-ecdsa/live/FIRST_DOMAIN/privkey.pem;
        ssl_protocols       TLSv1.3;

        return 301 https://SECOND_DOMAIN$request_uri;
    }

    server {
        listen 443 http3 reuseport;
        listen 443 ssl http2;
        server_name SECOND_DOMAIN default;
        ssl_certificate     /etc/letsencrypt-ecdsa/live/SECOND_DOMAIN/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt-ecdsa/live/SECOND_DOMAIN/privkey.pem;
        ssl_protocols       TLSv1.3;

        add_header Alt-Svc 'h3=":443"; ma=86400';

        location / {
            proxy_pass http://host.docker.internal:10002/;
            proxy_set_header  Host              $http_host;
            proxy_set_header  X-Real-IP         $remote_addr;
            proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
            proxy_set_header  X-Forwarded-Proto $scheme;
        }
    }
nginx: [emerg] duplicate listen options for 0.0.0.0:443 in /etc/nginx/nginx.conf:35

HTTP/3 で 1 つの IP で複数のドメインをリッスンできますか?

答え1

const express = require('express');

const app = express();

app.get('/', (req, res) => {
    res.send(req.hostname);
});

app.listen(40000);

Node.js express で実験してみました。HTTP/2 を使用すると、ホスト名が出力されます。しかし、HTTP/3 を使用すると、undefined出力されます。これは、HTTP/3 がホスト名を気にしないことを示しています。したがって、1 つの HTTP/3 ポートで複数のドメインを listen することは不可能です。ただし、HTTP/3 ドメインごとに複数のポートを開き、Alt-Svcブラウザーに通知するためのヘッダーを追加することができます。

しかし、私の経験では、Alt-Svcブラウザによっては安定して動作しないようです。そのため、HTTP/3 では 1 つの IP で複数のドメインを安定してリッスンすることはできません。

関連情報