Какова правильная конфигурация Apache для Python Socket.IO с socket.io-client? Сервер излучает клиентам. Обратный прокси?
Стек приложений:
- AWS Elastic Beanstalk (Amazon Linux 2)
- Питон 3.8
- Flask-SocketIO 5.2.0
- Procfile с
web:gunicorn --worker-class eventlet -w 1 squiggy:application
(«squiggy» — это название приложения) - Внешний интерфейс: Vue.js v2.6, socket.io-client v4.5.1
- Апачи
Ошибка, которую я вижу в консоли клиента:
err: Error: websocket error
at h.onError (https://app3-dev.ets-berkeley-suitec.net/static/js/chunk-vendors.9d4cbd19.js:95:119454)
at WebSocket.ws.onerror (https://app3-dev.ets-berkeley-suitec.net/static/js/chunk-vendors.9d4cbd19.js:53:3346)
context: undefined
description: Event
isTrusted: true
bubbles: false
cancelBubble: false
cancelable: false
composed: false
currentTarget: WebSocket {url: 'wss://app3-dev.ets-berkeley-suitec.net/socket.io/?whiteboardId=355&EIO=4&transport=websocket', readyState: 3, bufferedAmount: 0, onopen: ƒ, onerror: ƒ, …}
defaultPrevented: false
eventPhase: 2
path: []
returnValue: true
srcElement: WebSocket {url: 'wss://app3-dev.ets-berkeley-suitec.net/socket.io/?whiteboardId=355&EIO=4&transport=websocket', readyState: 3, bufferedAmount: 0, onopen: ƒ, onerror: ƒ, …}
target: WebSocket {url: 'wss://app3-dev.ets-berkeley-suitec.net/socket.io/?whiteboardId=355&EIO=4&transport=websocket', readyState: 3, bufferedAmount: 0, onopen: ƒ, onerror: ƒ, …}
timeStamp: 559404.1000000015
type: "error"
Event
type: "TransportError"
message: "websocket error"
stack: "Error: websocket error
at h.onError (https://app3-dev.ets-berkeley-suitec.net/static/js/chunk-vendors.9d4cbd19.js:95:119454)
at WebSocket.ws.onerror (https://app3-dev.ets-berkeley-suitec.net/static/js/chunk-vendors.9d4cbd19.js:53:3346)"
Пример из Apache access_log:
"GET /socket.io/?whiteboardId=355&EIO=4&transport=websocket HTTP/1.1" 400 27 "-"
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/101.0.0.0 Safari/537.36"
Ошибка Python на стороне сервера:
Invalid websocket upgrade [in /var/app/venv/staging-LQM1lest/lib/python3.7/site-packages/engineio/server.py:747]
Соответствующий фрагмент конфигурации Apache:
<VirtualHost *:443>
<IfModule !proxy_module>
LoadModule proxy_module /etc/httpd/modules/mod_proxy.so
</IfModule>
<IfModule !proxy_wstunnel_module>
LoadModule proxy_wstunnel_module /etc/httpd/modules/mod_proxy_wstunnel.so
</IfModule>
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
Header set Access-Control-Allow-Origin "*"
# Required for socket.io's polling transport
RewriteEngine on
RewriteCond %{QUERY_STRING} transport=websocket
RewriteRule /(.*)$ ws://localhost:8000/$1 [P]
# Proxy websocket connections
ProxyPass /socket.io/ ws://localhost:8000/socket.io/dist/
ProxyPassReverse /socket.io/ ws://localhost:8000/socket.io/dist/
ProxyPass / http://localhost:80/ retry=0
ProxyPassReverse / http://localhost:80/
ProxyPreserveHost on
RequestHeader set X-Forwarded-Proto "https" early
</VirtualHost>
Что не так с конфигурацией Apache? Нужна ли мне другая настройка ProxyPassReverse? Как мне учитывать протокол «wss»?
Благодарю вас!