Faye 通过 HTTPS 使用 nodejs

Faye with nodejs over HTTPS

我正在尝试设置我的生产服务器以使用 nodejs 和 HTTPS 使用 faye 消息,但没有成功。

我现在的情况是:

一个faye + nodejs服务器设置文件:

var https = require('https');
var faye = require('faye');
var fs = require('fs');

var options = {
    key: fs.readFileSync('/etc/httpd/ssl/example.com.key'),
    cert: fs.readFileSync('/etc/httpd/ssl/example.com.crt'),
    ca: fs.readFileSync('/etc/httpd/ssl/ca_bundle.crt')
};

var server = https.createServer(options);
var bayeux = new faye.NodeAdapter({mount: '/faye', timeout: 60});

bayeux.attach(server);
server.listen(8000);

一个rails发送消息的助手:

def broadcast(channel, &block)
  message = {:channel => channel, :data => capture(&block)}
  uri = URI.parse(Rails.configuration.faye_url)
  Net::HTTPS.post(uri, message.to_json)
end

一个javascript函数打开监听器:

function openListener(channel, callback){
    var faye_client = new Faye.Client("<%= Rails.configuration.faye_url %>");
    faye_client.subscribe(channel , callback);
    return faye_client;
}

我的 faye url 配置在 production.rb:

config.faye_url = "https://example.com:8000/faye"

最后,在我的页面中调用 javascript:

fayeClient = openListener("my_channel" , function(data) {
    //do something...
});

在开发机器上通过 http 进行测试时一切正常。但在生产中不要。

如果我将浏览器指向 https://example.com:8000/faye.js 我得到了正确的 javascript 文件。

会发生什么?

问题出在 Apache 服务器上。

我已经切换到 nginx,现在可以正常工作了。

不过,我需要做一些配置:

Faye + node.js 安装文件:

var http = require('http'),
    faye = require('faye');

var server = http.createServer(),
    bayeux = new faye.NodeAdapter({mount: '/faye', timeout: 60});

bayeux.attach(server);
server.listen(8000);

Rails 帮手:

def broadcast(channel, &block)
  message = {:channel => channel, :data => capture(&block)}
  uri = URI.parse(Rails.configuration.faye_url)
  Net::HTTP.post_form(uri, :message => message.to_json)
end

王菲url:

https://example.com/faye

最后,nginx 配置

server {
    # Listen on 80 and 443
    listen 80;
    listen 443 ssl;
    server_name  example.com;
    passenger_enabled on;
    root /home/rails/myapp/public;

    ssl_certificate /home/rails/ssl/myapp.crt;
    ssl_certificate_key /home/rails/ssl/myapp.key;

    # Redirect all non-SSL traffic to SSL.
    if ($ssl_protocol = "") {
            rewrite ^ https://$host$request_uri? permanent;
    }

    location /faye {
        proxy_pass http://127.0.0.1:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

简而言之:nginx将/faye地址的https请求转换为8000端口的http。 在服务器端使用默认的 http,在客户端使用 https。