2017-01-09 7 views
0

Я пытаюсь запустить Apache с Node.JS + Socket.IO с помощью Cloudflare для CDN/защиты, но что-то не так.Apache + Node.JS + Socket.IO + CloudFlare // Ошибка SSL

Я tryied много способов Apache обрабатывать 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.

Я попытался использовать сертификат SSL из Let's Encrypt на Node.JS + Socket.IO, но он дает 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 для обработки поддомена «апи.» , который передается в 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> 

Это работает, но нет веб-узла. Без Apache (работает непосредственно на Express) все работает отлично, включая веб-раскладку. Но мне также нужно запустить Apache, потому что веб-сайт написан на PHP.

Я что-то не так?

ответ

0

Вы можете использовать модуль Apache mod_proxy_wstunnel использовать ProxyPass с WebSocket трафика, например:

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

Тем не менее, нет никакой реальной необходимости прокси WebSocket трафика через Apache. Он использует другой порт для HTTP (S) трафика, поэтому нет никакой реальной необходимости. Вы должны просто использовать библиотеку, например, socket.io и прочь.

+0

Я использую Socket.IO, но по какой-то причине он дает мне ERR_SSL_PROTOCOL_ERROR, когда я пользуюсь SSL. –

+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? Я попытался использовать SSL на Socket.IO, но, как я уже сказал, он дает мне ERR_SSL_PROTOCOL_ERROR. И когда я использую «ProxyPass ws: // localhost: 8080/socket.io /», он дает мне HTTP-ошибку 520 –