当 flask api 与 uwsgi 一起提供时,Docker 容器无法在它们之间进行通信



例如,我有两个微服务在两个用flask创建的docker容器中运行,并与uwsgi一起提供给nginx代理。Docker撰写的文件看起来像这样:

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不会为我的请求提供服务,但调用里面的容器会起作用。也尝试过使用套接字,但没有成功。

在这种情况下,如何在容器之间进行通信?

uWSGI有一个自定义的有线协议,它比传统的基于文本的HTTP/1协议有一些优势。您的配置和错误消息表明侦听器期望此协议,并且您的Nginx配置可能具有匹配的uwsgi_pass指令。然而,Pythonrequests模块希望使用普通的HTTP,而不是这种自定义协议。

也就是说:你正确地建立了容器之间的连接——你没有得到DNS错误或";连接被拒绝";,比特在虚拟线路上流动,但客户端正在使用HTTP,服务器正在使用uwsgi协议。这种不匹配会导致双方都出现错误。

uWSGI还可以提供一个普通的HTTP服务器。您应该能够将uWSGI配置为运行本机有线协议和标准HTTP:

[uwsgi]
wsgi-file = micro1.py
callable = micro1_api
uwsgi-socket = :8080
http-socket = :9090

Nginx配置可以使用uwsgi_pass micro1:8080,但像requests这样的标准HTTP客户端需要使用HTTP端口http://micro1:9090

您不需要对Docker配置进行任何更改即可使用此功能。现有的expose:块基本上什么都不做,删除它们是安全的。(同样,您应该能够删除文件中的hostname:container_name:和所有networks:块,而不会实际影响任何内容。(

最新更新