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

rhfm7lfc  于 2022-11-02  发布在  Nginx
关注(0)|答案(1)|浏览(165)

我举了一个例子,两个微服务运行在两个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将不会为我的请求服务,但调用内部的容器将工作。也尝试使用套接字,但没有运气。
在这种情况下,如何在容器之间进行通信?

2hh7jdfx

2hh7jdfx1#

uWSGI有一个custom wire protocol,它比传统的基于文本的HTTP/1协议有一些优点。您的配置和错误消息表明监听器需要这个协议,并且您的Nginx配置可能有一个匹配的uwsgi_pass指令。然而,Python requests模块需要使用普通的HTTP,而不是这个自定义协议。
也就是说:你正确地建立了容器之间的连接-你没有得到DNS错误或“连接被拒绝”,比特在虚拟线路上流动-但是客户端说的是HTTP,而服务器期望的是uwsgi协议。这种不匹配导致了你在两端看到的错误。
uWSGI还可以提供normal HTTP server。您应该能够配置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:块,而不会实际影响任何东西。

相关问题