Запуск сервера веб-сокетов и сервера http на одном сервере


8

Я использую nginx для обслуживания экземпляра приложения PHP, а также одновременно запускаю приложение Ratchet для прослушивания соединения через веб-сокет. Проблема в том, что оба этих экземпляра используют один и тот же порт (80).

Как мне настроить сервер, чтобы я мог обслуживать оба?

Изменить: Просто вернулся, чтобы увидеть, что вопрос был понижен несколько раз, по понятным причинам, я не задавал вопрос четко. Я прошу прощения за это. Я сделал все должное усердие, хотя. Я постараюсь уточнить, что я спрашивал, возможно, я неправильно понял некоторые аспекты протокола websocket, в этом случае, пожалуйста, исправьте меня:

Я хорошо знаю, что может быть только один процесс, прослушивающий конкретный порт, но у меня действительно есть проблема, связанная с веб-сокетом, насколько я понимаю, запрос веб-сокета начинается с HTTP-рукопожатия, после которого будет механизм «обновить» этот сеанс до определенного порта.

Из того, что я прочитал, кажется, что этот механизм обновления обрабатывается веб-сервером. Итак, как мне настроить nginx для работы с этим процессом?

В общем, единственное, что меня беспокоит при запуске сервера websocket на порте, отличном от 80, - это возможность блокировки порта. Это беспокойство необоснованно? Любой совет, как мне это настроить?


that_guy - пожалуйста, просмотрите serverfault.com/help/how-to-ask - убедитесь, что вы сделали должную осмотрительность перед публикацией. Хотя нам нравятся люди, задающие вопросы, нам также нравится, когда люди делают свою домашнюю работу.
ETL

Ответы:


16

Страшно написанный вопрос, но термин, который я искал, был обратным прокси.

По сути, точно так же, как nginx может пересылать разные запросы нескольким экземплярам веб-приложения на основе пути или имени хоста, он также может быть настроен для «пересылки» запроса на экземпляр сервера websocket. например:

location /socket {
    proxy_pass http://websocket;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
}

upstream websocket{
    server localhost:8000;
}

map $http_upgrade $connection_upgrade {
    default Upgrade;
    '' close;
}

HTTP-запросы http://hostnameбудут обрабатываться на обычной html-странице, а подключение к веб-сокету wss://hostname/socketбудет перенаправлено экземпляру веб-сокета на том же сервере, который прослушивает порт 8000.


Огромная помощь !! Спасибо
Gunjot Singh

Другими полезными опциями внутри этого блока местоположения были бы proxy_read_timeoutи proxy_write_timeoutпредотвращение отключений при неактивности.
Ви.

Не удалось решить проблему, нужна помощь!
Nɪsʜᴀɴᴛʜ

2

На сервере не может быть двух разных программ, прослушивающих один и тот же порт / IP-адрес. В противном случае, как трафик будет перенаправлен в Application XYZ, если несколько приложений могут быть связаны с одним и тем же портом?

Вы можете узнать больше о портах от Port (компьютерная сеть)

То, что вам нужно сделать, это один из следующих вариантов:

  1. Используйте другой порт для одного из двух приложений и разрешите это через брандмауэр.
  2. Используйте два разных IP-адреса и привязывайте каждое приложение к соответствующим IP-адресам.

Ваш брандмауэр просто необходимо настроить в соответствии с тем, что вы настроили.


Можете ли вы предоставить больше информации? это вызвало бы проблему с брандмауэром? разве одно из преимуществ websocket - это избежать этого?
'33

5
Совместное использование порта возможно, поскольку в одном процессе вы можете использовать как HTTP-сервер, так и сервер Websocket.
Пейсер

0

У вас есть два варианта:

  1. Привязать один к другому порту (например, 8000)
  2. (если возможно) добавить дополнительный IP-адрес к серверу и привязать веб-сервер и сервер веб-сокета к различным IP-адресам
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.