LINUX.ORG.RU

Передать сокет между процессами?

 , ,


0

2

Можно ли сделать как-нибудь такую штуку:

1) nginx принимает соединение 2) в соединении клиент говорит: CONNECT /mypath\r\nConnection: Upgrade 3) nginx решает что ок и физически отдает сокет (а в сокете, скажем, вебсокет) какому-то процессу

Таким образом пришло 5 тыс клиентов, все подключились, дальше через nginx трафик не идет и все сокеты напрямую подключены к тому процессу.

Речь идет о линуксе.

Через unix domain socket можно передавать файловые дескрипторы. Поэтому принципиальная возможность есть. Конкретно для nginx не встречал модулей, делающих подобное.

dmitry_vk ★★★
()

Проблема этого решения в том, что клиент может отправить не только заголовки с Upgrade, но и сразу сообщение вебсокета в надежде, что сервер разрешит Upgrade. nginx в этом случае прочитает всё это разом из сокета и сохранит сообщение во внутреннем буфере, так что при передаче сокета другой процесс не увидит этих данных.

Проще настроить nginx на проксирование вебсокетов.

Sorcerer ★★★★★
()

Кстати, вашему гипотетическому модулю nginx всё равно придётся как-то передать информацию о вебсокете, полученную из заголовков запроса. А также ему придётся решать за вебсокет-сервер, какие приложения/расширения из запрошенных разрешить, какую версию вебсокета сообщить (и тоже это всё передать настоящему серверу). А если вспомнить про wss, то совсем беда.

Sorcerer ★★★★★
()

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

anonymous
()
Ответ на: комментарий от hizel

зачем грубо, есть NIF-ы C-ноды например. Концепт чисто теоретически: подсунуть модуль, смотрящий одним концом в эрланг, другим, дающий сокет.

с другой стороны, что такое сокет? слушатель порта в основном

anonymous
()
Ответ на: комментарий от hizel
{fd, In, Out}:
                  Allows  an  Erlang process to access any currently opened file descriptors used by Erlang. The file descriptor In can be used for stan‐
                  dard input, and the file descriptor Out for standard output. It is only used for various servers in the Erlang operating system  (shell
                  and user). Hence, its use is very limited.

думаю ничего не мешает в нифе получить фд и заюзать как порт.

anonymous
()
Ответ на: комментарий от Sorcerer

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

Главное что бы никаких буферов не осталось в user space отдающего процесса.

В целом решение задачи понятно и скорее всего от неё проще отказаться: править nginx слишком бесперспективно для такого.

max_lapshin ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.