为代理socket.io配置Apache 2.4.7

时间:2014-11-26 07:38:42

标签: apache sockets proxy websocket socket.io

在我们的服务器上,我们已经在端口80上运行Apache,在同一台服务器上我想提供socket.io,我想在端口80上也连接到socket.io服务器。所以我试图让Apache到代理端口80.我发现了这个stackoverflow条目:https://serverfault.com/questions/616370/configuring-apache-2-4-mod-proxy-wstunnel-for-socket-io-1-0

我做了什么:

我启用了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>

在同一台服务器上,我在端口3001上运行了socket.io服务器:

server.listen('3001', function(){
  console.log('Socket.io server listening on *:3001');
});


io.listen(server).on('connection', function(client) {
    // Rest of the code
}

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服务器http://subdomain.mydomain.com:3001的端口3001,那么一切正常(当我在apache服务器上打开端口3001时)。

我正在运行下一个版本:

  • Apache:2.4.7
  • Socket.io服务器&amp;客户:1.2.1

修改

当我将var socket = io.connect('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

Header set Access-Control-Allow-Origin "*"

2 个答案:

答案 0 :(得分:0)

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

不确定如何传递端口和extra_info查询,但想法是设置端口。

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

或者

io.connect('http://subdomain.mydomain.com:80/', {query: {extra_info : extra_info}})
祝你好运。

答案 1 :(得分:0)

哪里出了两件事。首先,您需要在客户端中指定端口80才能连接到端口80.因此,我将客户端配置为如下连接:

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

在此更改后,您将收到几个CORS问题。我唯一需要改变的是如何检索客户端JS文件。在我的AngularJS应用程序中,我包含了socket.io客户端JS文件,如下所示:

<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问题。