2014-12-13 87 views
0

我有一個Nginx的服務我的餘燼建立 如下:使用節點,socket.io,ember.js和nginx的

server { 
 
    listen 80; 
 
    root /home/ubuntu/my-app/dist; 
 
    index index.html; 
 

 
    location /api { 
 
    proxy_pass http://127.0.0.1:3000; 
 
    } 
 

 
    location/{ 
 
    try_files $uri $uri/ /index.html; 
 
    } 
 
}

我要添加使用socket.io聊天,但我已經在端口3000上有REST API。 我想知道構建這個的最佳方法是什麼。

我以爲我可以如下添加另一個地點:

location /socket.io { 
 
    proxy_set_header Upgrade $http_upgrade; 
 
    proxy_set_header Connection "upgrade"; 
 
    proxy_http_version 1.1; 
 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
 
    proxy_set_header Host $host; 
 
    proxy_pass http://socket_nodes; 
 
    }

但它不工作。如果有人能指引我走向正確的方向,那會非常棒。

在此先感謝。

+2

你是否研究過socket.io的具體nginx文檔:http://nginx.com/blog/nginx-nodejs-websockets-socketio/? – jfriend00 2014-12-13 07:17:32

+0

我有,但我不清楚。因爲在端口3000上已經有節點api監聽了。我還想使用套接字,並且正在考慮在另一個端口上添加另一個代理。但我很確定有更好的方法來做到這一點。 – imahungry 2014-12-13 08:42:02

+1

作爲反向代理的Nginx是最爲人熟知的場景。這意味着您可以通過同一端口代理任何本地/遠程資源。分享Nginx日誌,以便我們可以快速幫助您 – Anatoly 2014-12-13 10:25:41

回答

0

如果您使用節點作爲您的Web服務器,則socket.io與Web服務器和REST API共享相同的端口和IP。

一個socket.io連接開始作爲對/socket.io路徑的常規http請求。 socket.io庫掛鉤到您的Web服務器來處理特定的http請求。在來回之後,兩端同意將協議從http升級到webSocket,然後對話繼續作爲webSocket協議,但仍與Web服務器運行在同一IP和端口上。

所有這一切都可以在nginx作爲代理的情況下正常工作,如果你配置了nginx,就像我之前給出的configuration link中指定的那樣,它代理所有正確的事情,並且如果socket.io配置正確與你的nodejs服務器連接它正確。

由於web請求和socket.io連接都通過相同的Web服務器運行,而無需執行任何操作,因此實際上沒有任何體系結構更改。 socket.io連接僅對設置了一些特殊的HTTP標頭的/socket.io路徑發出http請求。 socket.io服務器代碼只是鉤住你的web服務器來處理這個特定的請求,並從那裏接受它。其餘的REST API調用僅由您已擁有的相同機制處理。所以,只要你不試圖定義一個/socket.io的API調用,那麼他們就會高興地不在彼此的方式,就像你的Web服務器上兩條不同路由的處理程序彼此不在一起。您可以看到更多關於傳入socket.io調用如何工作in this answer

0

所以我終於得到這個工作,並認爲我會分享我的發現。

Nginx: 對於我的api代理,我實際上可以共享與我的節點API相同的端口。我只需要添加版本和標題。

location /api { 
    proxy_pass http://127.0.0.1:3000; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 
} 

server.js

var http = require('http').Server(app); 
var io = require('socket.io')(http); 

app.get('/', function(req, res) { 
    res.sendFile(__dirname + '/index.html'); 
}); 


io.on('connection', function(socket) { 
    console.log("[NOTIFICATION] - New connection"); 
    io.sockets.emit("message", { message: "New connection" }); 
    socket.on("send", function(data) { 
    io.sockets.emit("message", { message: data.message }); 
}); 

http.listen(3000); 

恩貝爾: https://github.com/keydunov/emberjs-socketio-chat 是一個不錯的例子,利用socket。io