2017-07-07 1 views
2

Ich benutze jwilder/nginx-proxy, um einen Reverse-Proxy zu machen. Ich versuche, http://localhost:8000/api zu einem bestimmten PHP-Dienst umzuleiten.Mit JWilder Nginx-Proxy, wie eine Unterverzeichnis-URL zu einem bestimmten Container proxypass?

Die Verzeichnisstruktur:

. 
+-- docker-compose.yml 
+-- nginx 
+-- nodejs 
| +-- index.js 
| +-- … 
+-- php 
| +-- api 

Docker-compose.yml:

version: "3.1" 

services: 

    nginx-proxy: 
    image: jwilder/nginx-proxy:alpine 
    ports: 
     - "8000:80" 
    volumes: 
     - ./php:/srv/www 
     - /var/run/docker.sock:/tmp/docker.sock:ro 

    nodejs: 
    image: node:alpine 
    environment: 
     - NODE_ENV=production 
     - VIRTUAL_HOST=localhost 
     - VIRTUAL_PORT=8080 
    expose: 
     - "8080" 
    working_dir: /home/app 
    restart: always 
    volumes: 
     - ./nodejs:/home/app 
    command: ["node", "index.js"] 

    php: 
    image: php:apache 
    environment: 
     - VIRTUAL_HOST=localhost 
    volumes: 
     - ./php:/var/www/html 

Dies funktioniert gut für die nodejs Service.

Jetzt möchte ich Anrufe an http://localhost:8000/api zum php Dienst umleiten. Ich stelle mir vor, dass ich in die nginx conf etwas wie hinzufügen:

server { 
    location /api { 
    proxy_pass http://php:80/api; 
    proxy_set_header Host $host; 
    } 
} 

This feature is not built into the lib. Also, wie kann ich das erreichen?

Antwort

2

Ein Ansatz ist die PHP-App einen eigenen virtuellen Host zu geben:

php: 
    image: php:apache 
    environment: 
     - VIRTUAL_HOST=api.localhost 
    volumes: 
     - ./php:/var/www/html 

Dann wird es als diese accesible sein:

curl -H 'Host: api.localhost' http://localhost:8000/api 

die Header-Einstellung kann in praktisch jeder Sprache erreicht werden . Oder zu vermeiden benutzerdefinierten Header einstellen, können Sie das DNS auf Ihre /etc/hosts Datei hinzufügen:

127.0.0.1 api.localhost 

So können Sie wie diese locken:

curl -H http://api.localhost:8000/api 

Dies ist, wie Set benutzerdefinierte Header, zum Beispiel in Knoten:

var request = require('request') 

var formData = {} 

request({ 
    headers: { 
     'Host': 'api.localhost' 
    }, 
    uri: 'http://localhost:8080', 
    method: 'POST' 
    }, function (err, res, body) { 
     console.log("it works") 
     console.log(res) 
    } 
) 

Aber, empfehle ich Ihnen für die/etc/hosts Ansatz zu gehen, dass ein Äquivalent in der Produktionsumgebung hat (ein DNS-Server). Sie müssen also den Knotencode nicht berühren.

+0

Könnten Sie bitte ein Beispiel zeigen, wie/wo ich den benutzerdefinierten Header einstellen könnte, bitte? –

+0

@francoisromain Siehe mein Update – Robert

+0

Danke. Durch das Ändern von DNS wird die portable Logik von Docker entfernt. Das Ändern von Headern in jeder Anforderung ist ebenfalls nicht leicht. Letztendlich verkompliziert jwilder/nginx-proxys im Vergleich zu der einfachen nginx-Konfiguration in meiner vorherigen Frage wirklich ... Ich muss darüber nachdenken –

Verwandte Themen