为代理socket.io配置Apache 2.4.7

为代理socket.io配置Apache 2.4.7,apache,sockets,proxy,websocket,socket.io,Apache,Sockets,Proxy,Websocket,Socket.io,在我们的服务器上,我们已经在端口80上运行Apache,在同一台服务器上,我想为socket.io提供服务,我想连接到端口80上的socket.io服务器。所以我试着让Apache连接到代理端口80。我发现这个stackoverflow条目: 我所做的: 我在apache中启用了以下模块: a2enmod rewrite proxy proxy_wstunnel 我在“/etc/apache2/sites available/mysite.conf”中创建了一个新网站,内容如下: <Vi

在我们的服务器上,我们已经在端口80上运行Apache,在同一台服务器上,我想为socket.io提供服务,我想连接到端口80上的socket.io服务器。所以我试着让Apache连接到代理端口80。我发现这个stackoverflow条目:

我所做的:

我在apache中启用了以下模块:

a2enmod rewrite proxy proxy_wstunnel
我在“/etc/apache2/sites available/mysite.conf”中创建了一个新网站,内容如下:

<VirtualHost subdomain.mydomain.com:80>
    Servername subdomain.mydomain.com

    RewriteEngine On
    RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
    RewriteCond %{QUERY_STRING} transport=websocket    [NC]
    RewriteRule /(.*)           ws://localhost:3001/$1 [P,L]

    ProxyPass        /socket.io http://localhost:3001/socket.io
    ProxyPassReverse /socket.io http://localhost:3001/socket.io
</VirtualHost>
并且socket.io客户端正在连接配置为apache的子域:

var socket = io.connect('http://subdomain.mydomain.com/', {query: {extra_info : extra_info}});
一旦我启动了一个客户端。我没有看到socket.io服务器日志中出现任何内容,我添加了很多console.log条目。我在客户端控制台中看到的只是下一个错误:

GET http://subdomain.mydomain.com:8100/socket.io/?extra_info=fe4567&EIO=3&transport=polling&t=1416987210079-31 net::ERR_CONNECTION_TIMED_OUT
如果我将客户端直接连接到socket.io服务器的端口3001http://subdomain.mydomain.com:3001 当我在apache服务器上打开端口3001时,一切正常

我正在运行下一个版本:

Apache:2.4.7 Socket.io服务器和客户端:1.2.1 编辑:

当我在var socket=io.connect'中更改连接URL时http://subdomain.mydomain.com/“,{query:{extra_info:extra_info}};到http://subdomain.mydomain.com:80.

我收到一个不同的错误:

GET http://subdomain.mydomain.com/socket.io/?user_id=2&EIO=3&transport=polling&t=1418122378582-40 
(index):1 XMLHttpRequest cannot load http://subdomain.mydomain.com/socket.io/?extra_info=sdferr&EIO=3&transport=polling&t=1418122378582-40. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://192.168.178.158:8100' is therefore not allowed access. The response had HTTP status code 500.
我认为在Apache中设置Access Control Allow Origin头可以解决这个问题,但事实并非如此。我已将其添加到文件/etc/apache2/sites available/mysite.conf中:


根据我们的评论,这里有一些你可以尝试的东西,不确定

不确定如何同时传递端口和额外信息查询,但想法是设置端口

io.connect('http://subdomain.mydomain.com/', {port: 80})
还是这个

io.connect('http://subdomain.mydomain.com:80/', {query: {extra_info : extra_info}})

祝你好运。

有两件事出了问题。首先,您需要在客户端中指定端口80,以便能够连接到端口80。因此,我将客户端配置为按如下方式连接:

io.connect('http://subdomain.mydomain.com:80/', {query: {extra_info : extra_info}})
<script src="https://cdn.socket.io/socket.io-1.2.1.js"></script>
更改后,您将获得几个CORS问题。我唯一需要更改的是如何检索客户端JS文件。在我的AngularJS应用程序中,我包括socket.io客户端JS文件,如下所示:

io.connect('http://subdomain.mydomain.com:80/', {query: {extra_info : extra_info}})
<script src="https://cdn.socket.io/socket.io-1.2.1.js"></script>
我需要将此更改为:

<script src="http://subdomain.mydomain.com/socket.io/socket.io.js"></script>

socket.io客户端似乎也由socket.io服务器自动提供服务。如果您从自己的服务器检索客户端JS,则不会出现CORS问题。

此端口来自何处….com:8100/?我在其他配置中看不到它?!我也不明白8100端口是从哪里来的。在配置文件中找不到任何内容。客户端配置如何?或代码?客户端没有端口8100的任何端口配置。我按照问题中的描述连接客户机。好吧,我不是这方面的专家,但我认为这是唯一的原因,技术上没有问题,因为没有配置端口8100,所以超时是正常的。如果我是你,我将集中精力查找8100从Yazan哪里来,似乎正在朝着正确的方向发展。有点奇怪,但是将端口80添加到客户端的连接字符串中。解决了第一个问题。但我没有收到访问控制允许原点错误。我试图在Apache中设置此标头,但仍然收到此错误。有什么想法吗?好吧,这很奇怪,虽然8100仍然存在于错误中,但我认为这导致了访问控制允许来源错误,因为访问不同端口的站点被视为不同的域,所以应用了跨域策略。你会对@Yazan有什么想法吗?我应得50%的赏金:哦,我在开玩笑,如果您愿意,您可以恢复:如果您保留它,非常感谢!也许@MarkVeenstra你也有个主意?我从几天前就开始讨论这个话题。。。但不成功