#docker #http #nginx #flask #load-balancing
#докер #http #nginx #колба #балансировка нагрузки
Вопрос:
Я пытаюсь настроить балансировщик нагрузки с 3 репликами для обработки запросов. Я использую Nginx для балансировки нагрузки, Flask для развертывания API и Postgres для обработки данных в режиме репликации.
Моя Докер-композиция выглядит так:
version: '3.5' services: tienda: build: ./api deploy: replicas: 3 depends_on: - postgresql-master - postgresql-slave ports: - 8080 postgresql-master: image: docker.io/bitnami/postgresql:11 ports: - '5432:5432' volumes: - 'postgresql_master_data:/bitnami/postgresql' environment: - POSTGRESQL_REPLICATION_MODE=master - POSTGRESQL_REPLICATION_USER=repl_user - POSTGRESQL_REPLICATION_PASSWORD=repl_password - POSTGRESQL_USERNAME=postgres - POSTGRESQL_PASSWORD=123 - POSTGRESQL_DATABASE=tienda - ALLOW_EMPTY_PASSWORD=yes postgresql-slave: image: docker.io/bitnami/postgresql:11 ports: - '5433:5432' depends_on: - postgresql-master environment: - POSTGRESQL_REPLICATION_MODE=slave - POSTGRESQL_REPLICATION_USER=repl_user - POSTGRESQL_REPLICATION_PASSWORD=repl_password - POSTGRESQL_MASTER_HOST=postgresql-master - POSTGRESQL_PASSWORD=123 - POSTGRESQL_MASTER_PORT_NUMBER=5432 - ALLOW_EMPTY_PASSWORD=yes nginx: build: ./nginx ports: - "8080:80" depends_on: - tienda volumes: postgresql_master_data: driver: local
и nginx.conf выглядит так:
upstream loadbalancer { server sist3-tienda-1:3050 weight=3 max_fails=0 fail_timeout=5s; server sist3-tienda-2:3050 weight=2 max_fails=0 fail_timeout=5s; server sist3-tienda-3:3050 weight=1 max_fails=0 fail_timeout=5s; } server { location / { proxy_pass http://loadbalancer; proxy_read_timeout 5m; }}
Проблема начинается, когда я пытаюсь получить http://localhost:8080
, я получаю 502 плохих шлюза и шоу Docker-compose:
nginx_1 | 2021/12/06 06:06:23 [error] 31#31: *2 connect() failed (111: Connection refused) while connecting to upstream, client: 172.21.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://172.21.0.4:3050/", host: "localhost:8080" nginx_1 | 2021/12/06 06:06:23 [warn] 31#31: *2 upstream server temporarily disabled while connecting to upstream, client: 172.21.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://172.21.0.4:3050/", host: "localhost:8080" nginx_1 | 2021/12/06 06:06:23 [error] 31#31: *2 connect() failed (111: Connection refused) while connecting to upstream, client: 172.21.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://172.21.0.6:3050/", host: "localhost:8080" nginx_1 | 2021/12/06 06:06:23 [warn] 31#31: *2 upstream server temporarily disabled while connecting to upstream, client: 172.21.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://172.21.0.6:3050/", host: "localhost:8080" nginx_1 | 2021/12/06 06:06:23 [error] 31#31: *2 connect() failed (111: Connection refused) while connecting to upstream, client: 172.21.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://172.21.0.5:3050/", host: "localhost:8080" nginx_1 | 2021/12/06 06:06:23 [warn] 31#31: *2 upstream server temporarily disabled while connecting to upstream, client: 172.21.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://172.21.0.5:3050/", host: "localhost:8080" nginx_1 | 172.21.0.1 - - [06/Dec/2021:06:06:23 0000] "GET / HTTP/1.1" 502 157 "-" "PostmanRuntime/7.28.4" "-"
Есть идеи, что происходит?
Комментарии:
1. Верны ли IP — адреса?
172.21.0.1
и172.17.0.1
2. что происходит
172.17.0.1:3050
? (сейчасsist3-tienda-1:3050
)3. @Raptor обновлено, это была попытка исправить 😛
4. Можете ли вы подключиться по телетайпу к указанному IP-адресу и порту?
5. @Raptor, если я попаду в контейнер, который запускает Nginx и Telnet до 127.0.0.1 3050 (где flask показывает, что конечная точка прослушивает) Я получаю:
Trying 127.0.0.1... telnet: Unable to connect to remote host: Connection refused
. То же самое, если я попытаюсь подключиться к telnet снаружи из контейнеров