Фэй с nodejs через HTTPS

Я пытаюсь настроить свой производственный сервер для использования сообщений faye с использованием nodejs и HTTPS, но безуспешно.

Что у меня есть до сих пор:

Файл установки сервера 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;
}

Моя конфигурация URL-адреса Faye в 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.

Что может случиться?


person Beetlejuice    schedule 12.07.2015    source источник
comment
Является ли ваш сертификат самоподписанным? Я не знаю об API-интерфейсах Ruby, но в большинстве API-интерфейсов, когда вы публикуете сообщение HTTPS, есть возможность не проверять сертификат HTTPS, поскольку сертификат является самоподписанным.   -  person Ankur    schedule 12.07.2015
comment
Да, это так. я получил от Годадди   -  person Beetlejuice    schedule 12.07.2015


Ответы (1)


Проблема была с сервером 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 конвертирует https-запросы по адресу /faye в http через порт 8000. Используйте http по умолчанию на стороне сервера и https на стороне клиента.

person Beetlejuice    schedule 15.07.2015