Можно ли использовать порт 80 для трафика HTTP и веб-сокетов? - PullRequest
29 голосов
/ 11 мая 2011
  1. Я создаю сайт, который использует веб-сокеты (технически Flash-сокеты) для обеспечения связи в реальном времени.
  2. Я хочу иметь возможность поддерживать людей за корпоративными / академическими брандмауэрами, которые блокируют все, кроме порта 80
  3. Я бы хотел иметь возможность запускать сайт с одного компьютера

Раньше я использовал Apache для обслуживания HTTP в сочетании с прослушиванием Python на сокете с большим номером для веб-сокетов, но это, очевидно, здесь не сработает.

Я всегда могу переместить материал websocket на отдельный сервер, но я бы хотел не платить за второй VPS (и должен общаться с базой данных по сети, а не локально). Есть хороший способ сделать это (nodejs, nginx, ..?), Или это не стоит головной боли?

Ответы [ 6 ]

15 голосов
/ 11 мая 2011

ДА, используя node.js . Express или connect для обслуживания файлов HTTP и socket.io для содержимого WebSocket.

Пример:

var express = require("express");
var app = express.createServer(); 

app.get('/', function(req, res){ 
    res.redirect("/index.html");
}); 

app.configure(function(){
  app.use(express.static(__dirname + '/public'));
});

app.listen(80); 

var io = require('socket.io'); 
var socket = io.listen(app); 
socket.on('connection', function(client){ 
  client.on('message', function(){...});
})
7 голосов
/ 11 мая 2011

Другая возможностьиспользовать mod_proxy в apache для перенаправления запросов на сервер веб-сокетов.

5 голосов
/ 03 марта 2016

Конечно, вы можете сделать это.

Сначала вы должны проверить версию Apache.У вас должна быть версия 2.4+.Я покажу вам команду для моего сервера в Ubuntu 14.4.

Во-вторых, включите необходимые модули apache:

a2enmod proxy
a2enmod proxy_http
a2enmod proxy_wstunnel

Откройте conf вашего домена, в моем случае это был путь к файлу:

/etc/apache2/sites-available/myDomain.pl.conf

Далее добавьте этот код

<VirtualHost>

.
.
.

RewriteEngine on

RewriteCond %{QUERY_STRING} transport=polling
RewriteRule /(.*)$ http://localhost:3001/$1 [P]

ProxyRequests off
ProxyPass /socket.io ws://localhost:3001/socket.io
ProxyPassReverse /socket.io ws://localhost:3001/socket.io

ProxyPass        /socket.io http://localhost:3001/socket.io
ProxyPassReverse /socket.io http://localhost:3001/socket.io
</VirtualHost>

Окончательно перезапустите ваш apache

service apache2 restart

Получайте удовольствие!

1 голос
/ 18 мая 2017

Для безопасной веб-розетки все, что мне нужно было сделать, это добавить эти три строки в мой https virthualhost:

<VirtualHost *:443>

    [...https config...]

    SSLProxyEngine On
    ProxyPass "/web_socket"  "wss://localhost:7300/web_socket"
    ProxyPassReverse "/web_socket"  "wss://localhost:7300/web_socket"

</VirtualHost>

и включить модуль apache mod_proxy_wstunnel (я использую apache 2.4.10):

a2enmod proxy_wstunnel
0 голосов
/ 22 июня 2011

GlassFish (и grizzly) поддерживают трафик HTTP и веб-сокетов на одном и том же порту, если в качестве опции используется сервер Java.

0 голосов
/ 11 мая 2011

Короткий ответ - нет, потому что вы можете прослушивать только один процесс на одном порту.Вы можете попробовать использовать порт 443, поскольку он также не будет заблокирован, если вы также не используете https.

...