作為示例,我有兩個微服務在兩個 docker 容器中運行,這些容器是用燒瓶創建的,并與 uwsgi 一起提供給nginx 代理。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 不會滿足我的請求,但呼叫里面的容器會起作用。也嘗試使用套接字,但沒有運氣。
在這種情況下,如何在容器之間進行通信?
uj5u.com熱心網友回復:
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,但是標準的 HTTP 客戶端requests需要使用 HTTP 埠,http://micro1:9090.
您不需要對 Docker 配置進行任何更改即可使用它。現有的expose:塊基本上什么都不做,洗掉它們是安全的。(同樣,您應該能夠洗掉檔案中的hostname:、container_name:和所有networks:塊而不會實際影響任何內容。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/515783.html
