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

Posted

技术标签:

【中文标题】是否可以将端口 80 用于 HTTP 和 Web 套接字流量?【英文标题】:Is it possible to use port 80 for both HTTP and web socket traffic? 【发布时间】:2011-08-23 14:23:24 【问题描述】:
    我正在构建一个使用 Web 套接字(技术上是 Flash 套接字)以提供实时通信的网站。 我希望能够支持公司/学术防火墙背后的人,这些防火墙阻止除端口 80 之外的所有内容 我希望能够在一台机器上运行该站点

以前,我一直在使用 Apache 来提供 HTTP 服务,并结合一些 python 在高编号套接字上侦听 websocket 内容,但这显然在这里行不通。

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

【问题讨论】:

What popular webservers have support for html5 WebSocket?的可能重复 【参考方案1】: http://code.google.com/p/pywebsocket/ What popular webservers have support for HTML5 WebSocket? https://serverfault.com/questions/201825/how-would-i-configure-a-websocket-server-to-run-alongside-a-webserver

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

【讨论】:

请注意,pywebsocket 并非用于生产,而仅用于测试(客户端实现)-尽管顺便说一句,它确实很好。【参考方案2】:

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

【讨论】:

-1:首先,在某些情况下,多个进程可以在同一个端口上侦听(分叉:例如 Apache 为每个请求生成一个进程)。其次,服务 WebSockets 可以在一个进程中完成,即客户端打开 TCP 并根据他是发送(标准)HTTP 还是 WebSocket,它以不同的方式处理它。 他指定了 apache 和 python。我只是想回答这个问题,如果您使用 apache 和 python,我不知道有一种方法可以让这两个进程同时在同一个端口上监听。 @freakish 从技术上讲,多个进程在同一个端口上监听。一个进程正在侦听,当它接收到它处理的东西时,该进程分叉处理请求并返回侦听。简而言之,只有一个进程在监听。你说的其他一切都是完全正确的。【参考方案3】:

是的,使用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()...);
)

【讨论】:

你能解释一下它的作用吗?【参考方案4】:

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

【讨论】:

【参考方案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

玩得开心!

【讨论】:

谢谢,这很好用。然而 RewriteCond 和 RewriteRule 的目的是什么?没有这些似乎也能正常工作。 即使在 5 年后,仍然需要解释为什么需要每行。【参考方案6】:

为了安全的 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

【讨论】:

以上是关于是否可以将端口 80 用于 HTTP 和 Web 套接字流量?的主要内容,如果未能解决你的问题,请参考以下文章

上网使用“80端口”是啥意思?

dns可以解决规则吗?

无法创建网站:Http://localhost/website.在端口80的localhost位置上找不到WEB服务器。这个是啥原因啊,

监控HTTP端口80是啥意思

websocket和HTTP使用不同端口可以吗

域名和端口