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
Avis comment server_name
est fixé à FAKE.COM
pourtant 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 de répondre uniquement aux demandes de FAKE.COM
?
- le
listen fake.com | something.com:80
commande de filtres, passerver_name
.
Vous devez vous connecter pour publier un commentaire.
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.
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.
etc
** EDIT **
Il semble que certains utilisateurs sont un peu confus par cet exemple et pense qu'il est limité à un seul fichier conf 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 que c'est ainsi (CentOS/RHEL):
/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.
Que 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'en ai quatre de ces blocs de serveurs et c'est une forme simplifiée de cas d'utilisation.
Vous devez avoir un serveur par défaut pour les fourre-tout, vous pouvez retourner
404
ou mieux de ne pas répondre à tous les (permettra d'économiser de la bande passante) en retournant444
qui est nginx spécifique de la réponse HTTP qui il suffit de fermer la connexion et renvoie rienserver_name _;
je n'ai pas dans les versions antérieures pour nginx, mais cela a fonctionné. Maintenant, pour la plus récente de nginx versions, il semble que vous avez besoin de laserver_name _;
. Merci444
, et à mon avis une bien meilleure solution que de retourner un code d'erreur.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 de recherche de rang)
Il y a quelques façons de spécifier le serveur par défaut.
Premiè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.
Deuxième moyen (mieux) Plus souple - fournir
default_server
paramètre pourlisten
instruction, par exemple: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.
Pour répondre à votre question - nginx prend le premier serveur si il n'y a pas de match. Voir la documentation:
Maintenant, si vous voulez avoir un défaut fourre-tout serveur qui, par exemple, répond avec 404 à toutes les demandes, alors voici comment faire:
Notez que vous devez spécifier le certificat/clé (qui peut être auto-signé), sinon toutes les connexions SSL échouera comme nginx va essayer d'accepter la connexion à l'aide de cette default_server et de ne pas trouver cert/clé.
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