2017-03-07 23 views
1

SSL経由でsocket.ioをサポートするためにnginxとnodeを設定する際に問題があります。nginx、node.js + socket.io with SSL

私のnginxの設定ファイル:

map $http_upgrade $connection_upgrade { 
    default upgrade; 
    ''  close; 
} 

server { 
    listen 80; 
    listen 443 ssl; 
    listen [::]:80; 
    listen [::]:443 ssl; 

    access_log /var/log/nginx/livetest.log; 
    server_name live-test.dev www.live-test.dev; 

    ssl_certificate /etc/nginx/ssl/nginx.crt; 
    ssl_certificate_key /etc/nginx/ssl/nginx.key; 
    ssl_session_cache shared:SSL:50m; 
    ssl_session_timeout 5m; 

    if ($ssl_protocol = "") { 
     rewrite^https://$host$request_uri? permanent; 
    } 

    location/{ 
     proxy_pass https://live_test; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection $connection_upgrade; 
    } 
} 

live_testは、それが状況を(失敗)でポーリングに停止しないクロームでテストする場合は、ポート6020で実行しているのNode.jsのための上流にあります。 WSS --connect

wscat:wscat使用する場合//live-test.dev

を私が受け取る: error: Error: self signed certificate

私はここで間違っているかもしれないもの思ったんだけど?ここに私のnode.jsアプリがあります:

var express = require('express'); 
var cookie = require('cookie'); 
var app = express(); 
var http = require('http').Server(app); 
var socketIo = require('socket.io'); 
var redis = require('redis'); 
var redisClient = client = redis.createClient(); 

io.on('connection', function(socket){ 
    var cookies = cookie.parse(socket.handshake.headers.cookie); 

    console.log(cookies); 
}); 

http.listen(6020, function(){ 
    console.log('listening on 6020'); 
}); 

私のnode.jsアプリには何か不足している気がします。私は、SSLノードnode.jsをnginxが処理して以来、もう必要ないと思ったが、おそらく私は間違いだと思った。

はい、SSL用に自己署名証明書を使用しています。 node.js/socket.ioは自己署名証明書で動作しますか?今取得、私は-nフラグとwscatを試してみましたabcdnによってコメントに続きアップデート2

@

var express = require('express'); 
var cookie = require('cookie'); 
var fs = require('fs'); 
var app = express(); 
var https = require('https').Server(app, { 
    key: fs.readFileSync('/etc/nginx/ssl/nginx.key'), 
     cert: fs.readFileSync('/etc/nginx/ssl/nginx.crt'), 
}); 
var socketIo = require('socket.io'); 
var redis = require('redis'); 
var redisClient = client = redis.createClient(); 

var io = new socketIo(https); 

io.on('connection', function(socket){ 
    var cookies = cookie.parse(socket.handshake.headers.cookie); 

    console.log(cookies); 
}); 

https.listen(6020, function(){ 
    console.log('listening on 6020'); 
}); 

@UPDATE

は、いくつかの読書の後、私は私のNode.jsアプリケーションを変更しましたエラー: error: Error: unexpected server response (502)

nginxエラー.logには、次の情報が含まれます。 2017/03/07 13:44:10 [error] 10556#10556: *140 upstream prematurely closed connection while reading response header from upstream

@UPDATE 3

さらに読みになった後、私は戻って、HTTPに私app.jsを回しました。

+1

'wscat -n'、つまり' wscat --no-check' - 証明書テストをスキップしようとしましたか? – abcdn

+0

@abcdn私はちょうど1分前に試してみました。私の質問を更新しました。 – user1970395

+0

@abcdnこれはnginxがリクエストを正しく処理し、失敗したノードだと思いますか? – user1970395

答えて

1

var fs = require('fs'); 
 
var app = require('express')(); 
 
var https  = require('https'); 
 
var io = require('socket.io')(https); 
 
var HTTPSOptions = { 
 
    cert: fs.readFileSync('path to ssl certificate file'), 
 
    key: fs.readFileSync('path to ssl key file'), 
 
    requestCert: false, 
 
    rejectUnauthorized: false, 
 
}; 
 
HTTPSOptions.agent = new https.Agent(HTTPSOptions); 
 
var httpsServer = https.createServer(HTTPSOptions, app); 
 
io = io.listen(httpsServer, { 
 
    log: false 
 
}); 
 

 
//io.sockets.on('connection', function (sock) { 
 
// console.log("CONNECTED"); 
 
//}); 
 

 
var Redis = require('ioredis'); 
 
var redis = new Redis(); 
 

 
redis.psubscribe('*', function() {}); 
 

 
redis.on('pmessage', function (subscribed, channel, message) { 
 
    console.log("channel: " + channel); 
 
    console.log("message: " + message); 
 
    message = JSON.parse(message); 
 
    io.emit(channel + ':' + message.event, message.data); 
 
}); 
 

 
httpsServer.listen(6001, function(){ 
 
    console.log('Listening on Port 6001'); 
 
});

私は、このための解決策を見つけるために3日間を過ごし、これは完璧に動作し、私の最後のバージョンです。私はそれが私のように立ち往生した人を助けることを願っています:)

+0

スニペットを実行すると、いくつかのSyntaxErrorがあります... – Nuageux

+0

はい、最後の行に "〜"がありますが、それが原因だと思います。これはあなたのソリューションをここに投稿するのは非常にいいです。私は実際には、nginxは、それが別のアプリのためにとにかく処理していたすべてのSSL関連のものを処理させました。しかし、誰かがこの質問に遭遇し、あなたの答えが働いてくれることを祈ってみましょう! – user1970395