web-dev-qa-db-ja.com

Nginx:server_nameの重複警告を回避する方法

内部ホスト名と外部ホスト名の両方で利用できるnginxのサイトを提供しています。外部アクセスにhttpsを使用するように強制したいのですが、内部アクセス用にhttpを保持します(これらの内部アドレスの証明書を取得できないため)。

次の構成は私が望むことをします:

#redirect port 80 http to 443 https
server{
    listen 80 default_server;
    listen [::]:80 default_server;
    #just for external access
    server_name hostname.external_domain;
    return 301 https://$Host$request_uri;
}

# serve both http and https internally
server {
    listen 80;
    listen 443 ssl;
    listen [::]:80;
    listen [::]:443 ssl;

    server_name hostname hostname.internal_domain hostname.external_domain;

...

しかし、nginx -tは私に警告を与えます

nginx: [warn] conflicting server name "hostname.external_domain" on 0.0.0.0:80, ignored

このホスト名は両方のサーバー定義で使用されるためです。しかし、そこにある必要があります。そうしないと、httpアクセスの試行またはリダイレクトされた試行をキャッチできません。

hostname.external_domainのポート443のみで、ポート80なしの3番目のサーバー定義を追加し、この名前だけを2番目のサーバーから削除すると、おそらく警告が削除されますが、全体をコピーする必要がありました。サーバーブロックのコンテンツも、冗長だと思います。

より良い解決策はありますか?

2
Chaos_99

オプション1。

3つのserverブロックを使用しますが(質問で述べたように)、重複したコンテンツを別のファイルにオフロードし、includeディレクティブを使用して関連する各serverブロックにプルします。詳細については、 このドキュメント を参照してください。


オプション2。

default_serverにはserver_nameステートメントは必要ありません。ただし、default_serverを他のserverブロックに交換して、最初のserverブロックがより具体的なものになるようにする必要があります。

例えば:

server{
    listen 80;
    listen [::]:80;
    server_name hostname.external_domain;
    return 301 https://$Host$request_uri;
}

server {
    listen 80 default_server;
    listen 443 ssl default_server;
    listen [::]:80 default_server;
    listen [::]:443 ssl default_server;

    ...
}

2番目のserver_blockは、最初のserverブロックが明示的に一致しないものと一致するため、server_nameを使用して一致する必要はありません。

1
Richard Smith