2

Forge サーバーで Laravel PHP アプリケーションを実行しています。サーバーには複数の Nginx サイトがあります。Socket.io 接続をセットアップしようとしています。以前は HTTP でこれを実行していましたが、SSL では機能しません。

まず、forge ( socket.mydomain.com) で新しいサイトを作成し、それを使用Foreverして Node.js スクリプトを実行します。イベントを受信して​​コンソールに出力しているため、スクリプトが実行されていることはわかっています-フロントエンドに接続できません。

私の socket.io スクリプトは次のとおりです。

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

var options = {
    key:    fs.readFileSync('/etc/nginx/ssl/socket.example.com/54082/server.key'),
    cert:   fs.readFileSync('/etc/nginx/ssl/socket.example.com/54082/server.crt')
};

var app = https.createServer(options);

var io = require('socket.io').listen(app);

io.sockets.on('connection', function(socket) {

    console.log('connected');

});

app.listen(3000);

フロントエンドで使用しているコードは次のとおりです。

<script type="text/javascript" src="https://socket.example.com/socket.io/socket.io.js"></script>
<script type="text/javascript">

var io = io('https://socket.example.com', {secure: true});

....

これをSSLで機能させる方法を知っている人はいますか? 同様に、アドレス/ポートはどうあるべきですか? 正しいポートで Forever を使用してこれを開始するにはどうすればよいですか? そして、私のNginxの設定には何か特別なものが必要ですか?

多くの感謝、これは長年の問題でした....

4

2 に答える 2

0

これを変える

var io = io('https://socket.example.com', {secure: true});

var io = io('https://socket.example.com:3000', {secure: true});

ノードアプリがポート 3000 でリッスンしているため

于 2016-03-07T13:35:25.993 に答える
0

これは私のために働いた設定です:

最初に、ノードサーバーをフォージサーバーに配置しました(すべてのコードが同じリポジトリにあるので便利です)

第二に、私はプロキシパスを行ったので、https://example.com/socketsに行きますhttp://MY_PRIVATE_IP:8080

nginx 構成:

location /socket/ {
    proxy_pass http://MY_PRIVATE_IP:8080/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

3 番目に、(1 日半の間理解できなかった部分) プロキシ パスを実行すると、socket.io の名前空間が作成されます。したがって、私のノードサーバースクリプトは次のようになりました。

サーバー.js:

var http = require('http')
var server = http.Server();

var io = require('socket.io')(server);
var nsp = io.of('/socket/:8080');
var Redis = require('ioredis');
var redis = new Redis();

redis.subscribe('test-channel');

redis.on('message', function(channel, data){
  message = JSON.parse(data);
  nsp.emit(channel + ':' + message.event, message.data);
})

server.listen(8080, process.env.SOCKET_PRIVATE_HOST, function(){
  console.log('node server running')
})
于 2016-04-11T04:41:36.303 に答える