異なるサブドメインとポートを受け入れるように nginx サーバーを構成するにはどうすればよいでしょうか?

異なるサブドメインとポートを受け入れるように nginx サーバーを構成するにはどうすればよいでしょうか?

Ubuntu/Nginx でサーバーを実行しています。異なる内部ポートからサブドメインを実行しています。1 つのアプリケーションを一般に公開したいのですが、それをドメイン/サーバー名に関連付けたくありません。

以下は私の設定ファイルです:

server {
    server_name app.example.com www.app.example.com;
    access_log /home/hub-app/logs/app.example.com.access.log;
    
    location / {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8082;
        proxy_redirect off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';      
        proxy_cache_bypass $http_upgrade;       
        proxy_http_version 1.1;     
        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; 
    }

    listen 443 ssl; 
    ssl_certificate /etc/letsencrypt/live/app.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;


}   

server {
    server_name example.com www.example.com;
    access_log /home/hub-public/logs/example.com.access.log;
    
    location / {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8081;
        proxy_redirect off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';      
        proxy_cache_bypass $http_upgrade;       
        proxy_http_version 1.1;     
        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; 
    }

    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; 
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 

}

上記はうまく機能し、指定されたドメイン、つまりexample.comとapp.example.comを指しています。次に、MY_PUBLIC_IP:8080で実行する別の仮想サーバーを追加したいと思います。ポート8080は他のドメインではアクセスできないようにする必要があります。example.com:8080/app.example.com:8080利用できないはずです。

答え1

を使用できますdefault_server

Nginx はそのサーバーをデフォルト サーバーとして宣言します。その後、HTTP ホスト ヘッダーが他のサーバー ブロックと一致しない場合、Nginx はデフォルト サーバーを使用してリクエストを処理します。

Nginxのdefault_serverとは何か

例:

server {
    listen 8080 default_server;
    
    root /www/default;
        
    location / {
        index index.html;
    }
}


私はこれを使ってスキャナーボットをハニーポットし、phpAdmin やそれに似たものを探しているボットにうんち絵文字を流しています :)

答え2

@Klamberextの回答は質問に対する本当の答えではないと思います。つまり、nginxウェブサーバーにはデフォルトサーバーコンセプト。このテーマに関する公式ドキュメント ページは、こちらにあります。nginxがリクエストを処理する方法ただし、ネットワーク インターフェイス/ポートの組み合わせでリッスンしているサーバー ブロックの 1 つが、常に既定のサーバー ブロックとして機能します。そのサーバー ブロックを明示的に指定しない場合は、構成内の最初のサーバー ブロックになります。つまり、行を含むサーバー ブロックは、server_name app.example.com www.app.example.com;443 TCP ポートで受信されるすべての要求の既定のサーバー ブロックとなり、HTTPHostヘッダーが一致しない要求example.comwww.example.com(またはヘッダーがまったくない要求にもHost) 対応します。

Host@Klamberext がすでに述べているように、一般的な方法は、HTTP ヘッダーがどのドメインとも一致しないすべてのリクエストをキャッチするスタブ サーバー ブロックを定義することです。例は次の URL で確認できます。これ答えはこうです。通常、このようなサーバー ブロックには、return 444;接続をすぐに閉じるための特別な nginx 戻りコードであるステートメントが含まれています。ただし、反対のことが必要なようで、それを実現するには 2 つのサーバー ブロックが必要になります。すでに述べたように、TCP ポート 8080 でリッスンしている単一のサーバー ブロックは、ヘッダーが何にHost設定されていても、デフォルトのサーバー ブロックとして機能するためです。

server {
    listen 8080;
    server_name example.com www.example.com app.example.com www.app.example.com;
    return 444;
}
server {
    listen 8080 default_server;
    ... your config here
}

代わりに、Hostサーバー ブロック内のヘッダー値をチェックして、たとえばexample.comドメインとそのサブドメインをブロックすることもできます。

server {
    listen 8080;
    if ($http_host ~ \.?example\.com$) { return 444; }
    ... your config here
}

関連情報