2017-10-11 3 views
0

Je vais avoir du mal à essayer d'obtenir ce qui suit pour travailler dans DockerNginx proxy inverse .Net Core API dans docker

Ce que je veux est que lorsque l'utilisateur demande http://localhost/api puis reverse proxy Nginx à mon .Net de base API s'exécutant dans un autre conteneur.

hôte Container: Windows

Container 1: Nginx

dockerfile

FROM nginx 

COPY ./nginx.conf /etc/nginx/nginx.conf 

nginx.conf

user nginx; 
worker_processes 1; 

error_log /var/log/nginx/error.log warn; 
pid  /var/run/nginx.pid; 

events { 
    worker_connections 1024; 
} 

http { 

    server { 
     location /api1 { 
      proxy_pass http://api; 
      proxy_http_version 1.1; 
      proxy_set_header Upgrade $http_upgrade; 
      proxy_set_header Connection keep-alive; 
      proxy_set_header Host $host; 
      proxy_cache_bypass $http_upgrade; 
     } 
    } 

    include  /etc/nginx/mime.types; 
    default_type application/octet-stream; 

    log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 
         '$status $body_bytes_sent "$http_referer" ' 
         '"$http_user_agent" "$http_x_forwarded_for"'; 

    access_log /var/log/nginx/access.log main; 

    sendfile  on; 
    #tcp_nopush  on; 

    keepalive_timeout 65; 

    #gzip on; 

    include /etc/nginx/conf.d/*.conf; 
} 

Container 2: .Net C API de minerai

mort simple - API exposée sur le port 80 dans le récipient

Ensuite, il y a le docker-compose.yml

docker-compose.yml

version: '3' 

services: 
    api1: 
    image: api1 
    build: 
     context: ./Api1 
     dockerfile: Dockerfile 
    ports: 
     - "5010:80" 

    nginx: 
    image: vc-nginx 
    build: 
     context: ./infra/nginx 
     dockerfile: Dockerfile 
    ports: 
     - "5000:80" 

Lecture de la Docker documentation il indique:

Les liens vous permettent de définir des alias supplémentaires par lesquels un service est accessible depuis un autre service. Ils ne sont pas requis pour permettre aux services de communiquer - par défaut, n'importe quel service peut atteindre n'importe quel autre service au nom de ce service.

Alors que mon service API est appelé api1, j'ai simplement référencé cela dans le fichier nginx.conf dans le cadre de la configuration de proxy inverse:

proxy_pass http://api1;

Quelque chose ne va pas comme quand je rentre http:\\localhost\api Je reçois une erreur 404.

Y at-il un moyen de résoudre ce problème?

Répondre

0

Le problème est la configuration nginx location.

L'erreur 404 est correcte, car votre configuration demande par proxy de http://localhost/api/some-resource à une ressource manquante, car votre mappage correspond au chemin /api1 et vous demandez /api.

Donc vous ne devriez changer l'emplacement que pour /api et cela fonctionnera.

Gardez à l'esprit que les demandes à http://localhost/api seront transmises par proxy à http://api1/api (le chemin est conservé). Si votre backend est configuré pour exposer api avec un chemin de préfixation c'est bien, sinon vous recevrez un autre 404 (cette fois de votre service). Pour éviter cela, vous devez réécrire le chemin avant d'envoyer une requête à la demande avec une règle comme celle-ci:

# transform /api/some-resource/1 to /some-resource/1 
rewrite /api/(.*) /$1 break;