正如 Headers 所暗示的那样,我正在努力让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
Server version: Apache / 2.4.7(Ubuntu)
Relevant mods: mod_proxy,mod_proxy_http,mod_proxy_wstunnel,mod_rewrite,mod_ssl
Iptables: 我打开了端口80,443和9000 .
VirtualHost:
我在*: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服务器的node.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 回答
如果您使用
<Location>
块,则应向其添加以下行: