写一个 一键安装redis的 脚本 redis的 密码 从文件读取 开发者不必过度关心他的 密码

这个Redis一键安装脚本已经创建好并设置了执行权限。它具有以下特点:
安全的密码管理:
密码存储在单独文件中(/root/.redis_password)
如果文件不存在,自动生成16位随机密码
文件权限设置为600(只有root可读写)
自动安装与配置:
自动安装Redis服务器
配置基本安全设置(只监听127.0.0.1、启用密码验证)
自动启动并设置开机自启
与APISIX插件集成:
创建插件配置文件,指向密码文件
更新了黑名单插件代码,支持从文件读取密码
插件现在有两种密码获取方式:直接配置或从文件读取

您提出了一个很好的观点。让我解释一下为什么我之前推荐使用Redis来存储黑名单IP信息,而不是APISIX的中心化配置管理系统(etcd):
数据更新频率不同:
etcd:适合存储相对静态的配置(路由规则、插件配置)
Redis:更适合频繁变动的运行时数据(黑名单IP、计数器)
TTL支持:
Redis原生支持键TTL(生存时间),非常适合实现"封禁1小时后自动解除"这样的需求
etcd虽然有lease机制,但不如Redis在这方面设计得方便
性能考虑:
高频访问检查黑名单会给etcd带来额外负担
Redis专为高性能数据存储设计,更适合频繁读取操作
集群同步:
所有APISIX节点仍然共享同一份IP黑名单数据(通过共用Redis)
配置(如Redis连接信息)仍存储在etcd中集中管理
这种设计将"配置"与"数据"分离:etcd存储插件配置,Redis存储运行时的黑名单数据,是APISIX架构中比较常见的模式。
!/bin/bash
Redis一键安装脚本 - 密码从文件读取
适用于Ubuntu系统
颜色输出设置
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m'
打印信息函数
log_info() {
echo -e "\({GREEN}[INFO]\){NC} $1"
}
log_warning() {
echo -e "\({YELLOW}[WARNING]\){NC} $1"
}
log_error() {
echo -e "\({RED}[ERROR]\){NC} $1"
exit 1
}
检查root权限
if [ "$EUID" -ne 0 ]; then
log_error "请使用root权限运行此脚本"
fi
密码文件位置
PASSWORD_FILE="/root/.redis_password"
如果密码文件不存在,创建一个随机密码
if [ ! -f "\(PASSWORD_FILE" ]; then
log_info "密码文件不存在,生成随机密码..."
REDIS_PASSWORD=\)(< /dev/urandom tr -dc A-Za-z0-9 | head -c16)
echo "\(REDIS_PASSWORD" > "\)PASSWORD_FILE"
chmod 600 "$PASSWORD_FILE"
log_info "密码已保存到 \(PASSWORD_FILE"
else
REDIS_PASSWORD=\)(cat "$PASSWORD_FILE")
log_info "从文件读取密码成功"
fi
安装Redis
log_info "开始安装Redis..."
apt update -qq
apt install -y redis-server
配置Redis密码和安全设置
log_info "配置Redis安全设置..."
sed -i "s/^# requirepass ./requirepass $REDIS_PASSWORD/" /etc/redis/redis.conf
sed -i "s/^bind ./bind 127.0.0.1/" /etc/redis/redis.conf
sed -i "s/^protected-mode .*/protected-mode yes/" /etc/redis/redis.conf
重启Redis服务
log_info "重启Redis服务..."
systemctl restart redis-server
systemctl enable redis-server
验证Redis是否正常运行
if systemctl is-active --quiet redis-server; then
log_info "Redis已成功安装并启动"
log_info "Redis密码已保存到: $PASSWORD_FILE"
log_info "使用以下命令测试连接: redis-cli -a $(cat $PASSWORD_FILE) ping"
测试Redis连接
RESULT=\((redis-cli -a "\)REDIS_PASSWORD" ping 2>/dev/null)
if [ "$RESULT" = "PONG" ]; then
log_info "Redis连接测试成功!"
else
log_warning "Redis连接测试失败,请检查配置"
fi
else
log_error "Redis安装或启动失败,请检查系统日志"
fi
为ip-blacklist-redis插件创建配置文件
PLUGIN_CONFIG_DIR="/usr/local/apisix/conf/plugins"
mkdir -p "$PLUGIN_CONFIG_DIR"
log_info "创建Redis配置文件供APISIX插件使用..."
cat > "$PLUGIN_CONFIG_DIR/ip-blacklist-redis.yaml" << EOF
redis:
host: 127.0.0.1
port: 6379
password_file: $PASSWORD_FILE
database: 0
timeout: 1000
EOF
log_info "配置文件已创建: $PLUGIN_CONFIG_DIR/ip-blacklist-redis.yaml"
log_info "您可以在APISIX插件配置中引用此文件获取Redis连接信息"
显示Redis信息
log_info "Redis安装信息:"
echo -e "--------------------------------"
echo -e "Redis版本: $(redis-server --version | cut -d " " -f 3)"
echo -e "Redis配置文件: /etc/redis/redis.conf"
echo -e "Redis密码文件: $PASSWORD_FILE"
echo -e "Redis默认端口: 6379"
echo -e "Redis服务状态: $(systemctl is-active redis-server)"
echo -e "--------------------------------"

浙公网安备 33010602011771号