[nginx] nginx가 도메인 이름에 응답하는 이유는 무엇입니까?

Ruby / Sinatra 앱으로 nginx를 실행 중이며 모두 잘 작동합니다. 그러나 현재 동일한 서버에서 두 번째 응용 프로그램을 실행하려고하는데 이상한 것이 있습니다. 먼저 내 nginx.conf는 다음과 같습니다.

pid /tmp/nginx.pid;
error_log /tmp/nginx.error.log;

events {
  worker_connections 1024;
  accept_mutex off;
}

http {
  default_type application/octet-stream;
  access_log /tmp/nginx.access.log combined;

  sendfile on;
  tcp_nopush on;
  tcp_nodelay off;

  gzip on;
  gzip_http_version 1.0;
  gzip_proxied any;
  gzip_min_length 500;
  gzip_disable "MSIE [1-6]\.";
  gzip_types text/plain text/xml text/css
             text/comma-separated-values
             text/javascript application/x-javascript
             application/atom+xml;

  upstream app {
    server unix:/var/www/app/tmp/sockets/unicorn.sock fail_timeout=0;
  }

  server {
    listen 80;
    client_max_body_size 4G;
    server_name FAKE.COM;

    keepalive_timeout 5;

    root /var/www/app/public;

    location / {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;

      if (!-f $request_filename) {
        proxy_pass http://app;
        break;
      }
    }

    error_page 500 502 503 504 /500.html;
    location = /500.html {
      root /var/www/app/public;
    }
  }
}
                                                          68,0-1        B

서버가 다른 도메인 이름을 통해 해당 서버에 충돌하는 모든 호스트에 응답 하는 방법 server_nameFAKE.COM유의하십시오. 특정 서버가 요청에 대해서만 응답하도록하려면 FAKE.COM어떻게해야합니까?



답변

nginx 설정의 첫 번째 서버 블록은 특정 서버 블록이없는 서버에 도달하는 모든 요청의 기본값입니다.

구성에서 실제 도메인이 REAL.COM이라고 가정하면 사용자가 입력하면 서버로 확인 되며이 설정에 대한 서버 블록이 없으므로 FAKE.COM의 서버 블록이 첫 번째입니다 서버 블록 (귀하의 경우 서버 블록 만)이 해당 요청을 처리합니다.

이것이 적절한 Nginx 설정이 특정 도메인에 대한 다른 서버를 따르기 전에 기본값에 대한 특정 서버 블록을 갖는 이유입니다.

# Default server
server {
    return 404;
}

server {
    server_name domain_1;
    [...]
}

server {
    server_name domain_2;
    [...]
}

기타

** 편집하다 **

일부 사용자는이 예제에서 약간 혼란스러워 단일 conf 파일 등으로 제한된다고 생각합니다.

위는 OP가 필요에 따라 개발하는 간단한 예입니다.

개인적으로 이와 같이 별도의 vhost conf 파일을 사용합니다 (CentOS / RHEL) :

