2012-02-21 87 views
7

所以我一直試圖讓這個工作2天,我卡住了。這是我第一次爲使用NodeJS + Socket IO的rails配置服務器。我是NGINX和Unicorn的noob。基本上,我的應用程序的NodeJS + SocketIO部分將消息推送給連接到我的應用程序的用戶。這是我的nginx.confNGINX配置使用Socket.IO

server{ 
    listen 80 default; 
    root /home/deployer/saigon/public; 
    try_files $uri/index.html $uri @unicorn; 

    location /sockets { 
     proxy_pass http://localhost:3210; 
    } 

    location @unicorn { 
     proxy_pass http://localhost:3000; 
    } 
} 

在我production.rb,我已經配置了用戶將不得不從

SOCKET_IO_URL ='http://localhost:8080/sockets 

爲什麼8080將消息發送到/接收郵件中的網址?我使用Vagrant轉發8080 - > 80

我試圖訪問http://localhost:8080/sockets,我能夠獲得套接字歡迎消息。我看着我的NodeJS服務器日誌,它正在接收消息。但是,當涉及到廣播.....它只是不這樣做。有沒有人有過這樣的應用程序來處理我想要做的設置?我應該和Apache + Unicorn一起去嗎?

'

回答

12

更新回答

我終於想出了一個辦法來得到這個工作。這一點並不明顯,但是當在子文件夾上託管socket.io時,不要使用connect語句中的子文件夾。這就是我之前做的事情,客戶從未收到過答覆。

不工作

<script src="/test/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost:8080/test/', {resource:'test/socket.io'}); 
    socket.on('news', function (data) { 
    console.log(data); 
    socket.emit('my other event', { my: 'data' }); 
    }); 
</script> 

http://localhost:8080/測試/這是被扔東西掉一部分。這爲服務器端不尊重的本地套接字創建了一個名稱空間。因此,客戶端在名稱空間'/ test /'上發送消息,但服務器響應將進入一個空的名稱空間'',因此客戶端永遠不會收到消息。解決方法是隻刪除'/ test /',並確保在客戶端和服務器上使用資源變量。

工作!

<script src="/test/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost:8080', {resource:'test/socket.io'}); 
    socket.on('news', function (data) { 
    console.log(data); 
    socket.emit('my other event', { my: 'data' }); 
    }); 
</script> 

我希望這有助於你得到的東西在你結束工作。

原來的答案

這不是你的設置有問題,這是不希望socket.io到子文件工作的問題。我敢打賭,如果你放棄了/套接字,你的例​​子可以正常工作。當使用http-node-proxy嘗試在子文件夾上託管socket.io連接時,我遇到了完全相同的問題。前段時間創建了一個錯誤,但它被封閉並且從未解決。

https://github.com/LearnBoost/socket.io-client/issues/185

https://github.com/LearnBoost/socket.io/issues/320

我仍然在尋找一個解決方案爲好,但我有一種感覺,我將不得不挽起了袖子,深入到代碼自己。

+0

所以基本上是socket/socket。io需要留在根文件夾然後....這意味着我必須知道哪些請求將導軌,哪些是打到socket的io當它打到根? = ___ = argh – denniss 2012-02-21 18:17:09

+0

現在是。如果可能的話,你可以改用子域路由。 http://socket.domain.com/。這對我不起作用,因爲我不想花更多錢在子域的SSL證書上。 – 2012-02-21 21:05:02

+0

@denniss我已經用解決方法更新了我的答案。仍然深入研究,以確定這是預期的設計還是需要解決的錯誤。 – 2012-02-22 00:00:25