2017-01-09 228 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 –