在Apache中,我如何configuration一个子URLredirect到socket.io?

我有一个简单的node.js websocket服务器:

var io = require('socket.io')(12345); io.on('connection', function(socket){ console.log('a user connected'); socket.on('disconnect', function(){ console.log('user disconnected'); }); socket.on('test', function(msg){ console.log('test msg: ' + msg); io.emit('test', 'Test answer'); }); }); 

我连接到它,它与iocat正确响应:

 me@whatever:~/prj/client$ iocat --socketio ws://localhost:12345 -e test > adsa > [ 'Test answer' ] 

所以现在我想configurationApache服务器的sslredirect到我的项目的某个子url到这个websocket

我有一个Apacheconfiguration为在https:// localhost / prj服务我的项目

我想在https:// localhost / prj / socket中使用websocket

所以searchnetworking,所以我find了两种可能的方式来做到这一点:

1 – 单独的ProxyPass

 <Location /prj/socket> ProxyPass ws://localhost:12345 ProxyPassReverse ws://localhost:12345 </Location> 

2-重写ProxyPass

 <Location /agora/socket> RewriteEngine On RewriteCond %{REQUEST_URI} ^/agora/socket/socket.io [NC] RewriteCond %{QUERY_STRING} transport=websocket [NC] RewriteRule ^/agora/socket/(.*) "ws://localhost:12345/$1" [P,L] ProxyPass /agora/socket/socket.io ws://localhost:12345/socket.io ProxyPassReverse /agora/socket/socket.io ws://localhost:12345/socket.io </Location> 

但他们都没有工作。 连接已build立但服务器不响应:

 me@whatever:~/prj/client$ iocat --socketio https://localhost/prj/socket -e teste > asdfasd > asdasd > 

我得到这个信息的页面:

https://github.com/socketio/socket.io/issues/1696

https://stackoverflow.com/questions/27526281/websockets-and-apache-proxy-how-to-configure-mod-proxy-wstunnel

日志中没有错误,它不会工作。 于是增加了Apache LogLevel来查看规则在哪里被重写。 我把它设置为LogLevel alert rewrite:trace6 。 之后,我得到了这个日志在web服务器连接:

 [Tue Aug 01 13:22:14.510992 2017] [rewrite:trace2] [pid 28400] mod_rewrite.c(476): [client 127.0.0.1:36004] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78520a0/initial] init rewrite engine with requested uri /socket.io/ [Tue Aug 01 13:22:14.511023 2017] [rewrite:trace3] [pid 28400] mod_rewrite.c(476): [client 127.0.0.1:36004] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78520a0/initial] applying pattern '^/agora/socket/(.*)' to uri '/socket.io/' [Tue Aug 01 13:22:14.511029 2017] [rewrite:trace1] [pid 28400] mod_rewrite.c(476): [client 127.0.0.1:36004] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78520a0/initial] pass through /socket.io/ [Tue Aug 01 13:22:14.922563 2017] [rewrite:trace2] [pid 28401] mod_rewrite.c(476): [client 127.0.0.1:36010] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78520a0/initial] init rewrite engine with requested uri /socket.io/ [Tue Aug 01 13:22:14.922607 2017] [rewrite:trace3] [pid 28401] mod_rewrite.c(476): [client 127.0.0.1:36010] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78520a0/initial] applying pattern '^/agora/socket/(.*)' to uri '/socket.io/' [Tue Aug 01 13:22:14.922616 2017] [rewrite:trace1] [pid 28401] mod_rewrite.c(476): [client 127.0.0.1:36010] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78520a0/initial] pass through /socket.io/ [Tue Aug 01 13:22:15.609710 2017] [rewrite:trace2] [pid 28403] mod_rewrite.c(476): [client 127.0.0.1:36014] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78520a0/initial] init rewrite engine with requested uri /socket.io/ [Tue Aug 01 13:22:15.609755 2017] [rewrite:trace3] [pid 28403] mod_rewrite.c(476): [client 127.0.0.1:36014] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78520a0/initial] applying pattern '^/agora/socket/(.*)' to uri '/socket.io/' [Tue Aug 01 13:22:15.609766 2017] [rewrite:trace1] [pid 28403] mod_rewrite.c(476): [client 127.0.0.1:36014] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78520a0/initial] pass through /socket.io/ [Tue Aug 01 13:22:15.950666 2017] [rewrite:trace2] [pid 28402] mod_rewrite.c(476): [client 127.0.0.1:36020] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78500a0/initial] init rewrite engine with requested uri /socket.io/ [Tue Aug 01 13:22:15.950714 2017] [rewrite:trace3] [pid 28402] mod_rewrite.c(476): [client 127.0.0.1:36020] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78500a0/initial] applying pattern '^/agora/socket/(.*)' to uri '/socket.io/' [Tue Aug 01 13:22:15.950724 2017] [rewrite:trace1] [pid 28402] mod_rewrite.c(476): [client 127.0.0.1:36020] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78500a0/initial] pass through /socket.io/ [Tue Aug 01 13:22:18.329478 2017] [rewrite:trace2] [pid 28399] mod_rewrite.c(476): [client 127.0.0.1:36024] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78500a0/initial] init rewrite engine with requested uri /socket.io/ [Tue Aug 01 13:22:18.329512 2017] [rewrite:trace3] [pid 28399] mod_rewrite.c(476): [client 127.0.0.1:36024] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78500a0/initial] applying pattern '^/agora/socket/(.*)' to uri '/socket.io/' [Tue Aug 01 13:22:18.329519 2017] [rewrite:trace1] [pid 28399] mod_rewrite.c(476): [client 127.0.0.1:36024] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78500a0/initial] pass through /socket.io/ [Tue Aug 01 13:22:18.668606 2017] [rewrite:trace2] [pid 28424] mod_rewrite.c(476): [client 127.0.0.1:36030] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78520a0/initial] init rewrite engine with requested uri /socket.io/ [Tue Aug 01 13:22:18.668649 2017] [rewrite:trace3] [pid 28424] mod_rewrite.c(476): [client 127.0.0.1:36030] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78520a0/initial] applying pattern '^/agora/socket/(.*)' to uri '/socket.io/' [Tue Aug 01 13:22:18.668658 2017] [rewrite:trace1] [pid 28424] mod_rewrite.c(476): [client 127.0.0.1:36030] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78520a0/initial] pass through /socket.io/ 

