Nginx: comment définir l'en-tête de l'hôte sur le serveur choisi (équilibrage de charge)

10

J'ai un site qui fonctionne comme équilibreur de charge. Site A.

J'ai d'autres sites qui ne peuvent avoir qu'un seul domaine. Donc, si je redirige vers eux, le nom d'hôte est introuvable.

Donc, si j'ai défini manuellement l'en-tête sur quelque chose, seul ce site apparaît.

Comment puis-je définir l' proxy_set_header Host xxxxadresse du serveur choisie. De cette façon, chaque demande de reroutage aura un en-tête d'hôte différent et approprié.

Ce ne sera pas un problème si mes 2 autres sites peuvent fonctionner en fonction de l'URL et non de l'en-tête de l'hôte.

worker_processes  1;

error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;
error_log  logs/error.log  debug;

pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    upstream myapp1 {
        #server localhost:3333;
        server www.asd.com:80;
    }

    server {
        listen 80;

        location / {
            proxy_set_header Host            $upstream_addr;  // should become somehow www.asd.com right now this code doesn't work
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_pass http://myapp1;
        }
    }
}
Muhammad Umer
la source
$server_addrest en quelque sorte 127.0.0.1 pourquoi ??
Muhammad Umer
je veux que l'en-tête de l'hôte soit www.asd.com lorsque le serveur www.asd.com:80est choisi
Muhammad Umer
ou s'il existe un moyen d'écrire if(server1) than host = a; ,if(server2) than host = b;
Muhammad Umer
1
Le fait est que l'en-tête d'hôte approprié devrait être, à mon avis, tout ce que vous obtenez du client. Si le client demande www.asd.com, c'est ce que l'en-tête d'hôte doit être. Cela vous aidera à générer correctement des URL absolues dans le backend en cas de besoin, à définir les domaines appropriés pour les cookies, etc. Quoi que vous essayiez de faire, vous le regardez probablement dans le mauvais sens.
Florin Asăvoaie
le client et le serveur intermédiaire sont moi.
Muhammad Umer

Réponses:

6

Vous devez définir l'en-tête sur la variable hôte entrante, comme indiqué ici :

proxy_set_header Host $host;
Jeff Wong
la source
This variable is equal to line Host in *the header of request* or namece qui signifie ce que le client / navigateur dit, c'est celui qui est choisi.
Muhammad Umer
C'est ce que vous voudriez faire, n'est-ce pas? Le client demande une ressource / un hôte virtuel à votre proxy et vous devez servir un hôte virtuel. L'hôte virtuel à desservir est choisi par le client / borwser.
Jeff Wong
aucun hôte virtuel n'est choisi au hasard par le serveur
Muhammad Umer
1
Quelque chose comme ça? Créez deux niveaux de proxy et définissez l'hôte codé en dur sur le point de terminaison sur la deuxième couche serverfault.com/a/622782/287634
Jeff Wong
mal jeter un oeil, mais je pense que j'ai déjà vu depuis que j'ai voté pour des choses là
Muhammad Umer