在 docker 容器之间进行负载平衡时,Nginx 并不总是提供 js 和 css - 刷新后即可生效

在 docker 容器之间进行负载平衡时,Nginx 并不总是提供 js 和 css - 刷新后即可生效

我已将 Nginx 设置为在同一服务器上运行的两个 docker 容器之间的反向代理负载平衡。首次加载页面时,页面会加载,但所有 css 和 js 文件都会出现大量 404 错误:

页面加载时出现 404 错误

刷新或打开第二个选项卡时,所有这些错误都会消失,页面加载正常。当我将其减少到仅服务一个容器时,它同样可以正常工作。

我最初以为这是因为 js 和 css 是从同一个根 url 请求的,而负载平衡器和容器的某些方面在单个用户的一组请求在两个服务器之间平衡时抛出了错误。通过一些实验,我尝试使用proxy_set_header Host $host(看起来这里这里寻找答案)——我的理解是,这应该将单个用户的后续请求发送到同一个上游服务器。这似乎使问题发生得更少,但并没有完全消除它。

我剩下的问题(来自一个学习业余爱好者!):

  • 这是正确的用法吗proxy_set_header?因此是否可以从同一个上游服务器为单个用户提供 js/css,而不是在两台服务器之间平衡这些相对较小的请求的负载?
  • 这是否是问题的根源?即第二个容器必须响应第一个容器的页面加载所引发的一些请求,但这些响应却以某种方式不一致?
  • 我的用户群将是 100-200 名用户,他们同时从单个位置访问远程 URL。我认为ip_hash这行不通,因为所有请求都来自同一个 IP?还有其他方法可以更有效地将单个用户绑定到单个服务器吗?

我的 nginx 配置文件:

upstream backend {
        least_conn;
        server localhost:4000;
        server localhost:4001;
}

server {
        listen 80;
        listen [::]:80;

        server_name xxxxxxxxxx;

        location / {
                proxy_pass http://backend;
                proxy_redirect http://backend/ $scheme://$host/;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Host $host;
                proxy_set_header Connection $connection_upgrade;
                proxy_read_timeout 20d;
                proxy_buffering off;
        }
}

相关内容