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.1
為bind 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服務的話有可能會是另一個):預設的配置檔案根據Redis服務確定,在服務中檢視:
在配置檔案中將
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埠。有關防火牆的操作不是本文重點,讀者自行百度解決即可。
最後,如果本文有什麼錯誤或者不足之處,歡迎指出!