nginx proxy_pass en utilisant un sous-dossier

11

ok, cette tâche devrait être simple mais je n'arrive pas à le faire fonctionner. Je voudrais avoir un sous-dossier après mon nom de domaine (en fait après l'IP de ce nom de domaine), qui redirige vers un port spécifique sur le même serveur. Essentiellement, je veux me débarrasser d'avoir à utiliser de nombreux ports.

Voici ma config nginx pour ça

server {
    listen 80;

    index index.html index.htm index.nginx-debian.html index.php;

    server_name aaa.bbb.ccc.ddd;

    location ^~ /app2 {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass http://aaa.bbb.ccc.ddd:8001;
    }
}

Donc, lors de l'accès à aaa.bbb.ccc.ddd / app2, je voudrais que cela se résout en http: //aaa.bbb.ccc.ddd: 8001 .

Cela peut être peut-être si compliqué. Qu'est-ce que j'oublie ici?

Merci Pat

pAt84
la source
Voulez-vous dire «redirige vers un port» ou «proxy vers un port»? Ils sont assez différents. Votre question n'est pas claire, peut-être pourriez-vous développer votre cas d'utilisation, y compris le client.
Tim

Réponses:

12

Étant donné que vous avez marqué cela comme une question de proxy inverse, je suppose que vous voulez dire que vous souhaitez proxy de la demande afin que l'utilisateur ne voie que l' http://aaa.bbb.ccc.ddd/app2URL dans son navigateur.

Vous pouvez changer votre locationbloc en ceci:

location ~/app2(.*)$ {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_pass http://aaa.bbb.ccc.ddd:8001$1;
}

Nous saisissons ici la partie URI après /app2la $1variable et l' utiliser dans la proxy_passdirective.

Tero Kilkanen
la source
Je vous remercie. Cela a fait l'affaire. aaa.bbb.ccc.ddd: 8001 ne s'affiche que partiellement. Il y a des websockets sur cette page et de nombreux scripts java. Je suppose que c'est parce que je proxy le port et ne le transmets pas comme Tim mentionné ci-dessus. Est-ce réellement possible de réaliser simplement en utilisant nginx?
pAt84
À quoi ressemblent les URL des ressources sur la aaa.bbb.ccc.ddd:8001page? Très probablement, vous devez corriger les URL pour contenir la /app2pièce.
Tero Kilkanen
C'est vraiment juste une prise Web là-bas (montrant des données radar, automobile ...). Il n'y a aucun signe de "app2" dans le code source.
pAt84
Hm ok, oui. Pour appeler le websocket, JS utilise "var ws = new WebSocket ('ws: //' + location.host + '/ ws');". location.host manque maintenant le numéro de port, ce qui fait que le tout ne fonctionne plus.
pAt84
Ok, il semble donc qu'une fois que j'appelle aaa.bbb.ccc.ddd / app2, je l'exige pour utiliser en interne aaa.bbb.ccc.ddd: 8001. Une autre option consiste à modifier tous les scripts java. Le raisonnement est que je veux utiliser nginx pour me donner une "solution à un port" mais après avoir accédé (par exemple via http // aaa.bbb.ccc.ddd / app2), j'en aurais besoin en interne pour y aller retour à aaa.bbb.ccc.ddd: 8001. Est-ce possible?
pAt84