当前位置: 首页 > 知识库问答 >
问题:

Apache+Node.js+Socket.io+CloudFlare//SSL错误

宿建本
2023-03-14

我试图使用Cloudflare为CDN/保护运行带有Node.js+Socket.io的Apache,但是出了问题。

<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> 

我用来在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编写的。

共有1个答案

田硕
2023-03-14

您可以使用Apache模块mod_proxy_wstunnel将ProxyPass与WebSocket通信一起使用,例如:

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

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

 类似资料:
  • 我的网站流量通过Cloudflare激活了完整的通用SSL。 在apache虚拟主机中,我有以下配置: 我的Node.js服务器通过HTTPS:

  • 问题内容: 我正在寻找一种通过以下方式集成Node.js + Socket.io + Apache的方法:我希望apache继续提供HTML / JS文件。我希望node.js侦听端口8080上的连接。如下所示: 如果我访问连接到该服务器的HTML,它可以工作,但是我需要转到mydomian.com:8080/index.html。我想要的是能够去mydomian.com/index.html。并

  • 我正在使用CloudFlare实现一个REST API。我需要添加一些在node.js上用socket.io实现的通知。当socket.io使用活动连接来保持客户机更新时,它将工作,因为连接是在服务器-客户机之间建立的,但是当socket.io进行轮询时会发生什么呢?CloudFlare是否总是为每个客户机使用相同的服务器?

  • 问题内容: 我正在尝试使用我的SSL证书运行socket.io,但是它将无法连接。 我基于聊天示例创建代码: 如果我删除SSL代码,它运行正常,但是与此同时,我收到了一个请求,请求http://domain.com/socket.io/1/?t=1309967919512 请注意,它没有尝试使用https,这会导致它失败。 我正在测试chrome,因为它是该应用程序的目标浏览器。 抱歉,这是一个简

  • 正如标题所示,我试图让Apache和socket.io(node.js)更好地发挥作用,尤其是在SSL上。目前,https://www.example.com的客户端应用程序使用socket.io over SSL连接到服务器[SSL protocol]://socket.example.com/socket.io/?query_stuff*。到wss://的连接总是失败,所以socket.io降

  • 那么... 我在端口8080的服务器上运行了一个节点应用程序,我正在尝试使用NGINX和CloudFlare使其能够通过SSL工作。请注意以下几点。。。 我的主机正在运行Ubuntu 16.04 LTS ...我以前的NGINX配置看起来像。。。 ...现在看起来。。。 ...我遵循了这里的例子和它在这里提供的链接,我怀疑上面的一切都是必需的(我是一个极简主义者)。每当我运行时,我仍然会在未指定s