![多个带有 nginx/rails 应用程序的服务器不应该这样做](https://linux22.com/image/700640/%E5%A4%9A%E4%B8%AA%E5%B8%A6%E6%9C%89%20nginx%2Frails%20%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8D%E5%BA%94%E8%AF%A5%E8%BF%99%E6%A0%B7%E5%81%9A.png)
我有 2 台使用 ELB 进行负载平衡的服务器。每台服务器都有相同的 rails 应用程序副本,nginx 在最前面,unicorn 作为应用服务器。
现在浏览器窗口中没有正在加载的 css 文件。检查元素时,我发现它正在查找application-123123.css
其他服务器上的文件。
因此看起来浏览器获取了服务器 1,加载了已application-123123123.css
在其上预编译的 html。然后,当实际的加载调用application-123123123.css
被发送时,它会转到服务器 2,它有自己的时间戳(缺乏更好的词汇)和错误,因为文件application-123123123.css
不存在。
我对 Duck duck go fodder 以及在 nginx/appserver 设置中要查找什么一无所知。有什么想法吗?
答案1
有两种方法可以解决这个问题。第一种方法是让您的应用程序表现得如此,无论请求到达哪个服务器,它都知道被要求做什么。这是首选的、最强大的解决方案,但在很大程度上取决于您的应用程序以及它如何将其静态文件收集到 nginx 可以看到的地方,并以在运行过程中保持一致的方式进行。我不是 rails 开发人员,所以我不能代表您需要做什么才能使这个负载平衡正确。处理缓存破坏的一种常见方法不是使用文件生成的时间戳,而是使用文件本身内容的某种哈希值。如果文件没有更改,则哈希值不会更改,并且哈希值将在服务器之间一致地生成,无论文件是否更改。
第二种方法是在负载均衡器上启用“粘性会话”,这样只要粘性 cookie 仍在浏览器中或过期,用户就会一直指向同一台服务器。但这样做的危险在于,如果他们“粘”的服务器消失了(由于手动或基于时间/负载的关闭),那么如果服务器的行为略有不同,用户可能会遇到一些问题。您需要更详细地检查您的应用程序,以充分了解这里会受到影响的是什么(如果有的话)。