В настоящее время я связываюсь с моим экземпляром Redis из моего клиента iOS с помощью веб-сокета. Я указываю адрес хоста и порт прослушивания и выполняю некоторые команды Redis напрямую из моего клиента IOS.
Причина, по которой я делаю это, потому что я выполняю реальное отслеживание геолокации в реальном времени и выполняю эти команды из моего бэкэнда, который находится на php, приведет к задержке.
Я боюсь, что это не самый безопасный способ, потому что, если кто-то знает мой адрес хоста и порты, он сможет получить доступ к моему экземпляру Redis.
У меня вопрос, как я могу общаться с моим экземпляром Redis из моего клиента iOs с помощью веб-сокета, но более безопасным способом.





Есть несколько способов сделать это, в зависимости от того, как настроен ваш проект. Вы можете добавить балансировщик нагрузки NGINX перед своими контейнерами php / redis, который принимает веб-токены JSON для аутентификации. https://www.nginx.com/blog/authentication-content-based-routing-jwts-nginx-plus/
Redis также может выполнять аутентификацию, но, похоже, это не лучшая практика, но вы также можете найти дополнительную информацию об этом здесь: https://redis.io/commands/auth
Похоже, вы могли бы взаимодействовать с redis с помощью команд HTTP-запроса, дайте мне знать, что вы думаете об этом: nginx.com/resources/wiki/modules/redis
@ThatCampbellKid - добавление HTTP-запросов увеличит задержку, а не минимизирует ее из-за накладных расходов (например, заголовков и т. д.).
@ Ахмед,
Я прочитал ответ @ThatCampbellKid и комментарии и понимаю ваше желание, чтобы клиент iOS напрямую взаимодействовал с сервером Redis.
Однако Redis НЕ был разработан для этого подхода. Как указано в документации (курсив добавлен):
Redis is designed to be accessed by trusted clientsinsidetrusted environments.
Интернет - это нет, доверенная среда, и прямой доступ позволяет получить доступ к Redis для недоверенных клиентов.
В той же документации приводится следующий пример (выделено мной):
In the common case of a single computer directly exposed to the internet, such as a virtualized Linux instance (Linode, EC2, ...), the Redis port should be firewalled to prevent access from the outside. Clients will still be able to access Redis using the loopback interface.
Правильный подход - использовать динамическое приложение для аутентификации клиентов и моста между клиентами и сервером Redis.
Вы можете использовать JWT (модуль nginx, предложенный @ThatCampbellKid), PHP, Ruby, node.js, Java, C или что угодно, но вам нужно будет что-то использовать.
Мне жаль это говорить, но любой другой ярлык подвергнет вашу систему угрозе безопасности.
РЕДАКТИРОВАТЬ:
Да, вы все еще можете использовать WebSocket.
Разница в том, что эта архитектура небезопасна:
Client <=(WebSockets)=> Redis
И эта архитектура безопасна (при правильной реализации):
Client <=(WebSockets)=> Authentication Layer <=(TCP)=> Redis
так что это означает, что я не могу использовать веб-сокеты для прямого подключения к Redis. Я должен использовать http, и это увеличит задержку. Если это единственный вариант, как можно уменьшить задержку?
Вы можете использовать WebSockets. Нет необходимости добавлять в смесь задержку HTTP. Вам просто нужно подключить WebSockets через уровень аутентификации.
@ Ахмед, пожалуйста. Я обновил ответ, чтобы пояснить, что я имел в виду. Я желаю вам успеха.
просто чтобы убедиться. Под уровнем аутентификации вы подразумеваете сертификат SSL или другую форму аутентификации.
@Ahmed, под уровнем аутентификации я имею в виду уровень, который проверяет учетные данные клиента. Учетные данные клиента могут быть основаны на TLS / SSL (с клиентом, представляющим определенный доверенный сертификат), на основе пароля / токена или чего-то еще. Важной частью является то, что только доверенным клиентам будет разрешено подключаться к серверу Redis.
Как вы сказали, вы уже используете Nginx, посмотрите Модуль веб-сокетов nchan
Затем ваша установка Nginx может обслуживать соединения через веб-сокеты напрямую, и она поддерживает несколько методов аутентификации клиента, а также прямую интеграцию с Redis.
У меня есть сервер NGINX. Проблема, которую я хочу напрямую общаться с REDIS без участия php из-за задержки. Если я использую балансировщик нагрузки NGINX, мне нужно отправить HTTP-запрос в NGINX, верно?