Я создаю мультисервисное веб-приложение с двумя разными сервисами. Веб-интерфейс и 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
ответ.