当我尝试发送消息时,

 [Tue Aug 01 13:26:55.653675 2017] [rewrite:trace2] [pid 28400] mod_rewrite.c(476): [client 127.0.0.1:37454] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78500a0/initial] init rewrite engine with requested uri /socket.io/ [Tue Aug 01 13:26:55.653723 2017] [rewrite:trace3] [pid 28400] mod_rewrite.c(476): [client 127.0.0.1:37454] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78500a0/initial] applying pattern '^/agora/socket/(.*)' to uri '/socket.io/' [Tue Aug 01 13:26:55.653734 2017] [rewrite:trace1] [pid 28400] mod_rewrite.c(476): [client 127.0.0.1:37454] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78500a0/initial] pass through /socket.io/ [Tue Aug 01 13:26:55.987130 2017] [rewrite:trace2] [pid 28402] mod_rewrite.c(476): [client 127.0.0.1:37460] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78500a0/initial] init rewrite engine with requested uri /socket.io/ [Tue Aug 01 13:26:55.987173 2017] [rewrite:trace3] [pid 28402] mod_rewrite.c(476): [client 127.0.0.1:37460] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78500a0/initial] applying pattern '^/agora/socket/(.*)' to uri '/socket.io/' [Tue Aug 01 13:26:55.987182 2017] [rewrite:trace1] [pid 28402] mod_rewrite.c(476): [client 127.0.0.1:37460] 127.0.0.1 - - [localhost/sid#7f48e6578ae0][rid#7f48d78500a0/initial] pass through /socket.io/ 

AFAIU重写规则正在被应用。 任何人都知道为什么服务器没有响应?

任何帮助赞赏。 谢谢。

最简单的事情往往是最难find:)

我解决了第一个解决scheme(只使用ProxyPass):

 <Location /prj/socket/> ProxyPass http://localhost:12345/a ProxyPassReverse http://localhost:12345/ </Location> 

唯一的问题是我正在使用ws://协议。 当我改为http://它工作正常。 感谢任何关心的人:)