47 votes

Serveur Nginx "par défaut"?

J'ai un Nginx avec un certain nombre de blocs serveurs activés. Chaque serveur répond à 1 domaine canonique et peut rediriger vers 1 ou plusieurs URL canoniques. J'ai au moins un serveur (je n'ai pas encore vérifié tous) où, si je saisis un domaine inexistant qui pointe vers cette machine, Nginx affiche un site de son choix (toujours le même site, mais pas celui que je recherche).

J'ai fouillé dans le fichier de configuration du site sur lequel je finis toujours, mais je ne vois rien d'évident qui l'identifierait comme un site par défaut de quelque sorte que ce soit et pourtant, il est toujours là quand je tape une URL par erreur.

Des idées sur ce que je devrais rechercher pour résoudre ce problème?

52voto

Fleshgrinder Points 3558

Pourquoi nginx fait-il cela ?

La raison en est simple. Les clients très anciens ou défectueux ne transmettent pas le champ d'en-tête HTTP Host dans leurs requêtes et si vous utilisez des blocs serveurs basés sur le nom (hôtes virtuels basés sur le nom en termes d'Apache), nginx n'est pas en mesure de déterminer le serveur que vous avez configuré pour le client. Le même problème est vrai pour tout autre serveur web qui prend en charge ce système basé sur le nom. Ce problème ne se poserait pas si vous utilisiez un système basé sur IP pour chaque domaine (ce qui signifie également que vous avez plusieurs interfaces réseau).

En savoir plus sur ce sujet ? Comment nginx traite une requête


Lequel est le premier ?

nginx sélectionnera le serveur qui apparaît en premier si aucun indicateur default n'a été défini sur une directive listen :

server {
  server_name server1.com;
}

server {
  server_name server2.com;
}

server1.com sera par défaut.

Si vous incluez automatiquement les liens symboliques de sites-enabled (configuration par défaut), le fichier qui apparaît en premier dans le répertoire sera votre premier serveur.


Que puis-je faire pour éviter cela ?

Bonne question et vous devriez l'éviter. Il n'y a aucune raison de prendre en charge ces anciens clients et absolument aucune raison de prendre en charge les clients défectueux. Le problème est facilement résolu en créant une configuration de serveur par défaut. L'exemple suivant provient de l'un de mes projets et est destiné à la version de développement actuelle de nginx (1.5.2 - mais devrait fonctionner également avec les versions plus anciennes) :

# /etc/nginx/sites-enabled/_.conf

# Serveur par défaut pour les clients qui ne transmettent pas correctement l'en-tête Host.
# Le souligné dans le nom du fichier fait en sorte que ce fichier apparaisse en premier dans le répertoire.
server {
  server_name _;
  listen *:80 default_server deferred;
  return 444;
}

La configuration est réduite, plus de trucs de configuration nginx.

42voto

Shane Madden Points 112034

Ajoutez default_server à votre directive listen dans le serveur que vous souhaitez définir comme le serveur par défaut.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X