以前,我一直在使用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的原因是:
对于安全的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。