161 votes

Pourquoi est-nginx répondre à tout nom de domaine?

J'ai nginx et en cours d'exécution avec un Rubis/Sinatra application et tout est bien. Cependant, je vais maintenant essayer d'en faire une deuxième application en cours d'exécution à partir du même serveur et j'ai remarqué quelque chose de bizarre. Tout d'abord, voici mon 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

Remarquez comment server_name est définie à l' FAKE.COM mais le serveur est de répondre à tous les hôtes qui ont frappé le serveur par l'intermédiaire d'autres noms de domaine. Comment puis-je faire de ce serveur en particulier ne répondre qu'aux demandes d' FAKE.COM?

225voto

Dayo Points 2701

Le premier bloc de serveur dans la config nginx est la valeur par défaut pour toutes les demandes qui ont frappé le serveur pour lequel il n'existe pas de serveur spécifique du bloc.

Donc, dans votre config, en supposant que votre vrai nom de domaine est REAL.COM lorsqu'un utilisateur tape que dans, il permettra de résoudre à votre serveur, et depuis il n'y a pas de bloc de serveur pour cette configuration, le bloc de serveur pour FAKE.COM d'abord le premier bloc de serveur (seul bloc de serveur dans votre cas), permettra de traiter cette demande.

C'est pourquoi bon Nginx configs ont un serveur spécifique du bloc de paramètres par défaut avant de suivre avec les autres pour des domaines spécifiques.

# Default server
server {
    return 404;
}

server {
    server_name domain_1;
    [...]
}

server {
    server_name domain_2;
    [...]
}

etc

** EDIT **

Il semble que certains utilisateurs sont un peu confus par cet exemple et pense qu'il est limité à un seul fichier de conf, fichier, etc.

Veuillez noter que le ci-dessus est un exemple simple pour l'OP, pour développer comme requis.

Personnellement, je utiliser des vhost fichiers de conf avec ce que l' (CentOS/RHEL):

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

/etc/nginx/conf.d/ contiendra domain_1.conf, domain_2.conf ... domain_n.conf qui sera inclus après le bloc de serveur dans les principaux nginx.fichier conf qui sera toujours le premier et sera toujours la valeur par défaut, sauf s'il est annulé avec la default_server directive ailleurs.

L'ordre alphabétique des noms de fichier les fichiers de conf pour les autres serveurs devient inutile dans ce cas.

En outre, cette disposition donne beaucoup de flexibilité en ce qu'il est possible de définir plusieurs valeurs par défaut.

Dans mon cas précis, j'ai Apache écoute sur le Port 8080 sur l'interface interne seulement et je proxy PHP et Perl scripts de Apache.

Cependant, je lance deux applications distinctes que les deux liaisons de retour avec ":8080" dans la sortie html attachés qu'ils détectent qu'Apache n'est pas en cours d'exécution sur le Port standard 80 et essayer de les "aider" à moi.

Cela provoque un problème dans les liens deviennent non valides que Apache ne peut pas être atteint à partir de l'interface externe et les liens doivent pointer sur le Port 80.

- Je résoudre ce problème par la création d'un serveur par défaut pour le Port 8080 pour rediriger les demandes.

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;
}

Comme rien dans l'ordinaire de serveur bloque l'écoute sur le Port 8080, la redirection du serveur par défaut bloquer de façon transparente, poignées de telles demandes en vertu de sa position dans nginx.conf.

En fait, j'ai quatre de ces blocs de serveurs et c'est une forme simplifiée de cas d'utilisation.

35voto

Matt Carrier Points 304

J'ai été incapable de résoudre mon problème avec toutes les autres réponses. J'ai résolu le problème en vérifiant si l'hôte de la correspondance et de retour d'un 403 si elle n'a pas. (J'ai eu quelques aléatoire site web pointant vers mes serveurs web de contenu. Je devine à détourner classement de recherche)

server {
    listen 443;
    server_name example.com;

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

    ...
}

27voto

Pavel Points 334

Il ya quelques façons de spécifier le serveur par défaut.

Première manière - Spécifier le serveur par défaut en premier sur la liste, si vous gardez vos configurations de serveur dans un fichier de config comme Dayo a montré ci-dessus.

La seconde manière - Plus pratique pour moi - fournir "default_server" paramètre pour "écouter" de l'enseignement, par exemple:

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

Plus d'informations ici: Nginx doc / Écouter

De cette façon, plus utile lorsque vous conservez des configurations de serveur dans des fichiers séparés et ne veulent pas le nom de ces fichiers par ordre alphabétique.

9voto

Oleg Neumyvakin Points 1558

Peu de commentaires, de répondre:

si vous avez plusieurs hôtes virtuels sur plusieurs IPs dans plusieurs fichiers de configuration dans sites-available/, que "par défaut" domaine de la propriété intellectuelle seront prises à partir du premier fichier par ordre alphabétique.

Et Pavel dit, il est "default_server argument de" la pour "écouter" la directive http://nginx.org/en/docs/http/ngx_http_core_module.html#listen

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X