2017-01-09 181 views
0

我想用Node.JS + Socket.IO运行Apache,使用Cloudflare进行CDN /保护,但出现了问题。Apache + Node.JS + Socket.IO + CloudFlare // SSL错误

我tryied了很多办法来处理阿帕奇连接Socket.IO(即不通过SSL),包括的ProxyPass

<VirtualHost *:80> 
    ServerName  play.example.me 
    ServerAlias  example.me 
    DocumentRoot /home/web/ 
    AccessFileName .htaccess 

    <Proxy *> 
     Order deny,allow 
     Allow from all 
    </Proxy> 

    ProxyRequests off 

    <Location /socket.io> 
     ProxyPreserveHost On 
     ProxyPass   ws://localhost:8080/socket.io/ 
     ProxyPassReverse ws://localhost:8080/socket.io/ 
    </Location> 
</VirtualHost> 

这给了520 HTTP错误,这是一个CloudFlare的一般性错误。

我试着用Let's Encrypt对Node.JS + Socket.IO使用SSL证书,但它给出了ERR_SSL_PROTOCOL_ERROR。

,我使用上创建的Node.js服务器的代码是

var app  = new express(); 
var options = { 
     key: fs.readFileSync("/etc/letsencrypt/live/play.example.me/privkey.pem"), 
     cert: fs.readFileSync("/etc/letsencrypt/live/play.example.me/cert.pem"), 
     ca:  fs.readFileSync("/etc/letsencrypt/live/play.example.me/chain.pem"), 
     requestCert:  false, 
     rejectUnauthorized: false 
    }; 

var server  = require("https").createServer(options, app); 
var io   = require("socket.io").listen(server, { serveClient: false }); 

实际上,我使用的ProxyPass处理子域“API”。这是传递给Node.JS/Express:

<VirtualHost *:80> 
    ServerName  api.example.me 
    ServerAlias  example.me 

    ProxyRequests off 

    <Proxy *> 
     Order deny,allow 
     Allow from all 
    </Proxy> 

    <Location /> 
     ProxyPass   http://localhost:8080/ 
     ProxyPassReverse http://localhost:8080/ 
    </Location> 
</VirtualHost> 

这是工作,但WebOSocket没有。 没有Apache(直接在Express上运行)都可以正常工作,包括websocket。但是,我也需要运行Apache,因为该网站是用PHP编写的。

我做错了什么?

回答

0

您可以使用Apache模块mod_proxy_wstunnel使用的ProxyPass用的WebSocket流量,例如:

ProxyPass "/ws2/" "ws://echo.websocket.org/" 
ProxyPass "/wss2/" "wss://echo.websocket.org/" 

这就是说,有通过Apache并不真的需要代理的WebSocket流量。它使用不同的端口到HTTP(S)流量,所以没有真正的需要。你应该可以使用像socket.io这样的图书馆,然后离开你。

+0

我使用的是Socket.IO,但由于某种原因,当我使用SSL时,它给了我ERR_SSL_PROTOCOL_ERROR。 –

+0

然后您需要使用WSS而不是WS。使用带有mod_proxy_wstunnel的代理服务器,您可以将WS转换为WSS,或者您可以在这里查看使用Javascript本地执行此操作。 http://www.giacomovacca.com/2015/02/websockets-over-nodejs-from-plain-to.html – mjsa

+0

如何将WS转换为WSS?我试过在Socket.IO上使用SSL,但正如我所说的,它给了我ERR_SSL_PROTOCOL_ERROR。而且,当我使用“ProxyPass ws:// localhost:8080/socket.io /”时,它会给我HTTP错误520 –