配置 Apache 2.4.7 以进行代理 socket.io



在我们的服务器上,我们已经在端口 80 上运行 Apache,在同一台服务器上,我想为 socket.io 提供服务,我也想在端口 80 上连接到 socket.io 服务器。所以我试图让 Apache 代理端口 80。我发现了这个堆栈溢出条目: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 服务器的端口 3001,http://subdomain.mydomain.com:3001一切正常(当我在 apache 服务器上打开端口 3001 时)。

我正在运行下一个版本:

  • 阿帕奇:2.4.7
  • Socket.io 服务器和客户端:1.2.1

编辑:

当我将var socket = io.connect('http://subdomain.mydomain.com/', {query: {extra_info : extra_info}});中的连接 URL 更改为 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 "*"

根据我们的评论,这里有一些你可以尝试的事情,但不确定。

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

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

或者这个

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

祝你好运。

那里有

2 件事出错。首先,您需要在客户端中指定端口 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 问题。

相关内容

  • 没有找到相关文章

最新更新