Pourquoi nginx répond-il à un nom de domaine?

J’ai nginx opérationnel avec une application Ruby / Sinatra et tout va bien. Cependant, j’essaye maintenant d’avoir une deuxième application sur le même serveur et j’ai remarqué quelque chose de bizarre. Premièrement, 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 

Notez que server_name est défini sur FAKE.COM mais le serveur répond à tous les hôtes qui ont atteint ce serveur via d’autres noms de domaine. Comment puis-je faire en sorte que ce serveur particulier réponde uniquement aux demandes de FAKE.COM ?

Le premier bloc de serveur de la configuration nginx est la valeur par défaut pour toutes les requêtes qui frappent le serveur pour lequel il n’y a pas de bloc de serveur spécifique.

Donc, dans votre configuration, en supposant que votre vrai domaine soit REAL.COM, lorsqu’un utilisateur tape cela, il sera résolu sur votre serveur, et comme il n’y a pas de bloc de serveur pour cette configuration, le bloc de serveur FAKE.COM étant le premier bloc serveur (uniquement le serveur bloqué dans votre cas), traitera cette demande.

C’est pourquoi les configurations Nginx correctes ont un bloc de serveur spécifique pour les valeurs par défaut avant de suivre avec d’autres pour des domaines spécifiques.

 # Default server server { return 404; } server { server_name domain_1; [...] } server { server_name domain_2; [...] } 

etc

** MODIFIER **

Il semble que certains utilisateurs soient un peu confus par cet exemple et pensent qu’il est limité à un seul fichier de configuration de fichier, etc.

Veuillez noter que ce qui précède est un exemple simple pour que le PO se développe comme requirejs.

Personnellement, j’utilise des fichiers vhost conf distincts avec ceci (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 serveur dans le fichier nginx.conf principal qui sera toujours le premier et sera toujours le default sauf si elle est remplacée par la directive default_server ailleurs.

L’ordre alphabétique des noms de fichiers des fichiers conf pour les autres serveurs devient sans object dans ce cas.

En outre, cet arrangement offre une grande souplesse dans la mesure où il est possible de définir plusieurs parameters par défaut.

Dans mon cas spécifique, Apache écoute uniquement le port 8080 sur l’interface interne et je proxy les scripts PHP et Perl sur Apache.

Cependant, je lance deux applications distinctes qui renvoient toutes les deux des liens avec “: 8080” dans le fichier HTML en sortie, car elles détectent qu’Apache ne fonctionne pas sur le port 80 standard et tentent de “m’aider”.

Cela provoque un problème en ce sens que les liens ne sont plus valides car Apache ne peut pas être atteint depuis l’interface externe et que les liens doivent pointer vers le port 80.

Je résous ce problème en créant un serveur par défaut pour le port 8080 afin de redirect ces 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 les blocs de serveur standard n’écoute sur le port 8080, le bloc de serveur de redirection par défaut gère ces demandes de manière transparente en raison de sa position dans nginx.conf.

J’ai en fait quatre de ces blocs de serveur et ceci est un cas d’utilisation simplifié.

Vous devriez avoir un serveur par défaut pour catch-all , vous pouvez retourner 404 ou mieux pour ne pas répondre du tout (cela économisera de la bande passante) en renvoyant 444 qui est la réponse HTTP spécifique à nginx qui ferme simplement la connexion et ne retourne rien

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

Je n’ai pu résoudre mon problème avec aucune des autres réponses. J’ai résolu le problème en vérifiant si l’hôte correspondait et renvoyait un 403 si ce n’était pas le cas. (J’avais un site Web aléatoire qui indiquait le contenu de mes serveurs Web. Je suppose que je devrais détourner le rang de recherche)

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

Il existe plusieurs façons de spécifier le serveur par défaut.

Première manière – Spécifiez d’abord le serveur par défaut dans la liste, si vous conservez les configurations de votre serveur dans un fichier de configuration, comme l’a montré Dayo ci-dessus.

Second way (better) Plus flexible – fournit le paramètre default_server pour les instructions d’ listen , par exemple:

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

Plus d’informations ici: Nginx doc / Listen

Cette méthode est plus utile lorsque vous conservez des configurations de serveur dans des fichiers distincts et que vous ne souhaitez pas les nommer par ordre alphabétique.

Petit commentaire pour répondre:

Si vous avez plusieurs hôtes virtuels sur plusieurs adresses IP dans plusieurs fichiers de configuration de sites-disponibles /, le domaine “par défaut” pour IP sera extrait du premier fichier par ordre alphabétique.

Et comme le dit Pavel, il y a un argument “default_server” pour la directive “listen” http://nginx.org/en/docs/http/ngx_http_core_module.html#listen

Pour répondre à votre question, nginx choisit le premier serveur s’il n’y a pas de correspondance. Voir la documentation :

Si sa valeur ne correspond à aucun nom de serveur ou si la demande ne contient pas ce champ d’en-tête, nginx achemine la demande vers le serveur par défaut pour ce port. Dans la configuration ci-dessus, le serveur par défaut est le premier …

Maintenant, si vous voulez avoir un serveur catch-all par défaut qui répond avec 404 à toutes les requêtes, alors voici comment le faire:

 server { listen 80 default_server; listen 443 ssl default_server; server_name _; ssl_certificatee  ssl_certificatee_key  return 404; } 

Notez que vous devez spécifier certificate / clé (qui peut être auto-signé), sinon toutes les connexions SSL échoueront car nginx essaiera d’accepter la connexion en utilisant ce serveur par défaut et ne trouvera pas cert / clé.