【问题标题】:Apache + Node.JS + Socket.IO + CloudFlare // SSL ErrorApache + Node.JS + Socket.IO + CloudFlare // SSL 错误
【发布时间】:2017-05-24 06:43:39
【问题描述】:

我正在尝试使用 Cloudflare 运行带有 Node.JS + Socket.IO 的 Apache 以进行 CDN/保护,但出现了问题。

我尝试了很多方法来让 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 的一般错误。

我尝试在 Node.JS + Socket.IO 上使用 Let's Encrypt 的 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 编写的。

我做错了吗?

【问题讨论】:

    标签: node.js apache proxy socket.io cloudflare


    【解决方案1】:

    您可以使用 Apache Module mod_proxy_wstunnel 将 ProxyPass 与 WebSocket 流量一起使用,例如:

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

    也就是说,没有真正需要通过 Apache 代理 websocket 流量。它使用与 HTTP(S) 流量不同的端口,因此没有必要这样做。您应该可以使用像 socket.io 这样的库,然后就可以了。

    【讨论】:

    • 我正在使用 Socket.IO,但由于某种原因,当我使用 SSL 时,它给了我 ERR_SSL_PROTOCOL_ERROR。
    • 然后您需要使用 WSS 而不是 WS。使用带有 mod_proxy_wstunnel 的代理通行证,您可以将 WS 转换为 WSS,或者您可以在此处查看使用 Javascript 本地执行此操作。 giacomovacca.com/2015/02/…
    • 如何将 WS 转换为 WSS?我尝试在 Socket.IO 上使用 SSL,但正如我所说,它给了我 ERR_SSL_PROTOCOL_ERROR。而且,当我使用“ProxyPass ws://localhost:8080/socket.io/”时,它给了我 HTTP 错误 520
    猜你喜欢
    • 2020-11-22
    • 2018-06-29
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 2015-11-27
    • 2011-12-02
    相关资源
    最近更新 更多