Express和nginx net :: ERR_CONTENT_LENGTH_MISMATCH

Jak*_*son 7 proxy nginx node.js express

我正在开发一个Express驱动的站点,它正在通过nginx代理.有时在浏览器中加载页面时,我会得到:

GET http://myapp.local/css/bootstrap.css net::ERR_CONTENT_LENGTH_MISMATCH
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果我刷新页面,它通常会消失.但如果一遍又一遍地刷新,它会再次出现.

这里有什么问题?我该怎么做才能缩小这个问题的范围?这是我nginx对此服务器的配置:

server {
  listen 80;
  server_name www.myapp.local;
  rewrite ^(.*) http://myapp.local$1 permanent;
}

server {
  listen 80;
  server_name myapp.local;

  access_log /vagrant/nginx/logs/myapp.local/access.log;
  error_log /vagrant/nginx/logs/myapp.local/error.log;

  location / {
    proxy_pass http://localhost:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
  }
}
Run Code Online (Sandbox Code Playgroud)

这肯定与nginx代理有关.因为如果我只使用IP地址和节点端口访问该站点:http://10.10.10.10:8080那么我永远不会得到错误.但是,如果我使用代理vhost访问它:http://myapp.local那么我最终会得到错误(可能有十分之一的机会我看到它).

Kee*_*nce 6

net::ERR_CONTENT_LENGTH_MISMATCH是一个缓存问题.如果满足某些条件(在您的情况下$http_upgrade),您告诉Nginx绕过缓存.

您应该在某个配置文件中为nginx指定缓存位置.快速修复将删除此文件夹的内容,重新启动nginx,然后再次尝试访问该站点.以缓存为代价的另一个快速解决方法是删除该行proxy_cache_bypass $http_upgrade;

如果您提供有关缓存设置的更多详细信息,则可能会改进此答案.

  • 有意思的谢谢你.我还发现添加`proxy_buffering off`似乎也可以.谢谢, (7认同)
  • **警告**:禁用代理缓冲实际上非常危险,不建议这样做,除非您知道自己到底在做什么。通常,反向代理和后端应用程序服务器位于非常快的 LAN 上。但客户端连接质量参差不齐,有时甚至会停止。如果代理的客户端连接对代理的上游连接(大型资产或 HTTP/2)造成背压,则它可能会劫持应用程序服务器,因为它被迫以客户端较慢的速度耗尽响应的尾部。来源:https://www.maxcdn.com/blog/nginx-application-performance-optimization/ (3认同)

Ara*_*ani 6

这是代理缓冲的问题.启用缓冲后,nginx会尽快从代理服务器接收响应,并将其保存到由proxy_buffer_sizeproxy_buffers指令设置的缓冲区中.如果整个响应不适合内存,则可以将其中的一部分保存到磁盘上的临时文件中.写入临时文件由proxy_max_temp_file_sizeproxy_temp_file_write_size指令控制.

禁用缓冲时,响应会在收到响应时立即同步传递给客户端.nginx不会尝试从代理服务器读取整个响应.nginx一次可以从服务器接收的数据的最大大小由proxy_buffer_size指令设置.

因此,您可以简单地禁用代理缓冲来解决此问题:

proxy_buffering  off;
Run Code Online (Sandbox Code Playgroud)

另请注意,nginx只是尝试写入磁盘上的临时文件,如果磁盘已满,您将收到相同的错误.因此,在禁用之前proxy_buffering检查磁盘使用情况.

  • 添加 `proxy_buffering off;` 为我解决了这个问题。 (2认同)
  • **警告**:禁用代理缓冲实际上非常危险,不建议这样做,除非您知道自己到底在做什么。通常,反向代理和后端应用程序服务器位于非常快的 LAN 上。但客户端连接质量参差不齐,有时甚至会停止。如果代理的客户端连接对代理的上游连接(大型资产或 HTTP/2)造成背压,则它可能会劫持应用程序服务器,因为它被迫以客户端较慢的速度耗尽响应的尾部。来源:https://www.maxcdn.com/blog/nginx-application-performance-optimization/ (2认同)