为socket.io和SSL / WSS配置Apache

时间:2016-10-17 00:49:00

标签: node.js apache socket.io wss proxypass

正如标题所示,我正在努力让Apache和Socket.io(node.js)发挥得很好,特别是在SSL上。目前, https://www.example.com 上的客户端应用程序使用SSL上的Socket.io通过[SSL协议]连接到服务器://socket.example.com/socket.io/?query_stuff * 。与wss://的连接始终失败,因此Socket.io降级为https://,这很好。但我想利用websocket协议而不依赖于对http(s)的轮询。

Linux& Apache的

服务器版本: Apache / 2.4.7(Ubuntu)

相关mods: mod_proxy,mod_proxy_http,mod_proxy_wstunnel,mod_rewrite,mod_ssl

Iptables:我已经打开了端口80,443和9000.

虚拟主机:

我在*:443上创建了一个名为 socket.example.com 的虚拟主机。它的目的是将代理 [wss,https]://socket.example.com/ 反向指向在 http://localhost:9000/ 运行的socket.io服务器。在这里,删除了多余的位:

<VirtualHost *:443>
    ServerName socket.example.com
    DocumentRoot /var/www/example/socket.io/

    RewriteEngine On
    RewriteCond %{REQUEST_URI}  ^/socket.io             [NC]
    RewriteCond %{QUERY_STRING} transport=websocket     [NC]
    RewriteRule /(.*)           wss://localhost:9000/$1 [P,L]

    ## I have also tried the following RewriteRules: ##
    # RewriteRule /(.*)         http://localhost:9000/$1 [P,L]
    # RewriteRule /(.*)         http://localhost:9000/socket.io/$1 [P,L]

    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/live/www.example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/keys/0001_key-certbot.pem
    SSLCACertificateFile  /etc/letsencrypt/ca-bundle.pem

    SSLProxyEngine On
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyVia Full

    ProxyPass / http://localhost:9000/
    ProxyPassReverse / http://localhost:9000/
</VirtualHost>

通过SSL使用PHP websockets成功

在切换到我的websocket服务器的nod​​e.js之前,我使用上面的Apache VirtualHost成功地将 wss://socket.example.com/ws_daemon.php 路由到 ws:/ /localhost:9000/ws_daemon.php 。在这种情况下,我 1。删除了重写规则, 2。将ProxyPass设置更改为:

ProxyPass / ws://localhost:9000/
ProxyPassReverse / ws://localhost:9000/

但是同样的逻辑似乎没有延续到socket.io。

此时我已经没有想法了。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

如果您使用<Location>块,则应向其添加以下行:

RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
RewriteRule /socket.io/(.*) ws://localhost:3000/socket.io/$1 [P]