原因:
1、nginx缓冲区太小或超时时间太短
2、后端服务器响应慢
解决方案:
1、设置缓冲区大小和超时时长
server {
listen 8080;
server_name XXX.XXX.com;
large_client_header_buffers 4 16k; # 读取客户端请求头的缓冲区的最大数量和大小
client_max_body_size 300m; #设置nginx能处理的请求大小,超过请求的大小返回异常码413
client_body_buffer_size 128k; #请求主体的缓冲区大小。请求主体超过缓冲区大小就会写入临时文件,缓冲区太小服务器发我跟就会跟缓慢
proxy_connect_timeout 600; #nginx连接到后端服务器的连接超时时间,发起握手等候响应超时时间。默认60s
proxy_read_timeout 600; #连接成功后,等候后端服务器响应时间(后端服务器处理请求时间)
proxy_send_timeout 600; #后端服务器数据回传时间
proxy_buffer_size 64k; #nginx可从服务器一次接收的最大数据大小
proxy_buffers 4 32k; #该指令设置缓冲区的大小和数量,从被代理的后端服务器取得的响应内容,会放置到这里. 默认情况下,一个缓冲区的大小等于内存页面大小,可能是4K也可能是8K,这取决于平台。
proxy_busy_buffers_size 64k; #nginx会在没有完全读完后端响应的时候就开始向客户端传送数据,所以它会划出一部分缓冲区来专门向客户端传送数据(这部分的大小是由proxy_busy_buffers_size来控制的,建议为proxy_buffers中单个缓冲区大小的2倍),然后它继续从后端取数据,缓冲区满了之后就写到磁盘的临时文件中。
proxy_temp_file_write_size 64k; #临时文件由proxy_max_temp_file_size和proxy_temp_file_write_size这两个指令决定。
proxy_temp_file_write_size #是一次访问能写入的临时文件的大小,默认是proxy_buffer_size和proxy_buffers中设置的缓冲区大小的2倍,Linux下一般是8k。
}
2、设置http版本和header的Connection来解决该后端服务器响应慢问题:
proxy_http_version 1.1; #HTTP1.1之后,HTTP协议支持持久连接
proxy_set_header Connection ""; # 设置Connection为长连接(默认为no) Nginx和Server之间维持长连接
location / {
proxy_pass http://xxxxx;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
修改nginx配置文件,增加以上配置后重启nginx即可解决