Вот моя конфигурация:
Apache (1) -> обычное приложение uwsgi (2) -> приложение websocket uwsgi (3)
(1) настроен следующим образом:
ProxyPass /{{prefix}}/static/ !
ProxyPass /{{prefix}}/v3/build/ !
ProxyPass /{{prefix}}/ uwsgi://127.0.0.1:{{admin_uwsgi_port}}/{{prefix}}/
(2) настроен следующим образом, чтобы разгрузить обработку веб-сокета в (3) после авторизации:
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
Наконец, (3) довольно просто:
socket=/run/websockets-staging/socket
plugins=python,http,gevent
http-websockets=true
gevent=1000
Благодаря strace я вижу, что входящий запрос websocket корректно выгружается в (3), (3) отправляет обратно рукопожатие websocket, которое пересылается в (2), которое пересылает его в (1).
Тем не менее, рукопожатие websocket, кажется, теряется на пути к клиентской стороне. то есть, (1) никогда не возвращает никаких данных, и веб-сокет в конечном счете закрывается на стороне клиента, когда рукопожатие не приходит.
Отсюда мой вопрос: что я мог сделать не так?