web-dev-qa-db-ja.com

ドメイン名ではなく、server_nameディレクティブでIPアドレスを設定する方法

何らかの理由で、server_nameディレクティブでベアIPアドレスを設定すると、NGINXが機能しません。

server {
    listen 80;
    server_name xx.xx.xxx.xx; # doesn't work

server {
    listen 80;
    server_name ec2-xx-xx-xxx-xx.ap-southeast-2.compute.amazonaws.com; # this works fine

NGINXがIPアドレスを受け入れないのはなぜですか? IPを受け入れるように強制する方法は?

私はドメイン名レジストラー(正確にはnamecheap)でダイナミックDNSを使用しており、パブリックドメイン名をAWS EC2インスタンスにマップする「A」レコードがあります。

enter image description here

example.comに移動すると、EC2インスタンスアプリにリダイレクトされます。しかし、アプリのランディングページではなく、デフォルトのNGINXランディングページが表示されます。 NGINXはリクエストをNode.jsにプロキシしません。

3
Green

IPアドレスの代わりに「example.com」を使用してみましたか?

少なくともApacheでは、server_nameフィールドの目的は、単一のIPアドレスから複数のWebサイト(名前空間)を提供できるようにすることです。 「 http://example.com 」に続くクライアントは、DNSルックアップを実行し、DNSルックアップから取得したIPアドレスにリクエストを送信しますが、リクエストに「example.com」を含めますこれにより、Webサーバー(NGINX)は、リクエストがどのWebサイトに属するかを判別できます。

6
craigster0

構成されているサイトが1つしかない場合は、nginx configでこれを使用してみてください。

server_name _ ;

serverヘッダーの内容に関係なく、HostがすべてのHTTPリクエストを受け入れるように強制します。

5
Pavel Kazhevets

この質問は、server_name宣言の目的の誤解を示しています。サーバー間では、リスニングソケットを作成するインターフェイスのIPアドレスを指定できるのが一般的です。ただし、NGINXでは、server_nameディレクティブを使用してこれを実現することはできません。

Server_nameディレクティブを理解するには、HTTPプロトコルの一部を理解する必要があります。 WebブラウザーがWebサイトにHTTPリクエストを送信すると、たとえば、スタックオーバーフロー https://serverfault.com/questions がトリガーされ、DNSでserverfault.comを検索してIPアドレスを取得します-これがDNSエントリが必要な理由です。

WebブラウザーがIPアドレスを取得すると、そのIPアドレスのポート80へのTCP接続が開きます。Webブラウザーは、要求されているページをWebサーバーに通知する必要があります。これは、 HTTPプロトコルを使用します。リクエストの最初の行は次のようになります。

GET/questions HTTP/1.1

これにより、サーバーにURLパスと、クライアントが通信に使用しているHTTPバージョンが通知されます。

2行目は次のとおりです。

ホスト:serverfault.com

これはHTTPヘッダーと呼ばれ、ホストヘッダーはどのWebサイトが要求を処理する必要があるかをWebサーバーに伝えます。サーバーが単一のWebサイトのみをホストしている場合、これはおそらくやり過ぎだと感じます。しかし、多くの場合、Webサーバーは多くのWebサイトを処理します。

これは、nginxディレクティブserver_nameまで一致します。このディレクティブは、Hostヘッダーがこの文字列と一致する場合にのみこのnginxサイトを使用するようnginxに指示します。

したがって、質問に答えるために、server_nameディレクティブにIPアドレスを設定することは意味がありません。ドメイン名を登録してから、AWSサーバーのDNS名を参照するCNAME DNSエントリを作成するのが一般的です。代替サーバーを起動するときは、新しいサーバーのDNS名を指すようにCNAMEを更新します。

プロのウェブサイトはエラスティックロードバランサーの背後に配置され、DNSエントリで参照できるように一定のDNS名を維持します。

4
Michael Shaw

NGINXは初めてですが、公式ドキュメント( https://nginx.org/en/docs/http/server_names.html )によると、IS許可されています数値のIPアドレスを使用するには:

「誰かがサーバー名ではなくIPアドレスを使用してリクエストを行う場合、「ホスト」リクエストヘッダーフィールドにはIPアドレスが含まれ、リクエストはサーバー名としてIPアドレスを使用して処理できます。

server {
          listen       80;
           server_name  example.org
           www.example.org
           ""
           192.168.1.1
           ;
    ...
}

あなたがあなたのIPアドレスのDNSレコードを管理しているなら、これを行うのは理にかなっています

0
ckapilla