2012-11-20 52 views
0

我對Redis和Node.js非常感興趣,但我想使用Redis增強我的Web應用程序性能,並使用Node.js添加實時通知功能。Redis - 在一臺機器上的Node.js?

現在,我已經添加了1個EC2實例來爲這兩個進程提供服務,將它與彈性IP地址及其關聯的子域綁定。 但是,我在Redis網站上看到,運行Redis的機器不應暴露於不受信任的環境。

http://redis.io/topics/security

的Redis的設計是由受信任的客戶端訪問內部的信任 環境。這意味着通常將Redis實例直接暴露給互聯網或者通常情況下暴露於 環境中不受歡迎的客戶端可以直接訪問Redis TCP 端口或UNIX套接字。

另一方面,監聽websocket協議的Node.js必須暴露給互聯網,以便我的Web應用程序可以與它進行實時交互。

所以我的第一個問題是,我真的需要2個EC2實例,每個實例都用於Redis和Node.js?

我的第二個問題是: 保持我現有的PHP會話並讓Node.js識別使用PHP會話的just-loggedin用戶的最佳方式是什麼?

我幾乎修改了我的PHP會話,將它從表內會話更改爲Redis會話,直到我從上面的Redis網站閱讀指南。

謝謝。

+1

讓您的Redis實例在環回('127.0.0.1'或':: 1')上偵聽,或者甚至更好的UNIX套接字(它們存在於文件系統中,並且它們的訪問權可以受文件權限保護)而不是外部IP地址。這解決了你的主要問題。 –

+0

我已經在redis中取消註釋綁定127.0.0.1。conf,重新啓動redis-server,然後從nodejs客戶端偵聽。使用predis作爲從redis實例遠程安裝的PHP的其他客戶端,我嘗試發佈消息,並且nodejs客戶端成功識別該消息。這是否意味着我的redis實例已經與外部隔離,但仍能夠獲得發佈的消息?謝謝 – robotijo

回答

0

你會希望按照評論者所說的去聽127.0.0.1,然後你可以增加安全性而不是打開端口到外部世界。由於安全組功能,這應該在AWS中默認完成。爲了打開到外部世界的端口,您必須將其明確添加到安全組。

以下是關於安全組的更多信息。 http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/using-network-security.html

+0

如果我得出結論,我的應用程序將有1臺Web服務器機器,然後1臺服務器機器運行Redis + Node.js + Socket.io,對不對?最後一臺服務器將暴露在互聯網上,用於Node.js將使用的特定端口,但保持隔離的Redis端口,只偵聽127.0.0.1。那是對的嗎? CMIIW,謝謝 – robotijo

+0

是的,這將工作絕對好。特別是在一箇中小型的網站。 –

0

在主配置文件/etc/redis/redis.conf,應該有一個bind 127.0.0.1(如果沒有評論,添加它),然後保存並重啓Redis的。該指令告訴服務僅偵聽來自本地主機的連接。它應該足以保證Redis安裝不受外界影響。如果我沒有記錯,默認情況下外部世界會被EC2拒絕。

至於第二個問題,您需要確保會話ID在兩種語言之間一致地被讀取。 session_id()會給你在php會話的id。您只需設置節點即可閱讀PHPSESSID cookie。你只需要確保cookie將被髮送到node.js服務的任何主機名,它在瀏覽器中偵聽。在php中,您可以在php.ini中更改它,或在session_start()之前使用session_set_cookie_params

+0

有一件事,我無法找到答案,在我註釋掉綁定127.0.0.1後,redis確實拒絕了所有的遠程連接。我想如何讓我的網絡服務器在不同的機器上發佈數據呢?我已經使用npm http-proxy和bouncy,但它們都不起作用。還有redis-proxy,但它是alpha版本,不支持pub sub功能。謝謝 – robotijo

+0

爲此,我會使用iptables來處理流量。我只是要確保當你打開端口時,你只對給定的機器這樣做。 https://help.ubuntu.com/community/IptablesHowTo –

相關問題