在我们的服务器上,我们已经在端口 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 问题。