配置redis外網可訪問,配置redis訪問
環境描述
在 Linux 中安裝了redis 服務
在 Windows 中安裝了xampp環境。以供PHP運行
PHP代碼如下:
<?php $redis = new Redis(); $redis->connect('192.168.1.4', 6379); $redis->set('tag', 'hello'); echo 'name:', $redis->get('tag');
執行以上代碼時,報錯如下:
Fatal error: Uncaught exception ‘RedisException’ with message ‘Redis server went away’ in xxxx
RedisException: Redis server went away in xxxxxx
解錯誤分析及解決辦法
錯誤的原因很簡單,就是沒有串連上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服務,並且能夠正確顯示了。
關於bind
翻看網上的文章,此處多翻譯為“指定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。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。