能否同时使用80端口处理HTTP和Web Socket流量?

32
  1. 我正在构建一个网站,使用web sockets(技术上是Flash sockets)来实现实时通信。
  2. 我希望能够支持那些受到公司/学校防火墙限制的用户,只允许端口80通过。
  3. 我希望能够在单台机器上运行该网站。

以前,我一直使用Apache作为HTTP服务器,并结合一些Python代码监听高位socket来处理websocket相关的事情,但显然这种做法在这里不可行。

我可以将websocket相关的东西移动到另一台服务器上,但我想避免支付第二个VPS的费用(并且必须通过网络连接进行数据库交互而不是本地)。是否有好的方法可以解决这个问题(如Node.js、Nginx等),或者这样做不值得麻烦呢?


可能是什么流行的Web服务器支持HTML5 WebSocket?的重复问题。 - jgauffin
6个回答

16
是的,可以使用node.jsExpressconnect用于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(){...});
})

5
能否请您解释一下它是做什么的? - Sugumar Venkatesan

8

另一种可能性是使用Apache中的mod_proxy将请求重定向到WebSocket服务器。


请注意,pywebsocket 不适用于生产环境,而仅用于测试(客户端实现)- 顺便说一下,它在这方面确实非常出色。 - Levite

5

当然可以做到这一点。

首先需要检查您的Apache版本。您应该拥有2.4+版本。我将展示我的Ubuntu 14.4服务器的命令。

其次,打开必要的Apache模块:

a2enmod proxy
a2enmod proxy_http
a2enmod proxy_wstunnel

打开您域名的配置文件,就像我的情况一样,这是一个文件路径:

/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
谢谢,这很好用。不过RewriteCond和RewriteRule的目的是什么?似乎没有它们也能正常工作。 - CpnCrunch
1
即使五年后,每行代码的解释仍然是必要的。 - Mike 'Pomax' Kamermans

3
为了使用安全的WebSocket,我只需要在我的https虚拟主机中添加以下三行代码即可:
<VirtualHost *:443>

    [...https config...]

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

</VirtualHost>

并启用mod_proxy_wstunnel apache模块(我正在运行apache 2.4.10):

a2enmod proxy_wstunnel

0

GlassFish(和grizzly)如果Java服务器是一个选项,支持在同一端口上同时处理HTTP和WebSockets流量。


-5
简短的回答是不行的,因为你只能在一个端口上监听一个进程。你可以尝试使用443端口,因为它也不会被阻止,只要你不使用https。

1
首先,在某些情况下,多个进程可以监听同一端口(例如Apache每个请求生成一个进程)。其次,可以在一个进程内提供WebSockets服务,即客户端打开TCP连接,根据发送的是(标准)HTTP还是WebSocket进行不同的处理。 - freakish
他指定了Apache和Python。我只是想回答,如果你正在使用Apache和Python,我不知道有没有办法让这两个进程同时侦听同一端口。 - nycynik
11
从技术上讲,多个进程不会监听同一个端口。只有一个进程在监听,当它接收到请求时,该进程会派生出另一个进程来处理该请求,然后再回到监听状态。简而言之,只有一个进程始终在监听。您所说的其他内容完全正确。 - CrazyCasta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接