Nodejs与nginx搭配使用时出现大量[warn] 31824#0: *5705 an upstream response is buffered to a temporary file 这是什么情况。

Nodejs与nginx搭配使用时出现大量[warn] 31824#0: *5705 an upstream response is buffered to a temporary file 这是什么情况。

nginx配置: upstream app_1 { server 127.0.0.1:3000; keepalive 512; } server { listen 80; server_name www.xxx.com xxx.com; access_log /var/log/nginx/xxx.log; location /{ proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; proxy_http_version 1.1;

                    proxy_pass    http://127.0.0.1:3000/;
                    proxy_redirect off;
            }
    }

2 回复

当使用 Node.js 作为后端服务并通过 Nginx 反向代理时,可能会遇到如下警告信息:

[warn] 31824#0: *5705 an upstream response is buffered to a temporary file

这种警告表示 Nginx 将上游(即 Node.js 应用)的响应缓冲到了临时文件中。这通常发生在 Nginx 无法一次性接收整个响应,因此需要将其写入磁盘上的临时文件。

解决方法

为了解决这个问题,可以通过调整 Nginx 的配置来减少或避免缓冲。可以增加 proxy_buffer_sizeproxy_buffers 参数,并设置 proxy_max_temp_file_sizeproxy_temp_file_write_size 参数以优化临时文件的大小和写入行为。

示例配置

在 Nginx 配置文件中,修改 upstreamlocation 块如下:

upstream app_1 {
    server 127.0.0.1:3000;
    keepalive 512;
}

server {
    listen 80;
    server_name www.xxx.com xxx.com;

    access_log /var/log/nginx/xxx.log;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_http_version 1.1;

        # 调整缓冲参数
        proxy_buffer_size   128k;
        proxy_buffers   4 256k;
        proxy_busy_buffers_size 256k;

        # 减少临时文件的使用
        proxy_max_temp_file_size 0;

        proxy_pass http://app_1/;
        proxy_redirect off;
    }
}

解释

  1. proxy_buffer_size: 设置 Nginx 缓冲区的初始大小。
  2. proxy_buffers: 设置 Nginx 缓冲区的数量和大小。
  3. proxy_busy_buffers_size: 设置在发送给客户端之前,Nginx 可以使用的最大缓冲区大小。
  4. proxy_max_temp_file_size: 设置 Nginx 缓冲到临时文件的最大大小。将此值设为 0 可以禁用临时文件的生成。

通过这些调整,可以减少 Nginx 使用临时文件进行缓冲的情况,从而提高性能并减少磁盘 I/O 操作。


当Nginx作为反向代理与Node.js应用服务器(如Express)搭配使用时,可能会遇到警告信息an upstream response is buffered to a temporary file。这通常表示Nginx需要临时文件来缓存上游服务器(这里是Node.js)的响应数据。

这是因为Nginx默认情况下会尝试将所有上游响应数据缓存到临时文件中,以防止由于后端响应过慢而导致客户端超时的情况。对于一些较大的响应或流式响应,这可能会影响性能。

解决方案

可以通过调整Nginx的配置来减少这种情况的发生。您可以增加proxy_buffer_sizeproxy_buffersproxy_busy_buffers_size的大小,或者直接关闭缓冲功能。

示例配置:

upstream app_1 {
    server 127.0.0.1:3000;
    keepalive 512;
}

server {
    listen 80;
    server_name www.xxx.com xxx.com;

    access_log /var/log/nginx/xxx.log;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_http_version 1.1;

        # 调整缓存大小
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;

        # 或者关闭缓冲
        # proxy_buffering off;

        proxy_pass http://app_1;
        proxy_redirect off;
    }
}

关闭缓冲

如果您确定您的应用不会产生特别大的响应,并且希望尽可能提高性能,可以考虑关闭缓冲:

proxy_buffering off;

这将禁用所有缓冲功能,直接传递数据给客户端。但请注意,这样做可能会导致性能问题,特别是当后端响应较慢时。

总结

通过适当调整Nginx的缓冲设置,可以有效减少临时文件的生成,从而提升整体性能。如果不确定哪种配置更合适,可以先尝试调整缓冲大小,再根据实际情况决定是否关闭缓冲。

回到顶部