我想用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编写的。
我做错了什么?
我使用的是Socket.IO,但由于某种原因,当我使用SSL时,它给了我ERR_SSL_PROTOCOL_ERROR。 –
然后您需要使用WSS而不是WS。使用带有mod_proxy_wstunnel的代理服务器,您可以将WS转换为WSS,或者您可以在这里查看使用Javascript本地执行此操作。 http://www.giacomovacca.com/2015/02/websockets-over-nodejs-from-plain-to.html – mjsa
如何将WS转换为WSS?我试过在Socket.IO上使用SSL,但正如我所说的,它给了我ERR_SSL_PROTOCOL_ERROR。而且,当我使用“ProxyPass ws:// localhost:8080/socket.io /”时,它会给我HTTP错误520 –