一、概述
因为业务需求,mysql8必须部署在机房服务器,不能使用阿里云。
因客户安全性要求,必须开启SSL连接。
二、制作Redis SSL镜像
下载redis源码
wget https://download.redis.io/releases/redis-6.2.6.tar.gz
tar zxvf redis-6.2.6.tar.gz
cd redis-6.2.6
过滤redis.conf配置文件,去除以#开头的,以空行开头的。
cat redis.conf|grep -v "^#"|grep -v "^$" > redis.conf.new
生成ssl证书
mkdir -p /opt/redis/tls
cd /opt/redis/tls
生成 CA 根证书,有效期100年
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -sha256 -key ca.key -days 36500 -subj '/O=Redis Test/CN=Certificate Authority' -out ca.crt
生成 Redis 服务器证书,有效期100年
openssl genrsa -out redis.key 2048
openssl req -new -sha256 -key redis.key -subj '/O=Redis Test/CN=Server' | openssl x509 -req -sha256 -CA ca.crt -CAkey ca.key -CAserial ca.txt -CAcreateserial -days 36500 -out redis.crt
openssl dhparam -out redis.dh 2048
生成Redis SSL镜像
创建一个 Dockerfile,基于官方 Redis 镜像
FROM redis:6.2.17-alpine
# 安装 OpenSSL
RUN apk add --no-cache openssl
# 复制证书文件
COPY tls/redis.crt /tls/redis.crt
COPY tls/redis.key /tls/redis.key
COPY tls/ca.crt /tls/ca.crt
COPY tls/redis.dh /tls/redis.dh
# 复制 Redis 配置文件
COPY redis.conf /usr/local/etc/redis/redis.conf
RUN chown redis:redis -R /tls/
# 启动 Redis
CMD ["redis-server", "/usr/local/etc/redis/redis.conf"]
拷贝redis.conf 文件
cp /opt/redis-6.2.6/redis.conf.new redis.conf
修改redis.conf,增加tls配置
port 0
################################## TLS 配置 ###################################
tls-port 6380
tls-cert-file /tls/redis.crt
tls-key-file /tls/redis.key
tls-ca-cert-file /tls/ca.crt
tls-dh-params-file /tls/redis.dh
tls-auth-clients no
#########################################
redis.conf,完整内容如下:
bind 0.0.0.0
protected-mode yes
port 0
################################## TLS 配置 ###################################
tls-port 6380
tls-cert-file /tls/redis.crt
tls-key-file /tls/redis.key
tls-ca-cert-file /tls/ca.crt
tls-dh-params-file /tls/redis.dh
tls-auth-clients no
#########################################
requirepass 12345678
save 900 1
save 300 10
save 60 10000
maxmemory-policy noeviction
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo no
set-proc-title yes
proc-title-template "{title} {listen-addr} {server-mode}"
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
dir /data
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes
在默认配置文件基础上,主要修改了以下这些
bind 0.0.0.0
protected-mode yes
port 0
################################## TLS 配置 ###################################
tls-port 6380
tls-cert-file /tls/redis.crt
tls-key-file /tls/redis.key
tls-ca-cert-file /tls/ca.crt
tls-dh-params-file /tls/redis.dh
tls-auth-clients no
#########################################
requirepass 12345678
save 900 1
save 300 10
save 60 10000
maxmemory-policy noeviction
dir /data
参数解释:
bind,这个参数必须要改成0.0.0.0,否则java连接无法连接redis
port 0,表示禁用默认的6379端口
tls-auth-clients no,必须设置成no,java代码,不需要双向认证
requirepass,redis登录密码
save 900 1,这些都是rdb的保持策略
maxmemory-policy noeviction,过期策略,不做删除,永久保留
dir /data,redis数据统一在/data里面
编译镜像
docker build -f Dockerfile -t redis:6.2.17-alpine-ssl .
测试运行镜像,是否正常
docker run -it redis:6.2.17-alpine-ssl
没有报错,就说明成功了。
三、正式运行
mkdir -p /data/redis-prod-ssl
cd /data/redis-prod-ssl
拷贝tls
cp -r /opt/redis/tls .
vi redis.conf
只需要修改密码即可,修改requirepass后面的值
编辑docker-compose.yaml
services:
redis-prod-ssl:
image: redis:6.2.17-alpine-ssl
container_name: redis-prod-ssl
ports:
- "6380:6380"
environment:
TZ: Asia/Shanghai
volumes:
- ./redis-data:/data
- ./redis.conf:/usr/local/etc/redis/redis.conf
restart: always
volumes:
redis-data:
启动服务
docker-compose up -d
四、navicat连接
使用navicat软件连接
注意要开启ssl,并指定证书
点击测试连接,提示连接成功,就可以了