2016-03-07 55 views
1

我在Forge服務器上運行Laravel PHP應用程序。服務器上有多個Nginx站點。我試圖建立一個Socket.io連接。我以前使用HTTP運行此操作,但SSL使用中斷。如何使用SSL查找Node.js Socket.io連接地址?

首先,我僞造了一個新網站(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應該設置一些具體的東西嗎?

很多很多的感謝,這一直是年齡的問題....

+0

任何更新?你能做到這一點嗎?我有同樣的問題。非常感謝! – kevnk

+1

@kevnk不幸的是沒有!我最終放棄並使用[Pusher](http://pusher.com)。它每天免費發送200,000條消息,這對我來說已經足夠了。花了大約10分鐘設置... – samiles

回答

0

改變這種

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

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

爲您的節點的應用程序正在偵聽端口3000

+0

有趣。我試過這個,但是在嘗試加載大約30秒後它會超時... – samiles

0

這是最終爲我工作的設置:

首先,我把我的節點服務器鍛造服務器上

,我做了一個代理通過這樣https://example.com/sockets會去(B/C所有的代碼是在同一倉庫這是好的) 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; 
} 

第三,(該部分我無法弄清楚一天半)做代理通行證使得socket.io namespaced。所以,那麼我的節點服務器的腳本是這樣的:

server.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') 
})