我有一个提供未加密的websocket的mqtt代理。我想通过Apache代理它,它应该将websocket加密到外部。
它是Windows机器上的Apache 2.4。
我的配置是:
<VirtualHost *:80>
ServerName test.someurl.com
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) ws://localhost:9876/$1 [P,L]
</VirtualHost>
<VirtualHost *:443>
ServerName test.someurl.com
SSLEngine on
SSLCertificateFile "C:/Program Files (x86)/Apache24/conf/ssl/some_certificate.crt"
SSLCertificateKeyFile "C:/Program Files (x86)/Apache24/conf/ssl/some_key.key"
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) ws://localhost:9876/$1 [P,L]
# Websocket proxy
# wss redirects to working ws protocol
# ProxyPass /wss ws://127.0.0.1:9876 retry=0 keepalive=On
# ProxyPassReverse /wss ws://127.0.0.1:9876 retry=0
</VirtualHost>
&#13;
我可以通过ws / 80连接。它工作正常。但是,我无法使用wss进行连接。
我尝试使用重写和proxy_pass指令。我试过100种不同的解决方案然而,这个看起来最有希望,因为端口80正在为ws工作,但不适用于加密部分。任何的想法?或者我只是被选项O:)
蒙蔽了答案 0 :(得分:0)
这是一个老问题,但因为我刚刚开始工作:
我让 Mosquitto 监听端口 8000(该端口被防火墙阻止以阻止除本地主机之外的任何连接)
listener 8000
socket_domain ipv4
allow_anonymous true
protocol websockets
然后像这样设置apache:
<VirtualHost *:80>
ProxyPass /ws/ ws://localhost:8000/
ProxyPassReverse /ws/ ws://localhost:8000/
</VirtualHost>
<VirtualHost *:443>
SSLCertificateFile ...
SSLCertificateChainFile ...
SSLCertificateKeyFile ...
ProxyPass /ws/ ws://localhost:8000/
ProxyPassReverse /ws/ ws://localhost:8000/
</VirtualHost>
最后,网络应用程序设置为如下连接:
mqtt.connect((window.location.protocol == "https:" ? "wss:" : "ws:") + "//example.org/ws/");
请注意,代理协议可以是“ws”或“wss”——两者似乎可以互换工作。这是apache和mosquitto之间的连接,不需要加密(它们在同一台主机上)。在路径上使用“/ws/”后缀意味着我可以不用 mod_rewrite,只需使用 mod_proxy。
这种方法是我在通过 HTTPS(公开)而不是通过 HTTP(在防火墙后面)访问时需要身份验证的唯一方法。