Проблема с настройкой WebSocket Secure
Делаю что-то вроде чат-бота с использованием WebSocket. Клиент на нативном JavaScript, сервер на Python. Вот минимально-воспроизводимые примеры:
server.py
import asyncio
import websockets
async def echo(websocket, path):
async for message in websocket:
await websocket.send("Сообщение получено: " + message)
await websocket.send("Здесь должен быть ответ на сообщение...")
async def main():
async with websockets.serve(echo, "мой_хост", 1234):
await asyncio.Future()
asyncio.run(main())
client.js
<script>
const socket = new WebSocket('ws://мой_хост:1234');
</script>
Так все прекрасно работает. Следующий шаг - сделать все, используя вместо простого WS WSS. Внес следующие изменения в код соотвественно:
server.py
import asyncio
import websockets
import ssl
async def echo(websocket, path):
async for message in websocket:
await websocket.send("Сообщение получено: " + message)
await websocket.send("Здесь должен быть ответ на сообщение...")
async def main():
ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ssl_context.load_cert_chain(certfile="прописал_путь_к,сертификату", keyfile="прописал_путь_к_ключу")
async with websockets.server.serve(echo, "мой_хост", 443, ssl=ssl_context):
await asyncio.Future()
asyncio.run(main())
client.js
<script>
const socket = new WebSocket('wss://мой_хост:443');
</script>
Запускаю сервер nohup python3 -m server.py &
.
Беда вся в том, что клиент выдает в консоль браузера следующую ошибку:
WebSocket connection to 'wss://мой_хост/' failed:
Что я делаю не так?
Использую платформу для web-хостинга Plesk. Версия Apache 2.4.52, версия nginx 1.24.0. Предпологаю, что Apache явяется основным. ОС Ubuntu 22.04.4 LTS.
UPD
Попробовал добавить в /var/www/vhosts/system/мой_хост/conf/httpd.conf
строчки...
ProxyPass /wss/ wss://мой_хост:443/
ProxyPassReverse /wss/ wss://мой_хост:443/
...для проксирования и перезапустить сервер. Не помогло...
UPD Добавил дополнительные директивы nginx:
location /wss/ {
proxy_pass https://мой_хост:443;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
...тоже ничего не выходит.
UPD Сформулирую вопрос: Как настроить WSS для Ubuntu?
UPD Можно, конечно, без проксирования все сделать, чтобы клиент и сервер взаимодейтсвовали напрямую. Но даже это не получается...поменял порт с 443 на 8080 как в клиенте, так и в сервере...пишет все те же "connection to 'wss://мой_хост/' failed"
UPD
Запускаю сервер просто как python3 -m server.py
и получаю следующую ошибку:
File "/usr/lib/python3.10/runpy.py", line 187, in _run_module_as_main
mod_name, mod_spec, code = _get_module_details(mod_name, _Error)
File "/usr/lib/python3.10/runpy.py", line 110, in _get_module_details
__import__(pkg_name)
File "/var/www/vhosts/мой_хост/httpdocs/chatbot/server.py", line 21, in <module>
asyncio.run(main())
File "/usr/lib/python3.10/asyncio/runners.py", line 44, in run
return loop.run_until_complete(main)
File "/usr/lib/python3.10/asyncio/base_events.py", line 649, in run_until_complete
return future.result()
File "/var/www/vhosts/мой_хост/httpdocs/chatbot/server.py", line 18, in main
async with websockets.server.server(echo, "мой_хост", 8080, ssl=ssl_context):
File "/usr/local/lib/python3.10/dist-packages/websockets/imports.py", line 92, in __getattr__
raise AttributeError(f"module {package!r} has no attribute {name!r}")
AttributeError: module 'websockets' has no attribute 'server'. Did you mean: 'serve'?
Ответы (1 шт):
Надо было заменить async with websockets.server.serve(echo, "мой_хост", 8080, ssl=ssl_context):
на async with websockets.serve(echo, "мой_хост", 8080, ssl=ssl_context):
. Всем спасибо!
P.S. Слепо доверять коду, сгенерированному ChatGPT, тоже не следует. Он имеет свойство ошибаться...