Aqui está minha configuração:
Apache (1) - > aplicativo normal uwsgi (2) - > websocket uwsgi app (3)
(1) é configurado da seguinte forma:
ProxyPass /{{prefix}}/static/ !
ProxyPass /{{prefix}}/v3/build/ !
ProxyPass /{{prefix}}/ uwsgi://127.0.0.1:{{admin_uwsgi_port}}/{{prefix}}/
(2) é configurado da seguinte maneira para transferir o processamento do websocket para (3) após a autorização:
socket=127.0.0.1:9097
master=true
workers=1
offload-threads=2
collect-header=Content-Type CONTENT_TYPE
collect-header=Subscription SUBSCRIPTION
response-route-if=equal:${CONTENT_TYPE};text/event-stream addvar:SUBSCRIPTION=${SUBSCRIPTION}
response-route-if=equal:${CONTENT_TYPE};text/event-stream disableheaders: response-route-if=equal:${CONTENT_TYPE};text/event-stream uwsgi:/run/websockets-staging/socket,0,0
Finalmente, (3) é bastante simples:
socket=/run/websockets-staging/socket
plugins=python,http,gevent
http-websockets=true
gevent=1000
Graças a strace, vejo que a requisição de websocket de entrada é transferida corretamente para (3), (3) retorna o handshake do websocket que é encaminhado para (2) que o encaminha para (1).
No entanto, o handshake websocket parece ser perdido no caminho de volta para o lado do cliente. isto é, (1) nunca retorna nenhum dado e o websocket é eventualmente fechado no lado do cliente quando o handshake não chega.
Por isso, minha pergunta: o que eu poderia ter feito de errado?