介紹如何在 Ubuntu Linux 中安裝與設定 Redis 資料庫。
Redis 是一種快速、開放原始碼的記憶體內鍵值資料結構存放區,以下是在 Ubuntu Linux 中安裝與設定 Redis 資料庫服務的操作步驟。
安裝 Redis 資料庫
Redis 資料庫伺服器套件已經被收錄在 Ubuntu Linux 的官方套件庫中,在 Ubuntu Linux 中可以直接使用 apt
安裝:
# 更新系統套件 sudo apt update # 安裝 Redis 資料庫伺服器 sudo apt install redis-server
安裝好 Redis 伺服器套件之後,開啟 /etc/redis/redis.conf
這個 Redis 設定檔,將 supervised
參數設定為 systemd
,這樣可以讓 Redis 資料庫伺服器跟 Ubuntu Linux 的 systemd
溝通:
# 由 systemd 控制 Redis 服務
supervised systemd
接著重新啟動 Redis 資料庫服務:
# 重新啟動 Redis 資料庫服務
sudo systemctl restart redis.service
這樣就完成基本的 Redis 資料庫伺服器的安裝了,接著查看 Redis 資料庫服務的狀態:
# 查看 Redis 資料庫服務狀態
systemctl status redis.service
● redis-server.service - Advanced key-value store Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2022-01-17 10:04:22 CST; 4min 29s ago Docs: http://redis.io/documentation, man:redis-server(1) Process: 1685 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS) Main PID: 1705 (redis-server) Tasks: 4 (limit: 19106) Memory: 1.9M CGroup: /system.slice/redis-server.service └─1705 /usr/bin/redis-server 127.0.0.1:6379 Jan 17 10:04:22 vm1624607004853-1933023-iaas systemd[1]: Starting Advanced key-value store... Jan 17 10:04:22 vm1624607004853-1933023-iaas systemd[1]: redis-server.service: Can't open PID file /run/redis/redis-server.pid (yet?) after start: Operation not permitted Jan 17 10:04:22 vm1624607004853-1933023-iaas systemd[1]: Started Advanced key-value store.
對於 Redis 資料庫服務的控制方式,就跟一般的系統服務一樣:
# 啟動 Redis 資料庫服務 sudo systemctl start redis.service # 停止 Redis 資料庫服務 sudo systemctl stop redis.service # 開機自動啟動 Redis 資料庫服務 sudo systemctl enable redis.service # 取消開機自動啟動 Redis 資料庫服務 sudo systemctl disable redis.service
測試 Redis 資料庫
若要測試 Redis 資料庫是否可以正常使用,可以使用 redis-cli
這個 Redis 資料庫的命令列操作介面,執行之後就會進入互動式的指令操作介面:
# Redis 命令列操作介面
redis-cli
127.0.0.1:6379>
在 redis-cli
環境中,可以執行各項 Redis 的指令對資料庫進行操作,例如測試資料庫連線是否正常,可以執行 ping
指令:
ping
PONG
若執行 ping
之後,得到 PONG
的回應,就表示我們與 Redis 資料庫之間的連線是正常的。
接著測試存取鍵值,首先設定一個新的鍵值對應:
set mykey "My value."
OK
然後從 Redis 資料庫中取回 mykey
對應的值:
get mykey
"My value."
這樣就表示 Redis 資料庫式正常運作的,若要刪除剛剛建立的 mykey
鍵值對應,可以使用 del
指令:
del mykey
(integer) 1
若要離開 redis-cli
介面,可以執行 exit
指令:
exit
Redis 資料庫設定
在確認 Redis 資料庫正常可運作之後,可以考慮調整更進一步的設定,以下是在 /etc/redis/redis.conf
設定檔中,較常用的設定值與設定方式。
網路介面
bind
可以用來設定 Redis 資料庫所綁定的網路介面,若在設定檔中沒有以 bind
設定網路介面,Redis 預設會綁定所有的網路介面:
# 綁定網路介面 # bind 192.168.1.100 10.0.0.1 bind 127.0.0.1 ::1
若 Redis 伺服器是處於公開的網路環境,綁定所有網路介面是非常危險的事情,最常見的做法是指綁定本機的 loopback 網路位址。
連接埠
Redis 資料庫伺服器預設所使用的網路連接埠是 6379
,亦可使用 port
設定來更改:
# 網路連接埠
port 6379
保護模式
Redis 的保護模式設定可以防止管理者使用不當的設定,讓伺服器暴露在高度風險中。
# 保護模式
protected-mode yes
當保護模式啟用時,如果設定檔中沒有使用任何 bind
明確指定綁定的網路介面,而且也沒有設定資料庫的密碼保護,則 Redis 就只允許從 IPv4、IPv6 的 loopback 位址(127.0.0.1
、::1
)或 Unix domain sockets 的連線。
保護模式在預設的情況下是啟用的,只有當我們需要讓未經認證的遠端使用者來使用 Redis 資料庫時,才需要將保護模式關閉。
Unix Socket
除了透過網路介面提供連線之外,Redis 亦可由 Unix socket 來讓本機的使用者連線,而 Unix socket 的路徑可以使用 unixsocket
設定來指定:
# 指定 Unix Socket 路徑
unixsocket /var/run/redis/redis-server.sock
而使用 Unix socket 的檔案權限則由 unixsocketperm
指定:
# 指定 Unix Socket 權限
unixsocketperm 700
TCP 連線數上限
在高負載的伺服器中,若 TCP 連線數達到飽和狀態時,會讓連線的速度下降,此時可以調整 tcp-backlog
設定,提高允許同一時間 TCP 連線數上限:
# 同時 TCP 連線數上限
tcp-backlog 511
這個連線數上限值會跟 /proc/sys/net/core/somaxconn
比較,並取最小值,所以在調整時還必須注意 Linux 系統上 somaxconn
與 tcp_max_syn_backlog
的設定值。
連線逾時
timeout
可以設定連線逾時的門檻值:
# 連線逾時門檻值(單位為秒)
timeout 1
若此值設定為 0
則代表停用此功能。
以 Daemon 模式運行
在 Ubuntu Linux 中,通常我們都會以 systemd
來控制 Redis 資料庫,以 daemon 的方式放在系統上背景執行,所以 daemonize
會設定為 yes
,而 supervised
則會設定為 systemd
,這部分除非有特殊的原因,否則不需要更改。
# 以 Daemon 模式背景執行 daemonize yes # 由 systemd 控制 Redis 服務 supervised systemd
而在 Daemon 模式之下,行程的 PID 會記錄在 pidfile
所指定的檔案中,這個設定通常也不需要更動:
# Redis 行程的 PID 檔案
pidfile /var/run/redis/redis-server.pid
記錄檔
Redis 資料庫的記錄檔位置可以由 logfile
來指定:
# 記錄檔位置
logfile /var/log/redis/redis-server.log
至於 Redis 的紀錄層級(要記錄哪一些事件),則可由 loglevel
控制:
# 記錄層級
loglevel notice
可用的記錄層級選項有:
debug
:除錯等級,包含最詳盡的資訊,用於開發與測試階段。verbose
:詳細等級,包含大量細部資訊。notice
:正常等級,適用於正式運行環境。warning
:警告等級,只記錄重大的關鍵訊息。
若要將 Redis 的記錄資訊遞送至系統的 syslog
,可以調整以下幾條設定:
# 啟用 syslog 記錄功能 syslog-enabled yes # syslog 識別字 syslog-ident redis # syslog 的 facility syslog-facility local0
在預設的情況下,Redis 只有在互動式的環境之下啟動時會顯示 ASCII art logo,若希望在普通的記錄檔中也輸出 ASCII art logo,可以設定:
# 總是輸出 ASCII art logo
always-show-logo yes
資料庫數量
Redis 中的資料庫都是以數字編號來指定的,預設的資料庫是 0
,使用者可以在 Redis 中使用 SELECT
指令來選擇要使用的資料庫,而資料庫的總數則可由 databases
設定來調整。
# Redis 資料庫數量
databases 16
資料庫的編號都是由 0
起算,若將 databases
設定為 16
,則可用的資料庫編號則為 0
到 15
,以此類推。
密碼認證
在大部分的應用中,Redis 都是在本機或是內部的環境下運行,所以通常不需要密碼認證,而如果想要啟用密碼認證功能,可以使用 requirepass
設定密碼:
# Redis 資料庫密碼
requirepass your_password
這裡的 your_password
要換成自己設定的密碼。由於 Redis 的 I/O 速度相當快,所以若要有密碼保護的效果,必須將密碼強度大幅提高,否則很容易被暴力法破解。
重新命名指令
在共用的 Redis 環境之下,我們可以將比較具有危險性的指令改為其他的名稱,讓不知道名稱的使用者無法使用該指令:
# 更改指令名稱
rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
亦可將特定指令更名為空字串,直接停用該指令:
# 停用指令
rename-command CONFIG ""