在现代Web开发中,提升网站响应速度和降低服务器负载是每个开发者都关心的问题。使用 Nginx 结合 Redis 构建缓存系统,是一种高效、稳定且易于维护的解决方案。本教程将从零开始,详细讲解如何配置 Nginx 使用 Redis 作为缓存后端,即使是初学者也能轻松上手。
为什么选择 Nginx + Redis?
Nginx 是一款高性能的 Web 服务器和反向代理服务器,而 Redis 是一个基于内存的键值存储系统,读写速度极快。将两者结合:
- 可以缓存动态页面、API 响应或静态资源
- 显著减少后端应用(如 PHP、Node.js、Python)的压力
- 提升用户访问速度,改善用户体验
前置条件
在开始之前,请确保你已安装以下软件:
- 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 内存使用情况。
