1. 程式人生 > >關於Redis服務外網訪問不到的問題

關於Redis服務外網訪問不到的問題

在伺服器配置了redis服務,想在本地訪問測試連線,然而一直報這個錯誤

Fatal error: Uncaught exception ‘RedisException’ with message ‘Redis server went away’ in xxxx

錯誤的原因很簡單,就是沒有連線上redis服務,由於redis採用的安全策略,預設會只准許本地訪問。需要通過簡單配置,完成允許外網訪問。

修改redis的配置檔案,將所有bind資訊全部遮蔽。

bind 192.168.1.100 10.0.0.1

bind 192.168.1.8

bind 127.0.0.1

修改完成後,需要重新啟動redis服務。

修改 Linux 的防火牆(iptables),開啟你的redis服務埠,預設是6379

-A INPUT -m state –state NEW -m tcp -p tcp –dport 6379 -j ACCEPT
……
-A INPUT -j REJECT –reject-with icmp-host-prohibited

請注意,一定要將redis的防火牆配置放在 REJECT 的前面。然後執行 service iptables restart

至此,訪問剛剛上面的程式碼,就能夠連結到redis服務,並且能夠正確顯示了。

翻看網上的文章,此處多翻譯為“指定redis只接收來自於該IP地址的請求,如果不進行設定,那麼將處理所有請求,在生產環境中最好設定該項”。這種解釋會totally搞糊塗初學者,甚至是錯誤的。該處的英文原文為

If you want you can bind a single interface, if the bind option is not

specified all the interfaces will listen for incoming connections.

bind 127.0.0.1

該處說明bind的是interface,也就是說是網路介面。伺服器可以有一個網路介面(通俗的說網絡卡),或者多個。打個比方說機器上有兩個網絡卡,分別為192.168.205.5 和192.168.205.6,如果bind 192.168.205.5,那麼只有該網絡卡地址接受外部請求,如果不繫結,則兩個網絡卡口都接受請求。

OK,不知道講清楚沒有,在舉一個例子。在我上面的實驗過程中,我是將bind項註釋掉了,實際上我還有一種解決方案。由於我redis伺服器的地址是 192.168.1.4 。如果我不註釋bind項,還有什麼辦法呢?我可以做如下配置:

bind 192.168.1.4

這裡很多人會誤以為繫結的ip應該是請求來源的ip。其實不然,這裡應該繫結的是你redis伺服器本身接受請求的ip。