Nginx:*42 上游读取上游响应标头时发送的标头太大 - 随机行为

Nginx:*42 上游读取上游响应标头时发送的标头太大 - 随机行为

我有一个运行 nginx 的 ec2 实例。

这是我的 nginx 配置:


    server {
      listen       443 ssl;
      root         /var/www/angular/dist/testenpoint-website-angular;
      index        index.htm index.html;
      server_name  www.testenpoint.com;
      client_max_body_size 100m;
    
      location / {
      try_files $uri $uri/ /index.html;
    }
    
    location /applicationApis/ {
      root /var/www/html;
      try_files $uri $uri/ =404;
      include fastcgi_params;
      fastcgi_pass unix:/run/php-fpm/www.sock;
      fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    }
    
    error_page 404 /404.html;
    location = /40x.html {
    }
    
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    }
    
    
    ssl_certificate /etc/letsencrypt/live/testenpoint-all/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/testenpoint-all/privkey.pem; # managed by Certbot
    }
    
    server {
    if ($host = testenpoint.com) {
    return 301 https://$host$request_uri;
    } # managed by Certbot
    
    
    if ($host = www.testenpoint.com) {
    return 301 https://$host$request_uri;
    } # managed by Certbot
    
    
    listen      80;   #listen for all the HTTP requests
    server_name testenpoint.com www.testenpoint.com;
    return      301         https://www.testenpoint.com$request_uri;
    
    }
    
    server {
    if ($host = testenpoint.co.uk) {
    return 301 https://www.testenpoint.com$request_uri;
    } # managed by Certbot
    
    
    if ($host = www.testenpoint.co.uk) {
    return 301 https://www.testenpoint.com$request_uri;
    } # managed by Certbot
    
    
    listen      80;
    server_name testenpoint.co.uk *.testenpoint.co.uk;
    return      301         https://www.testenpoint.com$request_uri;
    
    
    }
    server {
    listen       443;
    server_name  testenpoint.co.uk *.testenpoint.co.uk;
    return       301         https://www.testenpoint.com$request_uri;
    }

我通过我的角度应用程序调用它,如下所示:

https://www.testenpoint.com/applicationApis/getPdfReport.php

请求中会发送 auth 标头,并在正文中发送一些参数。一个参数称为“filterObject”,这是一个字符串对象。当它为空时,请求没有问题。当我通过 angular 应用程序向其中发送内容时,我得到了 404 响应。通过 postman,没有问题。通过我的测试实例也没有问题。

当发生这种情况时,我的 nginx 日志中会出现此错误:


2023/01/03 19:28:50 [error] 24875#0: *42 upstream sent too big header while reading response header from upstream, client: xx.xx.xxx.xxx, server: www.testenpoint.com, request: "POST /applicationApis/getPdfReport.php HTTP/1.1", upstream: "fastcgi://unix:/run/php-fpm/www.sock:", host: "www.testenpoint.com", referrer: "http://localhost:4200/"

2023/01/03 19:28:50 [error] 24875#0: *42 open() "/var/www/angular/dist/my-website-angular/50x.html" failed (2: No such file or directory), client: xx.xx.xx.xx, server: www.testenpoint.com, request: "POST /applicationApis/getPdfReport.php HTTP/1.1", upstream: "fastcgi://unix:/run/php-fpm/www.sock", host: "www.testenpoint.com", referrer: "http://localhost:4200/"

我想知道是否有人可以帮忙?

还要注意的是,PHP 代码确实运行了,因为我可以看到日志等,直到完成。但我得到的只是 404,尽管我的 PHP 代码没有显示任何错误。我相信这是一个 Nginx 配置问题,它只发生在这个配置的实例上,而不是我的配置略有不同的测试实例上

答案1

如果您启用了 fastcgi,则必须在位置部分添加:

fastcgi_buffers 16 32k;
fastcgi_buffer_size 64k;
fastcgi_busy_buffers_size 64k;

来源:https://www.cyberciti.biz/faq/nginx-upstream-sent-too-big-header-while-reading-response-header-from-upstream/

答案2

您需要编辑代理缓冲区设置。本文将帮助您:https://ma.ttias.be/nginx-proxy-upstream-sent-big-header-reading-response-header-upstream/

然后重新加载nginx。

答案3

您需要确定产生原始错误的请求的处理位置。“上游”可能有很多不同的东西(代理、fastcgi、uwsgi)。

您需要调整适当的上游 *_buffers 和 *_buffer_size 以使适当的缓冲区变得更大。

您可以设置以下值并测试它是否有效。如果不行,您可以手动将值增加到 64k、128k、256k 和 512k。然后重新加载 nginx。

*_buffers 16 32k;
*_buffer_size 64k;
*_busy_buffers_size 64k;

相关内容