Назад | Перейти на главную страницу

Обслуживать две службы докеров с nginx в разных конечных точках

Я создаю мультисервисное веб-приложение с двумя разными сервисами. Веб-интерфейс и API. Мне удалось настроить сервер и заставить его общаться с api внутри, но я новичок в Nginx и не знаю, как это сделать.

Идея заключалась бы в том, чтобы обслуживать Интернет в / и api в / api.

Это мой настоящий nginx.conf для интерфейса Django.

upstream webapp{ 
    server front:8000; 
} 

upstream api {
  server api:9000;
}

server {  
    listen 80; 

    location / { 
        proxy_pass http://webapp; 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        proxy_set_header Host $host; 
        proxy_redirect off; 
    }        

    location /api {
      proxy_pass http://api;
    }

    location /staticfiles/ { 
        alias /home/webapp/web/staticfiles/; 
    }  
} 

Фронт работает с пулеметами в порту 8000 и обслуживается в http://localhost/.

API работает с Gunicorn в порту 9000, и я хотел бы получить к нему доступ, как http://localhost/api

Вот как я определяю службу в файле docker-compose:

api: 
  build: 
    context: ./API
    dockerfile: Dockerfile 
  command: gunicorn -b 0.0.0.0:9000 api:api  --limit-request-line 0 
  ports: 
    - 9000:9000 

Прямо сейчас я получаю эту ошибку, когда пытаюсь получить доступ к localhost / api:

nginx_1      | 172.20.0.1 - - [25/Nov/2019:12:56:16 +0000] "GET / HTTP/1.1" 200 9330 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0" "-"
nginx_1      | 172.20.0.1 - - [25/Nov/2019:12:56:24 +0000] "GET /status/ HTTP/1.1" 404 4997 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0" "-"
nginx_1      | 172.20.0.1 - - [25/Nov/2019:12:57:04 +0000] "GET /api/ HTTP/1.1" 200 3834 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0" "-"
nginx_1      | 172.20.0.1 - - [25/Nov/2019:12:57:04 +0000] "GET /swaggerui/droid-sans.css HTTP/1.1" 404 5048 "http://localhost/api/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0" "-"
nginx_1      | 172.20.0.1 - - [25/Nov/2019:12:57:04 +0000] "GET /swaggerui/swagger-ui.css HTTP/1.1" 404 5048 "http://localhost/api/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0" "-"
nginx_1      | 172.20.0.1 - - [25/Nov/2019:12:57:04 +0000] "GET /swaggerui/swagger-ui-bundle.js HTTP/1.1" 404 5066 "http://localhost/api/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0" "-"
nginx_1      | 172.20.0.1 - - [25/Nov/2019:12:57:04 +0000] "GET /swaggerui/swagger-ui-standalone-preset.js HTTP/1.1" 404 5099 "http://localhost/api/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0" "-"
nginx_1      | 172.20.0.1 - - [25/Nov/2019:12:57:04 +0000] "GET /swaggerui/favicon-16x16.png HTTP/1.1" 499 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0" "-"

Это означает, что он не может получить ресурсы для чванства.

Также, localhost/api/status он перенаправляется на localhost/status которого не существует, и я действительно не знаю почему.

localhost:9000/´ its working, and alsoлокальный: 9000 / статус ». Root даже загружает документы swagger. Итак, я попробовал следующее:

 location /api/ {
    rewrite ^/route/?(.*)$ /$1 break;  
    proxy_pass http://localhost:9000/;
}

Но когда я пробую это:

 curl -X GET "http://localhost/api/status/" -H  "accept: application/json"

Я знаю, что Nginx выполняет перезапись, потому что он произносит следующее:

[error] 7#7: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.20.0.1, server: , request: "GET /api/status/ HTTP/1.1", upstream: "http://127.0.0.1:9000/status/", host: "localhost"

Но я все еще получаю 502 Bad gateway ответ.