我举了一个例子,两个微服务运行在两个docker容器中,这两个容器是用flask创建的,并通过uwsgi提供给一个nginx proxy. Docker-compose文件,它看起来像这样:
nginx:
build: ...
container_name: ...
restart: always
hostname: my-host
ports:
- "80:80"
expose:
- 80
networks:
- my-net
micro1:
build: ...
container_name: ...
restart: always
hostname: my-host
expose:
- 8080
networks:
- my-net
micro2:
build: ...
container_name: ...
restart: always
hostname: my-host
expose:
- 8081
networks:
- my-net
我的.ini
文件是这样的
[uwsgi]
wsgi-file = micro1.py
callable = micro1_api
socket = :8080
...
现在我的问题是,我不能在它们之间通信。如果我尝试以requests
为例进行正常请求,我会在Docker容器日志中得到以下错误消息:
invalid request block size: (max 4096)...skip uwsgi
我已经增加了buffer-size
,但是控制台上出现了另一个错误(我认为...):
uwsgi_proto_uwsgi_parser(): Success [proto/uwsgi.c line 40]
在发出请求时超时。
无法切换协议,因为nginx被配置为uwsgi_pass micro1_upstream
,将协议更改为http,nginx将不会为我的请求服务,但调用内部的容器将工作。也尝试使用套接字,但没有运气。
在这种情况下,如何在容器之间进行通信?
1条答案
按热度按时间2hh7jdfx1#
uWSGI有一个custom wire protocol,它比传统的基于文本的HTTP/1协议有一些优点。您的配置和错误消息表明监听器需要这个协议,并且您的Nginx配置可能有一个匹配的
uwsgi_pass
指令。然而,Pythonrequests
模块需要使用普通的HTTP,而不是这个自定义协议。也就是说:你正确地建立了容器之间的连接-你没有得到DNS错误或“连接被拒绝”,比特在虚拟线路上流动-但是客户端说的是HTTP,而服务器期望的是uwsgi协议。这种不匹配导致了你在两端看到的错误。
uWSGI还可以提供normal HTTP server。您应该能够配置uWSGI以运行本地有线协议和标准HTTP:
Nginx配置可以使用
uwsgi_pass micro1:8080
,但是像requests
这样的标准HTTP客户端需要使用HTTP端口http://micro1:9090
。您不需要在Docker配置中做任何更改就可以使用它。现有的
expose:
块基本上什么都不做,删除它们是安全的。(同样,您应该能够删除文件中的hostname:
、container_name:
和所有networks:
块,而不会实际影响任何东西。