我使用 MeteorUp 将 Meteor 应用程序部署到 DO Droplet。我为该网站配置了 apache 的虚拟主机,如下所示:
<VirtualHost *:80>
ServerName filipe-garcia.com
ServerAlias www.filipe-garcia.com
ServerAdmin [email protected]
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/sockjs/ [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule /sockjs/ ws://localhost:3000/$1 [P,L]
ProxyPreserveHost On
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
</VirtualHost>
但我仍然得到一个
WebSocket 与 'ws://filipe-garcia.com/sockjs/622/9hwpvs81/websocket' 的连接失败:WebSocket 握手期间出错:意外响应代码:400
我的控制台上出现错误。我在 Google 上搜索了这个问题,找到了许多解决方案(大部分是相同 VHost 的变体),但均未成功。
除此错误外,其他一切似乎都运行良好(我还没有感觉到任何影响,因为这个应用程序还不依赖于 websockets)。
我不确定该如何修复这个问题。我在 Ubuntu 32 位上运行 Apache 2.4.7,并且启用了 proxy、proxy_connect、proxy_http、proxy_wstunnel。
编辑:这一定与代理的配置方式有关,因为如果我将浏览器直接指向正在运行的机器和端口,就不会发生此错误。
作为一个小奖励问题,通过使用 nodejs 服务器,我应该删除文件的 DocumentRoot 行还是将其保留在那里?
谢谢。
答案1
对我来说..只需将以下内容添加到..sites-enabled..(ubuntu+apache) 即可:
ProxyRequests off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
<Location />
ProxyPass http://localhost:3000/
ProxyPassReverse http://localhost:3000/
</Location>
确保添加到 sites-enabled 而不是 sites-available