Проблема с настройкой 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 шт):

Автор решения: Alexey

Надо было заменить async with websockets.server.serve(echo, "мой_хост", 8080, ssl=ssl_context): на async with websockets.serve(echo, "мой_хост", 8080, ssl=ssl_context):. Всем спасибо!

P.S. Слепо доверять коду, сгенерированному ChatGPT, тоже не следует. Он имеет свойство ошибаться...

→ Ссылка