1. 程式人生 > >阿里雲部署Redis伺服器遠端連線問題

阿里雲部署Redis伺服器遠端連線問題

昨天在阿里雲免費領了一個月的雲伺服器,就著最近學的SpringBoot,準備做一個SpringBoot與Redis的整合。

因為以前用的Redis都是安裝在本地的,使用過程中沒遇到什麼大問題,可是一旦部署到真實的雲伺服器上就出現了一大堆問題,且聽我慢慢道來。

在安裝Redis前,雲伺服器例項是完全純淨的。首先執行下面的命令下載並安裝redis:

//下載
wget http://download.redis.io/releases/redis-4.0.9.tar.gz
//解壓
tar xzf redis-4.0.9.tar.gz
//進入解壓後的目錄
cd redis-4.0.9
//安裝到當前目錄
make

如果make失敗,一般是系統中還未安裝gcc造成的,因為Redis是用C語言寫成的,所以需要先通過yum install gcc

安裝C語言環境。

安裝Redis後,先別慌著啟動,因為Redis對遠端連線要求比較苛刻,具體到以下幾點:

Redis服務預設只讓本機訪問,因為現在Redis是在人家阿里雲的伺服器上,所以需要修改成讓外網也能訪問。主要是修改Redis的預設配置檔案reidis.conf。

  • 註釋掉bind 127.0.0.1這一行,這樣可以使所有的ip訪問redis
  • 修改 protected-mode,值改為no,生產環境下要改為yes
  • 為了Redis的安全,需要把#requirepass foobared去掉註釋,foobared改為自己的密碼,例如可以改為requirepass 123456

經過以上幾步後,理論上就可以通過外網訪問到雲伺服器上的Redis了。如果現在去啟動Redis的服務端,會發現Redis只能是前臺啟動,在這裡可以通過修改redis.conf裡的daemonize為yes讓redis開啟後臺啟動。

因為redis採用的是單程序多執行緒的模式。當redis.conf中選項daemonize設定成yes時,代表開啟守護程序模式。在該模式下,redis會在後臺執行,並將程序pid號寫入至redis.conf選項pidfile設定的檔案中,此時redis將一直執行,除非手動kill該程序。

在修改完配置檔案後,我們進入redis-4.0.9的scr目錄,執行以下命令啟動Redis的服務端:

./redis-server ../redis.conf

這樣Redis就在雲伺服器上以後臺的方式啟動了,接下來我在本地快速搭建了一個SpringBoot整合Redis的案例。在application.properties新增如下內容:

#設定redis主機ip
spring.redis.host= #你的雲伺服器IP地址
#連線redis服務的密碼
spring.redis.password= #剛剛在redis.conf中設定的密碼

新增controller如下:

@RestController
public class TestRedis {
    @Autowired
    private StringRedisTemplate strTplRedis;
    @GetMapping("/testredis")
    public String testRedis(){
        strTplRedis.opsForValue().set("testkey", "testvalue");
        strTplRedis.opsForValue().get("testkey");
        return "success";
    }
}

此時我們啟動專案後,訪問localhost:8080/testredis,出現如下錯誤:
這裡寫圖片描述

這裡問題就來了,顯示無法連線到Redis,此時配置檔案裡面該改到的都已經改了,後來我又想到應該是防火牆的問題,因為redis的埠是6379,伺服器預設是不開啟這個埠的,所以我執行下面命令關閉了防火牆:

sudo service iptables stop

重新訪問url,發現還是報同樣的錯……

於是去請教大神,經過大神的一頓排查,最後告訴我應該是我伺服器的安全組規則的問題。

原來,新建的阿里雲伺服器例項,是預設不讓外網訪問的,一個例項屬於一個安全組,這個安全組裡一開始有阿里云為我們定義的規則,預設是不開放任何tcp埠的,具體的可以檢視官方的介紹:新增安全組規則

在修改好安全組規則後,再訪問頁面url,頁面顯示success,這下總算是將資料存進去了,使用Redis的桌面客戶端也能遠端連線到Redis,顯示Redis裡面的資料如下:
這裡寫圖片描述

回頭看來,遠端連線Redis的坑基本上是被我踩完了……