You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 6 API应用缓存响应异常求助:切换JWT仍返回旧数据

Rails 6 API + Nginx/Passenger 切换JWT用户后返回旧缓存的解决方案

以下是针对问题的排查和解决步骤:

1. 排查Nginx层面的缓存(最可能的原因)

Nginx作为反向代理,可能独立于Rails进行请求缓存,默认缓存键通常仅基于URL,不会区分不同JWT用户:

  • 检查Nginx配置文件(通常在/etc/nginx/sites-available/或/etc/nginx/conf.d/目录)的server或location块,确认是否存在proxy_cache相关配置:
    • 如果有proxy_cache_path定义缓存目录、proxy_cache指令开启缓存,直接注释这些配置后重启Nginx测试。
    • 若需保留缓存但区分用户,修改proxy_cache_key,将用户标识(如Authorization请求头)加入缓存键:
      proxy_cache_key $scheme$proxy_host$request_uri$http_authorization;
      
  • 检查是否存在add_header Cache-Control指令,这类配置可能覆盖Rails返回的缓存控制头,需注释或调整。

2. 禁用Passenger缓存

Passenger自带页面缓存机制,需明确关闭:
在Nginx配置的Passenger相关块中添加:

passenger_cache_enabled off;

修改后重启Nginx和Passenger。

3. 确保Rails缓存控制头正确传递

在Nginx配置中添加指令,避免代理层修改Rails返回的缓存控制头:

proxy_pass_header Cache-Control;
proxy_pass_header Expires;

4. 验证请求是否到达Rails

查看Rails的log/production.log,确认切换JWT用户后的请求是否被Rails处理:

  • 若日志中无新请求记录,说明请求被Nginx直接缓存返回,重点调整Nginx缓存配置。
  • 同时关闭Postman客户端缓存:进入Postman设置→General→关闭"Cache requests"选项,或在请求头手动添加Cache-Control: no-cache强制刷新。

5. 排查Rails代码级缓存

检查控制器或模型中是否存在手动缓存逻辑,比如使用Rails.cache.fetch但未将用户ID加入缓存键:

# 错误示例:未区分用户的缓存
Rails.cache.fetch("user_movies") do
  current_user.movies.to_a
end

# 正确示例:缓存键包含用户ID
Rails.cache.fetch("user_movies_#{current_user.id}") do
  current_user.movies.to_a
end

若存在此类代码,调整缓存键或暂时注释后测试。

内容的提问来源于stack exchange,提问作者Rubioli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 10:21:04