是否可以将端口80用于HTTP和Web套接字流量?

时间:2011-05-11 19:34:25

标签: apache http sockets websocket

  1. 我正在构建一个使用网络套接字(技术上是Flash套接字)的网站,以便提供实时通信。
  2. 我希望能够支持阻止除端口80以外的所有内容的公司/学术防火墙背后的人员
  3. 我希望能够从一台机器上运行该网站
  4. 以前,我一直在使用Apache进行HTTP服务,并在一个高编号的套接字上使用一些python监听websocket的东西,但这显然不适用于此。

    我总是可以将websocket的东西移到一个单独的服务器上,但我想避免支付第二个VPS(并且必须通过网络而不是本地与数据库通信)。有没有一个好方法(nodejs,nginx,..?),还是不值得头疼?

6 个答案:

答案 0 :(得分:15)

是,使用node.js。 HTTP文件服务Expressconnect,WebSocket服务socket.io

示例:

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(){...});
})

答案 1 :(得分:7)

答案 2 :(得分:5)

当然你可以这样做。

首先,您必须检查您的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

玩得开心!

答案 3 :(得分:1)

对于安全的websocket,我需要做的就是将这三行添加到我的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>

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

a2enmod proxy_wstunnel

答案 4 :(得分:0)

如果可以选择Java服务器,GlassFish(和grizzly)支持同一端口上的HTTP和websockets流量。

答案 5 :(得分:-5)

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