J'exécute plusieurs conteneurs docker avec des noms d'hôtes :
web1.local web2.local web3.local
Le routage vers ces derniers est effectué par nginx sur la base du nom d'hôte. J'ai un proxy en amont de cette configuration (sur une autre machine connectée à Internet) où je définis l'amont comme :
upstream main {
server web1.local:80;
server web2.local:80;
server web3.local:80;
}
Et la description de l'hôte virtuel actuel :
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://main;
}
}
Maintenant, parce que les conteneurs reçoivent le nom d'hôte "main" au lieu de "web1.local", ils ne répondent pas correctement à la demande.
Question : comment puis-je dire à nginx de passer le nom du serveur en amont au lieu du nom du groupe de serveurs en amont dans l'en-tête Host : lors de la transmission de la demande ?
3 votes
Je ne pense pas que tu puisses. Pourquoi ne pas configurer vos serveurs dorsaux pour qu'ils répondent à main ou example.com ? Ce n'est pas comme si le backend ne savait pas qui est le serveur principal. il est. L'inverse est tout à fait possible : proxy_set_header Host $host ; remplacera toute variable Host revenant de l'amont par le nom d'hôte de la requête originale.
0 votes
La chose à faire est de réparer l'application.
4 votes
@MichaelHampton Ce n'est pas possible dans certains cas, par exemple si l'on utilise des
proxy_ssl_server_name
pour TLS SNI, il faut le bon nom de serveur.3 votes
À mon avis, il s'agit d'un bogue dans Nginx. Le nom "main" d'upstream est juste une référence locale dans le fichier .conf qui n'a pas besoin de refléter un nom d'hôte réel résolvable par DNS ou connu du backend. En gros, à moins que vos backends connaissent cette référence ou répondent à Host : *, vous ne pouvez pas utiliser la fonction
upstream
directive.