http {
    [...]
    # Default server
    server {
        return 404;
    }
    # Other servers
    include /etc/nginx/conf.d/*.conf;
}

/etc/nginx/conf.d/ domain_1.conf, domain_2.conf … domain_n.conf를 포함합니다. domain_n.conf는 기본 nginx.conf 파일에서 서버 블록 다음에 포함되며, 항상 첫 번째이며 default_server로 재정의되지 않는 한 항상 기본값입니다. 다른 곳에서 지시하십시오.

이 경우 다른 서버에 대한 conf 파일의 파일 이름의 알파벳 순서는 관련이 없습니다.

또한이 배열은 여러 기본값을 정의 할 수 있다는 점에서 많은 유연성을 제공합니다.

필자의 경우에는 내부 인터페이스에서만 포트 8080을 수신하는 Apache를 사용하고 PHP 및 Perl 스크립트를 Apache로 프록시합니다.

그러나 Apache가 표준 포트 80에서 실행되고 있지 않다는 것을 감지하고 나를 “도움”시키려고 할 때 첨부 된 출력 HTML에서 “: 8080″으로 링크를 반환하는 두 개의 별도 응용 프로그램을 실행합니다.

외부 인터페이스에서 Apache에 도달 할 수없고 링크가 포트 80을 가리켜 야하므로 링크가 유효하지 않은 문제가 발생합니다.

이러한 요청을 리디렉션하기 위해 포트 8080에 대한 기본 서버를 생성하여이 문제를 해결합니다.

http {
    [...]
    # Default server block for undefined domains
    server {
        listen 80;
        return 404;
    }
    # Default server block to redirect Port 8080 for all domains
    server {
        listen my.external.ip.addr:8080;
        return 301 http://$host$request_uri;
    }
    # Other servers
    include /etc/nginx/conf.d/*.conf;
}

일반 서버 블록의 포트 8080에서 수신 대기하는 것이 없으므로 리디렉션 기본 서버 블록은 nginx.conf에서의 위치 때문에 이러한 요청을 투명하게 처리합니다.

실제로 이러한 서버 블록 중 4 개가 있으며 이는 간단한 사용 사례입니다.


답변

catch-all 의 기본 서버가 있어야합니다 . 연결을 닫고 아무것도 반환하지 않는 nginx 특정 HTTP 응답을 404반환하여 전혀 응답하지 않기 위해 반환 하거나 더 나은 대역폭을 절약 할 수 있습니다444

server {
    listen       80  default_server;
    server_name  _; # some invalid name that won't match anything
    return       444;
}


답변

다른 답변으로 문제를 해결할 수 없습니다. 호스트가 일치하는지 확인하고 403을 반환하면 문제가 해결되었습니다. (웹 서버 콘텐츠를 가리키는 임의의 웹 사이트가 있습니다. 검색 순위를 가로 챌 것 같습니다)

server {
    listen 443;
    server_name example.com;

    if ($host != "example.com") {
        return 403;
    }

    ...
}


답변

귀하의 질문에 대답하기 위해-nginx는 일치하는 것이 없으면 첫 번째 서버를 선택합니다. 설명서를 참조하십시오 :

해당 값이 서버 이름과 일치하지 않거나 요청에이 헤더 필드가 전혀 없으면 nginx는이 포트의 기본 서버로 요청을 라우팅합니다. 위의 구성에서 기본 서버는 첫 번째 서버입니다.

이제 모든 요청에 ​​대해 404로 응답하는 기본 catch-all 서버를 원한다면 다음과 같이하십시오.

server {
    listen 80 default_server;
    listen 443 ssl default_server;
    server_name _;
    ssl_certificate <path to cert>
    ssl_certificate_key <path to key>
    return 404;
}

인증서 / 키 (자체 서명 가능)를 지정해야합니다. 그렇지 않으면 nginx가이 default_server를 사용하여 연결을 수락하려고 시도하고 인증서 / 키를 찾지 못하므로 모든 SSL 연결이 실패합니다.


답변

기본 서버를 지정하는 몇 가지 방법이 있습니다.

첫 번째 방법 -위에 표시된 Dayo와 같이 하나의 구성 파일에 서버 구성을 유지하는 경우 목록에서 기본 서버를 먼저 지정하십시오.

두 번째 방법 (더 나은) 더 융통성 있음- 명령에 대한 default_server매개 변수를 제공하십시오 ( listen예 :

server {
    listen  *:80 default_server;
    root /www/project/public/;
}

자세한 내용은 여기 : Nginx doc / Listen

이 방법은 서버 구성을 별도의 파일로 유지하고 해당 파일의 이름을 사전 순으로 지정하지 않을 때 더 유용합니다.


답변

대답 할 작은 의견 :

sites-available /에있는 여러 구성 파일의 여러 IP에 여러 개의 가상 호스트가있는 경우 IP의 “기본”도메인보다 첫 번째 파일에서 알파벳 순서로 가져옵니다.

Pavel이 말했듯이 “listen”지시문에 대한 “default_server”인수가 있습니다 http://nginx.org/en/docs/http/ngx_http_core_module.html#listen


답변