2011-09-12 116 views
10

我希望這不是一個非常愚蠢的問題,但我正在學習如何爲我的網站實現一個socket.io服務器來生成實時應用程序,但我的問題是我無法弄清楚如何在Apache服務環境中實現所述應用程序。目前,當我運行node server.js來啓動我的socket.io服務器時,我必須通過訪問http://localhost:XXXX訪問它,其中XXXX是我自己附加的任何端口。我不希望我的網站被迫在這樣的替代端口上查看,但是我明顯無法將服務器連接到端口80,因爲Apache正在監聽此端口。通過Apache服務頁面訪問socket.io服務器

顯然,一個自然的解決方案是停止Apache服務,然後在端口80上節點服務器以避免衝突,但我不想犧牲Apache提供的所有功能。基本上,我想繼續通過端口80上的Apache爲我的網站提供服務,並且通過端口3000上的socket.io將實時應用程序的某些方面集成在一起,比方說。

有沒有辦法做到這一點,以避免我不想要的東西?這些事情1)讓用戶通過URL訪問我的網站:3000,2)禁用Apache,3)使用iframe。

在此先感謝。

回答

3

通常,您應該可以使用mod_proxy隱藏Node.js。有點搜索出現了這個:https://github.com/sindresorhus/guides/blob/master/run-node-server-alongside-apache.md(舊鏈接死亡,這是一個新的)

但是,Socket.io可以有點挑剔(https://github.com/LearnBoost/socket.io/issues/25),所以你可能有問題,具體而言。

由於該票有點舊,所以值得一試。如果您遇到問題,請不要感到驚訝。接下來的賭注是綁定Node.js toport 80,並將其作爲Apache的逆向代理(https://github.com/nodejitsu/node-http-proxy)(仍在一定程度的開發中)。

最佳解決方案將運行在它自己的服務器上,只需要將套接字流量發送到socket.example.com或類似的東西。

+0

第二個列出的方法是我迄今爲止實現的方法,雖然它需要大量的Apache指令重新配置。現在它已經實現了,我覺得整個過程與直覺相反,除了將兩臺服務器綁定到「相同」端口之外,並沒有讓我更接近我需要實現的東西。我想我會更多地關注mod_proxy,看看這不是一個更加謹慎的解決方案。一個反覆出現的問題是,我不一定需要使用socket.io來提供整個文檔,而只需要在精選頁面上使用WIDGETS。一個「移植的div」,如果你願意的話。 –

+0

你提到的第一個鏈接是死的 –

+0

更新了一個新的鏈接 –

2

Socket.io具有多種傳輸機制。如果您將Apache作爲反向代理運行,其中一些不起作用,但也有一些可以。運行不起作用的是websocket和flash,但是xhr-polling和jsonp-polling應該可以工作。

下面是關於設置傳輸配置選項socket.io一個例子:

var io = require("socket.io").listen(server); 
io.set("transports", ["xhr-polling", "jsonp-polling"]); 

在我的Apache我使用的是正常name based virtual hosts and reverse proxy setup並與這些運socket.io似乎是工作。