J'ai nginx opérationnel avec une application Ruby / Sinatra et tout va bien. Cependant, j'essaye maintenant d'avoir une deuxième application fonctionnant à 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 réglé sur FAKE.COM
encore le serveur répond à tous les hôtes qui ont frappé ce serveur par l' intermédiaire d' autres noms de domaine. Comment puis-je faire en sorte que ce serveur particulier réponde uniquement aux demandes de FAKE.COM
?
listen fake.com | something.com:80
commande filtre, nonserver_name
.Réponses:
Le premier bloc de serveur dans la configuration nginx est la valeur par défaut pour toutes les demandes qui atteignent 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 est 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 pour FAKE.COM, étant le premier le bloc serveur (uniquement le bloc serveur dans votre cas), traitera cette demande.
C'est pourquoi les configurations Nginx appropriées ont un bloc de serveur spécifique pour les valeurs par défaut avant de suivre avec d'autres pour des domaines spécifiques.
etc
** ÉDITER **
Il semble que certains utilisateurs soient un peu confus par cet exemple et pensent qu'il est limité à un seul fichier de configuration, etc.
Veuillez noter que ce qui précède est un exemple simple pour le PO à développer selon les besoins.
J'utilise personnellement des fichiers de configuration vhost séparés avec ceci comme tel (CentOS / RHEL):
/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 principal nginx.conf qui sera toujours le premier et sera toujours la valeur par défaut sauf s'il est remplacé par le default_server directive ailleurs.L'ordre alphabétique des noms de fichiers des fichiers de configuration pour les autres serveurs devient sans importance dans ce cas.
De plus, cette disposition offre une grande flexibilité dans la mesure où il est possible de définir plusieurs valeurs par défaut.
Dans mon cas spécifique, Apache écoute sur le port 8080 sur l'interface interne uniquement et je proxy les scripts PHP et Perl vers Apache.
Cependant, je lance deux applications distinctes qui renvoient toutes les deux des liens avec ": 8080" dans le code HTML de sortie joint car ils détectent qu'Apache ne fonctionne pas sur le port standard 80 et essaient de "m'aider".
Cela provoque un problème en ce que les liens deviennent invalides car Apache ne peut pas être atteint à partir de l'interface externe et les liens doivent pointer vers le port 80.
Je résous ceci en créant un serveur par défaut pour le port 8080 pour rediriger ces demandes.
Comme rien dans les blocs de serveur normaux n'écoute sur le port 8080, le bloc de serveur par défaut de redirection traite de manière transparente de telles demandes en vertu de sa position dans nginx.conf.
J'ai en fait quatre de ces blocs de serveur et il s'agit d'un cas d'utilisation simplifié.
la source
Vous devriez avoir un serveur par défaut pour fourre-tout , vous pouvez revenir
404
ou mieux ne pas répondre du tout (économisera de la bande passante) en renvoyant la444
réponse HTTP spécifique à nginx qui ferme simplement la connexion et ne renvoie rienla source
server_name _;
je n'avais pas dans les versions précédentes pour nginx, mais cela a fonctionné. Maintenant, pour les nouvelles versions de nginx, il semble que vous ayez besoin duserver_name _;
. Merci444
, et à mon avis une solution beaucoup plus propre que de renvoyer un code d'erreur.Je n'ai pas 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 en renvoyant un 403 si ce n'était pas le cas. (J'ai eu un site Web aléatoire pointant vers le contenu de mes serveurs Web. Je suppose que je détourne le rang de recherche)
la source
Pour répondre à votre question - nginx choisit le premier serveur s'il n'y a pas de correspondance. Voir documentation :
Maintenant, si vous vouliez avoir un serveur fourre-tout par défaut qui, disons, répond par 404 à toutes les demandes, alors voici comment le faire:
Notez que vous devez spécifier le certificat / la 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 / key.
la source
server_name _;
ne soit même pas nécessaire.Il existe plusieurs façons de spécifier le serveur par défaut.
Première voie - Spécifiez le serveur par défaut en premier dans la liste, si vous conservez vos configurations de serveur dans un seul fichier de configuration, comme Dayo l'a montré ci-dessus.
Deuxième méthode (meilleure) Plus flexible - fournissez un
default_server
paramètre pour l'listen
instruction, par exemple:Plus d'informations ici: Nginx doc / Listen
Cette méthode est plus utile lorsque vous conservez les configurations de serveur dans des fichiers séparés et que vous ne souhaitez pas nommer ces fichiers par ordre alphabétique.
la source
Petit commentaire pour répondre:
si vous avez plusieurs hôtes virtuels sur plusieurs adresses IP dans plusieurs fichiers de configuration dans sites-available /, le domaine "par défaut" pour IP sera extrait du premier fichier par ordre alphabétique.
Et comme Pavel l'a dit, il existe un argument "default_server" pour la directive "listen" http://nginx.org/en/docs/http/ngx_http_core_module.html#listen
la source