例如,我有两个微服务在两个用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:
块,而不会实际影响任何内容。(