Nginx + Redis 缓存配置实战(手把手教你搭建高性能Web缓存系统)

V5主机测评

在现代Web开发中,提升网站响应速度和降低服务器负载是每个开发者都关心的问题。使用 Nginx 结合 Redis 构建缓存系统,是一种高效、稳定且易于维护的解决方案。本教程将从零开始,详细讲解如何配置 Nginx 使用 Redis 作为缓存后端,即使是初学者也能轻松上手。

为什么选择 Nginx + Redis?

Nginx 是一款高性能的 Web 服务器和反向代理服务器,而 Redis 是一个基于内存的键值存储系统,读写速度极快。将两者结合:

  • 可以缓存动态页面、API 响应或静态资源
  • 显著减少后端应用(如 PHP、Node.js、Python)的压力
  • 提升用户访问速度,改善用户体验
Nginx + Redis 缓存配置实战(手把手教你搭建高性能Web缓存系统)

前置条件

在开始之前,请确保你已安装以下软件:

  • Nginx(版本 ≥ 1.10)
  • Redis(版本 ≥ 3.0)
  • Linux 服务器(如 Ubuntu/CentOS)
  • 基本的命令行操作能力

第一步:安装 Redis 并启动服务

以 Ubuntu 系统为例,执行以下命令安装 Redis:

sudo apt updatesudo apt install redis-server -ysudo systemctl start redissudo systemctl enable redis  

安装完成后,Redis 默认监听 127.0.0.1:6379,你可以用 redis-cli ping 测试是否正常运行,若返回 PONG 则表示成功。

第二步:编译 Nginx 并启用 Redis 模块

默认的 Nginx 不支持直接与 Redis 通信,我们需要使用第三方模块 ngx_http_redis_module 或更推荐的 nginx-module-vts + lua-nginx-module + redis2-nginx-module。但对小白最友好的方式是使用 OpenResty(它内置了 Lua 和 Redis 支持)。

不过,为了简化流程,我们这里采用一种更直观的方法:通过 Nginx 的 proxy_cache 缓存到本地磁盘,再配合 Lua 脚本与 Redis 交互。但如果你希望直接使用 Redis 作为缓存后端,推荐使用 OpenResty

本文采用 OpenResty 方案,因为它集成了所有必要组件。

安装 OpenResty

# 添加官方仓库wget -O - https://openresty.org/package/pubkey.gpg | sudo gpg --dearmor -o /usr/share/keyrings/openresty.gpgecho "deb [signed-by=/usr/share/keyrings/openresty.gpg] http://openresty.org/package/ubuntu $(lsb_release -sc) main" \    | sudo tee /etc/apt/sources.list.d/openresty.list# 安装sudo apt updatesudo apt install openresty -y  

第三步:配置 Nginx 使用 Redis 缓存

编辑 OpenResty 的配置文件(通常位于 /usr/local/openresty/nginx/conf/nginx.conf),添加如下内容:

http {    upstream redis_backend {        server 127.0.0.1:6379;    }    server {        listen 80;        server_name example.com;        location /api/ {            set $redis_key "cached:$uri";            set $redis_value "";            # 尝试从 Redis 获取缓存            access_by_lua_block {                local redis = require "resty.redis"                local red = redis:new()                red:set_timeout(1000) -- 1秒超时                local ok, err = red:connect("127.0.0.1", 6379)                if not ok then                    ngx.log(ngx.ERR, "failed to connect to redis: ", err)                    return                end                local res, err = red:get(ngx.var.redis_key)                if res and res ~= ngx.null then                    ngx.say(res)                    ngx.exit(200)                end                -- 关闭连接                red:close()            }            # 如果 Redis 无缓存,则代理到后端            proxy_pass http://backend_app;            # 缓存后端响应到 Redis            body_filter_by_lua_block {                local resp_body = string.sub(ngx.arg[1], 1, 1000) -- 限制缓存大小                if ngx.arg[2] then -- 最后一块                    local redis = require "resty.redis"                    local red = redis:new()                    red:set_timeout(1000)                    local ok, err = red:connect("127.0.0.1", 6379)                    if ok then                        red:set(ngx.var.redis_key, resp_body)                        red:expire(ngx.var.redis_key, 60) -- 缓存60秒                        red:close()                    end                end            }        }    }}  

上述配置实现了以下功能:

  • 当用户请求 /api/xxx 时,先检查 Redis 中是否存在键 cached:/api/xxx
  • 如果存在,直接返回缓存内容(200 状态)
  • 如果不存在,转发请求到后端应用,并将响应结果存入 Redis,有效期 60 秒

第四步:测试缓存效果

启动 OpenResty:

sudo /usr/local/openresty/bin/openresty  

然后使用 curl 测试:

curl http://localhost/api/user/123  

第一次请求会较慢(因为要查询后端并写入 Redis),第二次请求将直接从 Redis 返回,速度极快!

常见问题与优化建议

  • 缓存穿透:可对空结果也缓存(如缓存 "NULL" 值,有效期短)
  • 缓存雪崩:设置随机过期时间,避免大量 key 同时失效
  • 安全性:不要将 Redis 暴露在公网,使用防火墙限制访问
  • 性能:Redis 内存有限,合理设置 maxmemory 和淘汰策略(如 allkeys-lru)

总结

通过本教程,你已经学会了如何配置 Nginx Redis缓存,实现 Web 请求的高效缓存。这种架构不仅能提升 Web缓存加速 效果,还能有效减轻后端压力。无论是 API 接口还是动态页面,都可以通过此方案进行优化。记住,合理的 静态资源缓存 策略和 Nginx配置Redis 技巧,是构建高并发网站的关键。

提示:生产环境中建议使用更完善的缓存管理逻辑,并监控 Redis 内存使用情况。

文章版权声明:除非注明,否则均为V5主机测评网_性价比VPS_性价比云服务器_免费独立服务器原创文章,转载或复制请以超链接形式并注明出处。