1. 程式人生 > >Redis遠端連線失敗-“Connection reset by peer”的解決方式(Win10以及Ubuntu)

Redis遠端連線失敗-“Connection reset by peer”的解決方式(Win10以及Ubuntu)

每篇一句:

The business of life is the acquisition of memories. In the end that’s all there is.

問題出現:

今天在在本機(Windows 10)以及虛擬機器(Ubuntu 16.04)中分別安裝了Redis服務,

  • Ubuntu安裝:sudo apt-get install redis-server (版本為:3.0.6)

    命令:redis-server --version

但在測試Redis的遠端連線時,遇到了連線失敗的錯誤。

問題解決:

在網上查詢原因,說是要將配置檔案中的bind 127.0.0.1

註釋掉。但為什麼這麼做呢?

分析原因如下:

redis-server在啟動時,如果沒有指定配置檔案的話,它使用的是預設的配置檔案。

在修改配置檔案時,發現bind 127.0.0.1句處上方的註釋為:

  • ubuntu中為/etc/redis/redis.conf
# By default Redis listens for connections from all the network interfaces
# available on the server. It is possible to listen to just one or multiple
# interfaces using the "bind" configuration directive, followed by one or
# more IP addresses. # # Examples: # # bind 192.168.1.100 10.0.0.1 bind 127.0.0.1
  • windows 中為redis.windows-service.conf
# ~~~ WARNING ~~~ If the computer running Redis is directly exposed to the
# internet, binding to all the interfaces is dangerous and will expose the
# instance to everybody on the internet. So by default we uncomment the
# following bind directive, that will force Redis to listen only into # the IPv4 lookback interface address (this means Redis will be able to # accept connections only from clients running into the same computer it # is running). # # IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES # JUST COMMENT THE FOLLOWING LINE. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ bind 127.0.0.1

需要注意的是,這裡bind選項繫結的 並不是請求連線的客戶機的IP ,而是 提供redis-server服務的伺服器的網路介面,或者說是 網絡卡

當配置bind 127.0.0.1時,意味著 只有127.0.0.1網路介面接收連線請求 ,而 不是隻接受來自127.0.0.1的請求

切記127.0.0.1 不等於你的本機IP,這是兩個不同的網路介面。

當客戶機使用redis-cli -h your_ip_address -p 6379 命令請求連線時,應該是your_ip_address 這個網路介面在接收請求,所以可以做出以下修改:

  • 直接將bind 127.0.0.1註釋掉 。這時,你所有的網路介面都在接收連線請求。(包括127.0.0.1, your_ip_address,…(如果還有其它介面,也在接收請求))(客戶機可以遠端連線)

  • bind 127.0.0.1修改為 bind your_ip_address。這時,只有your_ip_address這個介面在接收請求。(客戶機可以遠端連線,更安全)

修改配置檔案後需要重啟redis-server: 命令為:sudo /etc/init.d/redis-server restart

進行如下測試驗證:

windows中客戶端請求Ubuntu中的Server服務:

  • 未修改啟動:
C:\Users\14344>redis-cli -h 1**.1**.1**.1** -p 6379

# (一直連線不了,失敗)
  • 註釋bind 127.0.0.1
C:\Users\14344>redis-cli -h 1**.1**.1**.1** -p 6379
1**.1**.1**.1**:6379> keys *
(empty list or set)
# (連線成功)
  • 修改bind 127.0.0.1bind your_ip_address
C:\Users\14344>redis-cli -h 1**.1**.1**.1** -p 6379
1**.1**.1**.1**:6379> keys *
(empty list or set)
# (連線成功)

繼續:

接下來修改windows中的配置檔案。

  • windows中有兩個配置檔案(一般為redis.windows-service.conf,手動安裝Redis服務的話有可能會是另一個):

    1

  • 預設的配置檔案根據Redis服務確定,在服務中檢視:

    1

  • 在配置檔案中將bind 127.0.0.1註釋掉,重啟Redis服務。

進行如下測試驗證:

  • 在ubuntu中請求Windows:
bdccl@bdccl-virtual-machine:~$ redis-cli -h 1**.1**.4*.1** -p 6379
1**.1**.4*.1**:6379> keys *
Error: Connection reset by peer

發現 連線成功,但資料操作時發生了錯誤。

查詢原因,發現是需要修改配置檔案中protected-mode配置項

# By default protected mode is enabled. You should disable it only if
# you are sure you want clients from other hosts to connect to Redis
# even if no authentication is configured, nor a specific set of interfaces
# are explicitly listed using the "bind" directive.
protected-mode yes

檢視註釋可知protected-mode配置項預設開啟yes,redis處於保護模式狀態,會拒絕來自其它主機的連線。

  • 解決方式:將protected-mode配置項設為no,注意 要在配置檔案中修改,若直接在客戶端中通過config set protected-mode no命令修改,只對本次有效,redis-server重啟後,還是為yes.

對比發現,Ubuntu系統中Redis配置檔案中不存在此配置項,該配置項應該是較新版本才加入的(3.2版本後)。

修改為 no 後,再次測試,請求連線,資料操作均可正常使用。

結束:

到此,本人的windows 與 Ubuntu 之間就可以相互連線,進行Redis資料庫的操作了。

PS:如果你的遠端連線還是有問題的話,應該檢查一下伺服器端的防火牆設定,看一下是否開啟了6379埠。有關防火牆的操作不是本文重點,讀者自行百度解決即可。

最後,如果本文有什麼錯誤或者不足之處,歡迎指出!