2011-12-16 184 views
99

我剛剛在我的Ubuntu 10.10服務器上使用http://redis.io/topics/quickstart上的快速入門指南中的說明成功安裝了Redis。我以dameon的身份運行該服務(因此它可以由init.d運行)Redis - 連接到遠程服務器

該服務器是Rackspace集羣的一部分,包含內部和外部IP。主機在端口6379上運行(標準的Redis)

我在iptables的添加了一行,允許從端口6379傳入連接,如下圖所示:

ACCEPT  tcp -- anywhere    anywhere   tcp dpt:6379 

在我的PHP代碼中的另一個服務器上,我試圖連接到在這裏新的Redis服務器:

$this->load->helper("iredis"); 

$hostname = "IP ADDRESS HERE"; 

$redis = new iRedis(array('hostname' => $hostname, 'port' => 6379)); 

一旦我做到這一點 - 我總是拒絕連接。在我的redis.conf文件中,我將本地綁定命令註釋掉了,所以它應該監聽的不僅僅是本地主機IP。我可以連接到本地機器上的數據庫而不是另一臺服務器上。我嘗試過外部和內部的IP,沒有運氣。

任何建議讓這個工作?

+0

您能否使用Redis命令行工具進行連接? `redis-cli -h hostname` – jlundqvist 2011-12-27 16:54:06

+0

服務器故障有一個關於[Connection Refused]的規範問題(http://serverfault.com/questions/725262/what-c​​auses-the-connection-refused-message)。 – Raedwald 2015-09-30 12:32:35

回答

107

首先我會檢查,以確認它的IP地址聽你希望它是:

netstat -nlpt | grep 6379 

取決於你如何啓動/停止,你可能沒有真正重新啓動實例時,你以爲你有。 netstat會告訴你它是否在聽你認爲的地方。如果沒有,請重新啓動並確保重新啓動。 如果它重新啓動並且仍然沒有在您期望的位置進行監聽,請檢查您的配置文件以確保安全。

redis-cli -h REMOTE.HOST ping 

您也可以嘗試從本地主機,但使用的IP,你希望它是:

建立它在聽,你指望它,從中應該可以訪問嘗試遠程節點後監聽而不是主機名或本地主機。在這兩種情況下,你都應該看到PONG的反應。

如果不是,您的防火牆將阻止您。這可能是本地IPTables,也可能是節點之間的防火牆。你可以在你的IPtables配置中添加一條日誌語句來記錄6379以上的連接,看看發生了什麼。另外,試圖從本地和非本地到相同的IP重新進行ping應該是說明性的。如果它在本地響應但不是遠程響應,那麼根據您的節點IP表規則的複雜性,我會傾向於插入防火牆。

+16

所以,很明顯,您對所發佈的問題回答了一個錯誤的答案,因爲您有一個它沒有解決的相關(但顯然不相同)的問題?雖然我同意發佈您的解決方案,但由於您的問題有所不同,所以低估了正確的答案似乎並不適合。也就是說,你的解決方案對於這個問題不是一個好的選擇,因爲OP有多個IP地址,可能不想聽所有的IP地址,而且OP特別引用了問題中配置文件中的bind部分。因此你的解決方案不能解決問題。 – 2013-01-17 21:19:50

+2

好吧,我再次讀到這個問題,對我來說,OP並沒有爲這個「綁定」行設置正確的配置。另外,我不確定他的情況是否涉及任何防火牆。無論如何,如果你認爲這很粗魯,我可以刪除我的-1。我剛剛發現你的答案完全是無關緊要的,並且對於大多數用戶來到這裏帶來一個非常常見的問題沒有什麼幫助......(綁定默認參數) – 2013-01-17 22:47:46

278

我一直堅持相同的問題,前面的答案沒有幫助我(雖然寫得很好)。

的解決方案是在這裏:檢查你的/etc/redis/redis.conf,並確保更改默認

bind 127.0.0.1 

bind 0.0.0.0 

然後重新啓動服務(service redis-server restart

然後,您可以現在檢查redis是否在非本地接口上收聽

redis-cli -h 192.168.x.x ping 

(與你的IP地址替換192.168.x.x)

重要提示:幾個用戶所說的那樣,是不安全設置這個被暴露在互聯網的服務器上。您應該確定您的redis受到任何適合您需求的手段的保護。

0

在服務器的redis配置中將tcp-keepalive設置爲60(它被設置爲0)幫助我解決了這個問題。

8

除了由Orabîg給出的出色答卷:

我被徹底消除了bind部分和設置protected-modeno解決了這個問題。

#bind 127.0.0.1 
protected-mode no 

切勿在公開的服務器上使用此方法。

1
  • 如果您下載Redis的自己(不易於得到安裝Redis的服務器),然後編輯redis.conf與 上述建議,確保開始Redis的的配置 像這樣: ./src/redis-server redis.conf

    • 也側面說明我包括虛框設置爲 的截圖連接到Redis的,如果你是在Windows和連接到VirtualBox的虛擬機。

enter image description here

0

Orabig是正確的。

可以綁定在10.0.2.15 Ubuntu的(VirtualBox的)然後做一個端口從主機到來賓Ubuntu的轉發。在/etc/redis/redis.conf

bind 10.0.2.15 

然後,重新啓動的Redis:

sudo systemctl restart redis 

它應努力!