我在这里浏览了无数关于如何执行此操作的帖子,但我无法使这个简单的任务正常运行。我将Apache用作代理,该代理应该加密/解密TSL数据包,然后与NodeJS服务器进行不安全的通信。问题是Web应用程序加载正常,但是websocket失败并显示错误404(未找到),而我之前遇到过错误200(握手问题)。我尝试了许多不同的配置,但无法使用。
这就是我在客户端的内容。
const connection = new WebSocket('wss://example.com/wss');
这里使用wss://
而不是ws://
,因为我想建立安全的连接。在服务器端,我只有标准
ws.on('connection', w => {
w.on('message', msg => {
var data = JSON.parse(msg);
// do something with the message ...
});
});
这是我的Apache配置文件
ServerName www.example.com RewriteEngine on
RewriteCond %{HTTP:Upgrade}=websocket [NC]
RewriteRule /(.*) wss://127.0.0.1:3000/$1 [P,L]
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLProxyEngine on
ProxyPass / http://127.0.0.1:3000/
ProxyPassReverse / http://127.0.0.1:3000/
ProxyPass /wss ws://127.0.0.1:3000/
ProxyPassReverse /wss ws://127.0.0.1:3000/
在Apache方面,我不确定是否应该为ProxyPass使用wss://
或ws://
,因为它在Apache和NodeJS之间应该是不安全的。我在这里将其设为ws://
,但两种方法均无效。对于此配置,我得到404错误。
任何帮助将不胜感激!谢谢
我用Nginx反向代理解决了这个问题,
问题是我将套接字连接设置为在端口8080上,但是为端口3000设置了代理。如果将它们放在同一端口上,则该问题将得到解决。
即应用服务器,
const ws = new WebSocket.Server({port: 3001});
Apache
ProxyPass /wss ws://127.0.0.1:3001/
ProxyPassReverse /wss ws://127.0.0.1:3001/