HTTP和Web套接字stream量都可以使用端口80吗?

  1. 我build立一个网站,使用networking套接字(技术上的Flash套接字),以提供实时通信。
  2. 我希望能够支持企业/学术防火墙的人员,阻止除80端口以外的任何事情
  3. 我希望能够从一台机器上运行该网站

以前,我一直在使用Apache的HTTP服务结合一些python监听WebSocket的高编号套接字的东西,但显然不会在这里工作。

我总是可以移动WebSocket的东西到一个单独的服务器,但我想避免支付第二个VPS(并且必须通过networking而不是在本地与数据库对话)。 有没有一个好的方法来做到这一点(nodejs,nginx,..?),还是不值得头痛?

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

是的,通过使用node.js。 表示或连接 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(){...}); }) 

当然你可以做到这一点。

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

玩的开心!

如果一个java服务器是一个选项,GlassFish(和灰熊)支持同一端口上的HTTP和websockets流量。

对于那些使用Django的人来说, 频道就是答案。 根据社区,频道将在Django 1.10正式发布。

我试试Channels的原因是:

  • 将http与websocket服务结合的选项
  • Django会话用户身份验证在websocket服务上可用

对于安全的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 

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