J'ai plusieurs serveurs fonctionnant sur le même ordinateur, certains avec http uniquement, d'autres avec http et https. Plusieurs blocs de serveur sont définis dans des fichiers séparés, inclus dans le fichier de configuration principal.
J'ai mis en place un serveur "par défaut" pour http qui servira une "page de maintenance" générique aux demandes qui ne correspondent à aucun des autres noms de serveur dans les autres fichiers de configuration. Le serveur http par défaut fonctionne comme prévu, il utilise le nom_serveur "_" et il apparaît en premier dans la liste des inclus (car j'ai observé que, dans le cas de doublons de noms de serveur sur plusieurs serveurs, celui qui apparaît en premier est utilisé). Cela fonctionne très bien.
Je m'attendrais au même bloc de serveur exact (en commutant seulement "listen 80 default_server" sur "listen 443 default_server" et aussi au lieu de servir la page "return 444"), mais ce n'est pas le cas. Au lieu de cela, il semble que le nouveau serveur https par défaut récupère toutes les connexions https entrantes et les cause à leur échec, bien que les autres blocs du serveur aient des noms de serveur plus appropriés pour les demandes entrantes. La suppression du nouveau serveur https par défaut entraîne la reprise d'un comportement semi-correct: les sites Web dotés de https se chargeront tous correctement; mais les sites Web sans https seront tous routés vers le premier serveur https dans les fichiers d'inclusion (qui, selon la documentation, n'indique pas "default_server", le premier bloc de serveur à apparaître sera "default").
Ma question est donc la suivante: quelle est la bonne façon de définir un "serveur par défaut" dans nginx pour les connexions ssl? Pourquoi est-ce que quand je définis explicitement un "serveur_de_faut", il devient gourmand et saisit toutes les connexions alors que quand je laisse implicitement nginx décider du "serveur par défaut", il fonctionne comme je le pensais (avec le serveur incorrect défini par défaut et les autres serveurs réels se comporter correctement)?
Voici mes "serveurs par défaut". Http fonctionne sans casser d'autres serveurs. Https casse d'autres serveurs et consomme tout.
server {
listen 443 ssl default_server;
server_name _;
access_log /var/log/nginx/maintenance.access.log;
error_log /var/log/nginx/maintenance.error.log error;
return 444;
}
server {
listen *:80 default_server;
server_name _;
charset utf-8;
access_log /var/log/nginx/maintenance.access.log;
error_log /var/log/nginx/maintenance.error.log error;
root /home/path/to/templates;
location / {
return 503;
}
error_page 503 @maintenance;
location @maintenance {
rewrite ^(.*)$ /maintenance.html break;
}
}
Quelqu'un parmi vous voit ce qui pourrait être faux ici?
J'ai réussi à configurer un hébergement dédié partagé sur une seule adresse IP avec nginx. HTTP et HTTPS par défaut servant un 404 pour les domaines inconnus entrants.
1 - Créer une zone par défaut
Comme nginx charge vhosts dans l’ordre ascii, vous devez créer un
00-default
lien fichier / symbolique dans votre fichier/etc/nginx/sites-enabled
.2 - Remplir la zone par défaut
Remplissez votre
00-default
avec vhosts par défaut. Voici la zone que j'utilise:3 - Créer des certif, des tests et des recharges auto-signés
Vous devrez créer un certificat auto-signé dans
/etc/nginx/ssl/nginx.crt
.Créez un certificat auto-signé par défaut:
Juste un rappel:
nginx -t
sudo service nginx reload
J'espère que ça aide.
la source
default_server
pour écouter 443 et que j'ai ajouté l'adresse IPv6 [::]: 80 et [::]: 443 avecdefault_server
.Nous voulons fondamentalement éviter à tout prix que la première définition de serveur de notre fichier de configuration serve de serveur fourre-tout pour les connexions SSL. Nous savons tous que c'est ce qui se produit (contrairement à http et à la configuration par défaut de default_server qui fonctionne bien).
Cela ne peut pas être réalisé de manière déclarative pour SSL (pour le moment), nous devons donc le coder avec un IF ...
La variable
$host
est le nom d'hôte de la ligne de requête ou de l'en-tête http. La variable$server_name
est le nom du bloc de serveur dans lequel nous sommes en ce moment.Par conséquent, si ces deux éléments ne sont pas égaux, vous avez servi ce blocage de serveur SSL à un autre hôte. Ce blocage doit donc être bloqué.
Le code ne contient pas de références spécifiques aux adresses IP de votre serveur, il peut donc être facilement réutilisé pour d'autres configurations de serveur sans modification.
Exemple:
la source
listen [::]:443 ssl http2;
fait le J'ai de la difficulté à trouver de la documentation à ce sujet.Pour en savoir plus sur la réponse de Radmilla Mustafa:
Nginx utilise l'en-tête 'Host' pour la correspondance nom_serveur. Il n'utilise pas TLS SNI. Cela signifie que pour un serveur SSL, nginx doit pouvoir accepter une connexion SSL, ce qui revient à avoir un certificat / une clé. Le cert / clé peut être quelconque, par exemple auto-signé.
Voir la documentation
La solution est donc la suivante:
la source
À tous ceux qui ont perdu autant de cheveux que moi (y ont passé presque toute la journée). J'ai presque tout essayé, et ce qui a finalement fonctionné correctement est cette stupide ligne:
En me basant sur la réponse de Ifnot , mon exemple de travail est le suivant:
Je ne sais pas pourquoi c'était nécessaire, le seul principe que j'ai tiré de cela est que nginx se comporte très étrangement quand on ne lui donne pas ce qu'il veut.
la source
Si vous voulez être absolument sûr, utilisez des adresses IP distinctes pour les hôtes qui ne devraient pas répondre sur HTTPS et les hôtes qui devraient. Cela résout également le problème de l'avertissement du navigateur "certificat non valide".
la source