在我们的服务器上,我们已经在端口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时)。
我正在运行下一个版本:
修改
当我将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 "*"
答案 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问题。