我想用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 –