httpd(Apache / 2.4.6 CentOS)代理和WebSockets上的Meteor

时间:2016-02-08 13:16:17

标签: apache meteor proxy websocket

当我在线部署流星应用程序时,我无法锻炼如何让WebSockets工作。我一直收到这个错误:

WebSocket connection to 'ws://website.com/sockjs/***/********/websocket' failed: Unexpected response code: 400

我认为这是因为apache位于我的流星应用程序前面。我知道Apache 2.4有一个错误让ws://正常工作,但我认为这应该由modules/mod_proxy_wstunnel.so来解决,我已经启用了(当然我也启用了modules/mod_proxy.so

这是我的配置。我正在运行Meteor 1.2.1作为系统服务(/etc/systemd/system/meteor.service),如下所示:

[Unit]
Description=meteor nodejs daemon
After=network.target remote-fs.target

[Service]
User=root
ExecStart=/usr/bin/node /home/root/www/main.js
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=meteor
Environment=ROOT_URL=http://website.com
Environment=PORT=3000
Environment=NODE_ENV=production
Environment=MONGO_URL=mongodb://127.0.0.1:27017/meteor

[Install]
WantedBy=multi-user.target

这是httpd -v

的输出
Server version: Apache/2.4.6 (CentOS)
Server built:   Aug 28 2015 22:11:18

这是我的/etc/httpd/conf/httpd.conf的vhost配置(website.com)中的相关部分:

<VirtualHost my.ser.ver.ip:8080>
    ServerName website.com
    ServerAlias www.website.com
    ProxyRequests Off
    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/
    <Proxy *>
        Allow from all
    </Proxy>
</VirtualHost>

我已经尝试按照建议here添加RewriteCond,但没有成功......

有什么想法吗?我也有问题让oauth使用accounts-facebook包,我想问题是出于同样的原因?在,我的代理设置有问题吗?

1 个答案:

答案 0 :(得分:0)

解开了谜团。当然这是我的坏事:我忘记了所有关于清漆。

我在端口80上设置了Varnish,将请求转发给Apache,后者又将请求代理到node.js.我解决了删除apache并因此配置Varnish直接服务于该特定域的node.js.

这就是我所做的:

  1. /etc/varnish/
  2. 中实施this default.vcl
  3. 删除了import directors以及sub vcl_init {}内的所有内容(因为我只有一台服务器)
  4. set req.backend_hint = vdir.backend();中的sub vcl_recv {}替换为:
  5. if (req.http.Host ~ "^(www\.)?website.com") {
        set req.backend_hint = nodejs;
    } else {
        set req.backend_hint = apache;
    }
    
    1. 像这样创建了两个后端:
    2. backend apache {
          .host = "127.0.0.1";
          .port = "8080";
          .max_connections = 300;
          .probe = {
              .request =
                  "HEAD / HTTP/1.1"
                  "Host: localhost"
                  "Connection: close";
              .interval = 5s;
              .timeout = 1s;
              .window = 5;
              .threshold = 3;
          }
          .first_byte_timeout = 300s;
          .connect_timeout = 5s;
          .between_bytes_timeout = 2s;
      }
      
      backend nodejs {
          .host = "127.0.0.1";
          .port = "3000";
          .connect_timeout = 1s;
          .first_byte_timeout = 2s;
          .between_bytes_timeout = 60s;
          .max_connections = 800;
      }