настройка сервера python websockets на хосте, таком как render.com

Вопрос или проблема

У меня есть серверный код, написанный на python websockets (сервер полностью обслуживает вебсокеты), который я протестировал и который работает на localhost. Я пытаюсь настроить сервер на render.com с этим кодом, но у меня возникли проблемы. URL, который предоставляет render.com, выглядит примерно так: https://sample-site.onrender.com. В серверном коде есть строка:

start_server = websockets.serve(main, "0.0.0.0", 8765)

и в консоли появилось сообщение Ваш сервис активен 🎉. У меня возникают проблемы с подключением к нему с моим клиентским кодом (также используя пакет python websockets)

websockets.connect('ws://sample-site.onrender.com:8765')

при попытке подключиться в консоли на стороне сервера ничего не отображается, и у меня истекает время ожидания на клиентской стороне.

Код, который я тестировал, использовал только ws (не wss), поэтому я попытался подключиться с URL в качестве ws вместо wss, но это не сработало. Оба варианта вернули ошибку истечения времени ожидания при попытке подключиться. Ошибка выглядит так:

"C:\Users\...\Python\Python312\Lib\asyncio\proactor_events.py", line 729, in sock_connect
    return await self._proactor.connect(sock, address)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
asyncio.exceptions.CancelledError

что привело к истечению времени ожидания программы при подключении.

Если бы мне пришлось угадать, я бы сказал, что это связано с тем, что wss не работает, поскольку wss не работает в моих клиентских тестах, но я не знаю, в каком направлении это исправить: понизить с wss до ws или обновить мой код, чтобы работать с wss. Буду признателен за направление, куда двигаться.

Ответ или решение

Настройка веб-сокетов-сервера на Render.com

Настройка Python веб-сокетов-сервера на хостинге, таком как Render.com, может представлять некоторые трудности, особенно для тех, кто впервые работает с данной технологией. Давайте разберёмся в этой задаче шаг за шагом.

1. Подготовка окружения

Убедитесь, что у вас установлен Python (рекомендуется версия 3.7 или выше) и пакет websockets. Если этого ещё нет, установите его с помощью pip:

pip install websockets

2. Написание кода серверной части

Ваш код, судя по всему, выглядит следующим образом:

import asyncio
import websockets

async def main(websocket, path):
    async for message in websocket:
        await websocket.send(f"Сообщение получено: {message}")

start_server = websockets.serve(main, "0.0.0.0", 8765)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

3. Деплой на Render.com

Render.com позволяет запускать Python приложения. Ваши шаги будут следующими:

  1. Создание нового сервиса: Выберите тип сервиса «Web Service»

  2. Настройка репозитория: Свяжите ваш репозиторий (например, на GitHub) с Render.com.

  3. Конфигурация: Обязательно укажите команду развертывания. Возможно, вам потребуется добавить в ваши зависимости файл requirements.txt, в котором будет указано:

    websockets
  4. Настройка порта: Render.com автоматически предоставляет переменную окружения PORT, которая содержит номер порта. Измените вашу серверную часть на:

    import os
    
    start_server = websockets.serve(main, "0.0.0.0", int(os.environ["PORT"]))

4. Подключение с клиентской стороны

Теперь разберёмся с клиентом. Для подключения к веб-сокетам на Render.com необходимо использовать безопасный протокол wss. Попробуйте подключение следующим образом:

import asyncio
import websockets

async def connect():
    uri = "wss://sample-site.onrender.com"  # Согласно URL, который вы получили
    async with websockets.connect(uri) as websocket:
        await websocket.send("Привет серверу!")
        response = await websocket.recv()
        print(f"Ответ от сервера: {response}")

asyncio.get_event_loop().run_until_complete(connect())

5. Устранение неполадок

Если вы всё ещё сталкиваетесь с проблемами соединения, проверьте следующее:

  1. Ошибка таймаута: Убедитесь, что ваш сервер на Render.com действительно запущен и активен. Посмотрите логи в консоли Render.com на предмет ошибок.

  2. Сертификаты: Убедитесь, что никто не блокирует соединение. Возможно, вам стоит попытаться подключиться из сети, не имеющей ограничений.

  3. Переменная окружения PORT: Проверяйте, что ваш сервер слушает именно тот порт, который указан в переменной окружения.

Заключение

Правильная настройка веб-сокетов на облачном хостинге требует внимания к деталям, особенно когда дело касается управления портами и протоколами безопасности. Следуя данным шагам и рекомендациям, вы сможете успешно развернуть свой Python веб-сокет сервер на Render.com и обеспечить надёжную связь с клиентскими приложениями. Не забывайте проверять логи и проводить тестирование на каждом этапе, чтобы исключить возможные проблемы.

Оцените материал
Добавить комментарий

Капча загружается...