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。
我正在尝试设置我的生产服务器以使用 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。