업스트림에서 응답 헤더를 읽는 동안 업스트림이 너무 큰 헤더를 보냈습니다.


227

이러한 종류의 오류가 발생합니다.

2014/05/24 11:49:06 [오류] 8376 # 0 : * 54031 업스트림에서 응답 헤더를 읽는 동안 업스트림이 너무 큰 헤더를 보냈습니다. 클라이언트 : 107.21.193.210, 서버 : aamjanata.com, 요청 : "GET / the- 구자라트 정부 후원, 구자라트 정부 /, % 20https : /aamjanata.com/the-brainwash-chronicles-ponsored-gu-gujarat-government /, % 20https : /aamjanata.com/the-brainwash-chronicles- 구자라트 정부 후원, % 20https : /aamjanata.com/the-brainwash-chronicles-sponsored-gu-jara-government /, % 20https : /aamjanata.com/the-brainwash-chronicles-sponsored-by- 구자라트 정부 /,%20https:/aamjanata.com/the-brainwash-chronicles-sponsored by-gujarat-government /, % 20https : /aamjanata.com/the-brainwash-chronicles-sponsored-gujarat-government/ , % 20https : /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /, % 20https : / aamjanata.com / the-brainwash-chronicles-sponsored-by-gujarat-government /, % 20https : /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /, % 20https : /aamjanata.com/the- 구자라트 정부 후원, 구자라트 정부 /, % 20https : /aamjanata.com/the-brainwash-chronicles-ponsored-gu-gujarat-government /, % 20https : /aamjanata.com/the-brainwash-chronicles- 구자라트 정부 후원, % 20https : /aamjanata.com/the-brainwash-chronicles-sponsored-gu-jara-government /, % 20https : /aamjanata.com/the-brainwash-chronicles-sponsored-by- 구자라트 정부 /,%20https:/aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government/,%20https://aamjanata.com/the-brainwash-chronicles-sponsored-gu-jara-government /,%20https:/aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government/,%20https:/aamjanata.com / the-brainwash-chronicles-sponsored-by-gujarat-government /, % 20https : /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /, % 20https : /aamjanata.com/the- 구자라트 정부 후원, 구자라트 정부 /, % 20https : /aamjanata.com/the-brainwash-chronicles-ponsored-gu-gujarat-government /, % 20https : /aamjanata.com/the-brainwash-chronicles- 구자라트 정부 후원 ,, % 20ht

항상 동일합니다. 쉼표로 구분하여 URL을 반복해서 반복했습니다. 이 원인을 파악할 수 없습니다. 누구나 아이디어가 있습니까?

업데이트 : 다른 오류 :

http request count is zero while sending response to client

구성은 다음과 같습니다. 관련없는 다른 것들이 있지만이 부분은 추가 / 편집되었습니다

fastcgi_cache_path /var/nginx-cache levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
proxy_buffer_size   128k;
proxy_buffers   4 256k;
proxy_busy_buffers_size   256k;
    # Upstream to abstract backend connection(s) for PHP.
    upstream php {
            #this should match value of "listen" directive in php-fpm pool
            server unix:/var/run/php5-fpm.sock;
    }

그리고 서버 블록에서 : set $ skip_cache 0;

    # POST requests and urls with a query string should always go to PHP
    if ($request_method = POST) {
            set $skip_cache 1;
    }
    if ($query_string != "") {
            set $skip_cache 1;
    }

    # Don't cache uris containing the following segments
    if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
            set $skip_cache 1;
    }

    # Don't use the cache for logged in users or recent commenters
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
            set $skip_cache 1;
    }

    location / {
            # This is cool because no php is touched for static content.
            # include the "?$args" part so non-default permalinks doesn't break when using query string
            try_files $uri $uri/ /index.php?$args;
    }


    location ~ \.php$ {
            try_files $uri /index.php;
            include fastcgi_params;
            fastcgi_pass php;
            fastcgi_read_timeout 3000;

            fastcgi_cache_bypass $skip_cache;
            fastcgi_no_cache $skip_cache;

            fastcgi_cache WORDPRESS;
            fastcgi_cache_valid  60m;
    }

    location ~ /purge(/.*) {
        fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
    }`

프록시 구성이 올바르지 않습니다. 구성을 공유 할 수 있습니까?
Neo

다음을 추가 할 수 있습니까? fastcgi_buffers 16 16k; fastcgi_buffer_size 32k;
Neo

답변:


406

conf 파일에 다음을 추가하십시오

fastcgi_buffers 16 16k; 
fastcgi_buffer_size 32k;

160
귀하의 답변으로 정확한 답변을 얻을 수 있었지만 올바른 버퍼 크기를 결정하는 방법과 그 이유를 보여 주어야합니다. 그렇지 않으면 그것은 어둠 속에서 총입니다. 사이징에 대한 아이디어를 얻으려면 여기를 참조하십시오 : gist.github.com/magnetikonline/…
Wes Johnson

4
"fastcgi_buffer_size 32k;" 혼자서 작동하지 않았으므로 NginX를 다시 시작하려면 두 줄이 필요했습니다. WordPress 플러그인으로 인한 NginX의 502 오류로 인해 여기에 왔습니다.
PJ Brunet

6
경우 fast_cgi_buffers없는 도움을 수행하려고 proxy_buffers 아래에 답을 @amd하여
icc97

11
이 답변에 대한 모든 설명을 참조하십시오.
Edson Horacio Junior

5
그것은 나를 위해 작동합니다. 우분투 16.04에서 nginx 구성 파일이 위치하고 /etc/nginx/nginx.conf값이 http {...} 안에 있어야한다는 것을 추가하고 싶습니다.
Mario

134

nginx가 프록시 / 역 프록시로 실행중인 경우

즉, ngx_http_proxy_module

이외에도 fastcgi상기 proxy모듈은 임시 버퍼 요청 헤더를 저장한다.

당신이 증가하는 것이해야 할 수 있도록 proxy_buffer_size하고,을 proxy_buffers, 또는 완전히 비활성화합니다 (읽어 보시기 바랍니다 의 nginx 설명서를 ).

프록시 버퍼링 구성의 예

http {
  proxy_buffer_size   128k;
  proxy_buffers   4 256k;
  proxy_busy_buffers_size   256k;
}

프록시 버퍼 비활성화 예 (긴 폴링 서버에 권장)

http {
  proxy_buffering off;
}

자세한 정보 : Nginx 프록시 모듈 설명서


8
"proxy_busy_buffers_size"는 모든 "proxy_buffers"에서 하나의 버퍼를 뺀 크기보다 작아야합니다.
chovy

당신은 남자입니다! 감사! 첫 번째 옵션은 루비 온 레일즈 앱에서 작동했습니다
Nezir

어리석은 질문이지만 서버 앞에 프록시가 있어이 오류를 반환합니다. 버퍼 변경이 효과가 있었지만 내부 컴퓨터에 새로운 오류가 발생했습니다. writev() failed (104: Connection reset by peer) while sending to client 해당 프록시 설정으로 해당 오류를 해결할 수 있습니까? 아니면 업스트림 서버 또는 프록시로 이동합니까?
Adam Patterson

1
proxy_buffers 4 ...? 기본값은 8
adrianTNT 인

23

upstream sent too big header while reading response header from upstream "내가보고있는 것을 좋아하지 않는다"고 말하는 nginx의 일반적인 방법입니다

  1. 업스트림 서버 스레드가 충돌했습니다
  2. 업스트림 서버가 유효하지 않은 헤더를 다시 보냈습니다.
  3. STDERR에서 보낸 통지 / 경고가 버퍼를 오버 플로우하고 STDOUT과 STDOUT이 모두 닫혔습니다.

3 : 메시지 위의 오류 로그를보십시오. 메시지 앞에 로그 된 행으로 스트리밍됩니까? PHP message: PHP Notice: Undefined index: 루프 내 로그 파일의 예제 스 니펫 :

2015/11/23 10:30:02 [error] 32451#0: *580927 FastCGI sent in stderr: "PHP message: PHP Notice:  Undefined index: Firstname in /srv/www/classes/data_convert.php on line 1090
PHP message: PHP Notice:  Undefined index: Lastname in /srv/www/classes/data_convert.php on line 1090
... // 20 lines of same
PHP message: PHP Notice:  Undefined index: Firstname in /srv/www/classes/data_convert.php on line 1090
PHP message: PHP Notice:  Undefined index: Lastname in /srv/www/classes/data_convert.php on line 1090
PHP message: PHP Notice:  Undef
2015/11/23 10:30:02 [error] 32451#0: *580927 FastCGI sent in stderr: "ta_convert.php on line 1090
PHP message: PHP Notice:  Undefined index: Firstname

아래에서 세 번째 줄에서 버퍼 한계에 도달하고 끊어졌으며 다음 스레드가 그 위에 썼음을 알 수 있습니다. 그런 다음 Nginx는 연결을 닫고 502를 클라이언트에 반환했습니다.

2 : 요청 당 전송 된 모든 헤더를 기록하고 검토하고 표준을 준수하는지 확인하십시오 (nginx는 24 시간보다 오래된 쿠키를 삭제 / 만료하는 것을 허용하지 않으며 내용을 계산하기 전에 오류 메시지가 버퍼링되어 잘못된 내용 길이를 보냅니다. ..). getallheaders 함수 호출은 일반적으로 추상 코드 상황에서 도움이 될 수 있습니다. PHP는 모든 헤더를 얻습니다.

예를 들면 다음과 같습니다.

<?php
//expire cookie
setcookie ( 'bookmark', '', strtotime('2012-01-01 00:00:00') );
// nginx will refuse this header response, too far past to accept
....
?>

이:

<?php
header('Content-type: image/jpg');
?>

<?php   //a space was injected into the output above this line
header('Content-length: ' . filesize('image.jpg') );
echo file_get_contents('image.jpg');
// error! the response is now 1-byte longer than header!!
?>

1 : 스레드가 올바른 엔드 포인트에 도달하고 완료 전에 종료되지 않도록 확인하거나 스크립트 로그를 작성하십시오.


3
이 대답은 머리에 못을 박았다. 때로는 nginx의 구성뿐만 아니라 실제로 헤더를 생성하는 것입니다. error_reporting에 알림이 포함되어 있지만 php.ini에서 display_errors가 꺼져 있으면 모든 메시지가 내용 대신 FCGI 헤더에 표시됩니다.
Schien

17

플레 스크 지침

Plesk 12에서는 nginx가 리버스 프록시로 실행되었습니다 (기본값이라고 생각합니다). 따라서 nginx도 프록시로 실행되므로 현재 최고 답변이 작동하지 않습니다.

나는 갔다 Subscriptions | [subscription domain] | Websites & Domains (tab) | [Virtual Host domain] | Web Server Settings.

그런 다음 페이지 하단에서 추가 nginx 지시문 을 설정할 수 있습니다.

fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
proxy_buffer_size   128k;
proxy_buffers   4 256k;
proxy_busy_buffers_size   256k;

1
어디? 어떤 구성?
Redsandro

@Redsandro 당신이 그것을 통해 그것을 찾을 수 Subscriptions | [subscription domain] | Websites & Domains (tab) | [Virtual Host domain] | Web Server Settings없다면 나는 당신이 무슨 뜻인지 잘 모르겠습니까?
icc97

도메인> 도메인 이름> 아파치와의 nginx 설정> 추가 nginx를 지시 Plesk를 오닉스 버전 17.8.11 :이 나를위한 솔루션이었다
dijkstra8x

1
새 파일에 이것을 추가 /etc/nginx/conf.d/proxy.conf하고 nginx를 다시 시작했습니다. 감사합니다!
rubo77

6

Symfony 프레임 워크를 사용하는 경우 : Nginx 구성을 엉망으로 만들기 전에 먼저 ChromePHP를 비활성화하십시오.

1-app / config / config_dev.yml 열기

2-다음 줄에 주석을 답니다.

#chromephp:
    #type:   chromephp
    #level:  info

ChromePHP는 X-ChromePhp-Data 헤더에 json으로 인코딩 된 디버그 정보를 압축합니다. fastcgi를 사용하여 nginx의 기본 구성에 비해 너무 큽니다.

출처 : https://github.com/symfony/symfony/issues/8413#issuecomment-20412848


3

우리는이 문제를 겪고있는 한 서버가 fpm 구성을 무효화하여 일반적으로 디스크에 기록되는 PHP 오류 / 경고 / 알림을 FCGI 소켓을 통해 전송하고 있음을 깨달았습니다. 헤더의 일부가 버퍼 청크로 분할 될 때 구문 분석 버그가있는 것 같습니다.

따라서 php_admin_value[error_log]실제로 쓰기 가능한 것으로 설정 하고 php-fpm을 다시 시작하면 문제를 해결하기에 충분합니다.

더 작은 스크립트로 문제를 재현 할 수 있습니다.

<?php
for ($i = 0; $i<$_GET['iterations']; $i++)
    error_log(str_pad("a", $_GET['size'], "a"));
echo "got here\n";

버퍼를 올리면 502가 치기 어려워졌지만 불가능하지는 않았다.

bash-4.1# for it in {30..200..3}; do for size in {100..250..3}; do echo "size=$size iterations=$it $(curl -sv "http://localhost/debug.php?size=$size&iterations=$it" 2>&1 | egrep '^< HTTP')"; done; done | grep 502 | head
size=121 iterations=30 < HTTP/1.1 502 Bad Gateway
size=109 iterations=33 < HTTP/1.1 502 Bad Gateway
size=232 iterations=33 < HTTP/1.1 502 Bad Gateway
size=241 iterations=48 < HTTP/1.1 502 Bad Gateway
size=145 iterations=51 < HTTP/1.1 502 Bad Gateway
size=226 iterations=51 < HTTP/1.1 502 Bad Gateway
size=190 iterations=60 < HTTP/1.1 502 Bad Gateway
size=115 iterations=63 < HTTP/1.1 502 Bad Gateway
size=109 iterations=66 < HTTP/1.1 502 Bad Gateway
size=163 iterations=69 < HTTP/1.1 502 Bad Gateway
[... there would be more here, but I piped through head ...]

fastcgi_buffers 16 16k; fastcgi_buffer_size 32k;:

bash-4.1# for it in {30..200..3}; do for size in {100..250..3}; do echo "size=$size iterations=$it $(curl -sv "http://localhost/debug.php?size=$size&iterations=$it" 2>&1 | egrep '^< HTTP')"; done; done | grep 502 | head
size=223 iterations=69 < HTTP/1.1 502 Bad Gateway
size=184 iterations=165 < HTTP/1.1 502 Bad Gateway
size=151 iterations=198 < HTTP/1.1 502 Bad Gateway

정답은 다음과 같습니다. fpm 구성을 수정하여 오류를 디스크에 기록하십시오.


1

이것은 여전히이 오류를 검색 할 때 Google에서 가장 높은 SO 질문입니다.

이 오류가 발생하고 즉시 NGINX 설정에 대해 자세히 알아보고 싶지 않은 경우 출력을 디버그 콘솔로 점검 할 수 있습니다. 필자의 경우 많은 텍스트를 FirePHP / Chromelogger 콘솔에 출력하고 있었는데 모두 헤더로 전송 되었기 때문에 오버플로가 발생했습니다.

이 오류가 미친 양의 로그 메시지를 전송하여 발생한 경우 웹 서버 설정을 변경하지 않아도됩니다.


0

문제가 헤더 PHP가 보내는 것과 관련이 있는지 확실하지 않습니다. 버퍼링이 활성화되어 있는지 확인하십시오. 간단한 방법은 proxy.conf 파일을 만드는 것입니다.

proxy_redirect          off;
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    100m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffering         on;
proxy_buffer_size       128k;
proxy_buffers           4 256k;
proxy_busy_buffers_size 256k;

그리고 fascgi.conf 파일 :

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;
fastcgi_buffers 128 4096k;
fastcgi_buffer_size 4096k;
fastcgi_index  index.php;
fastcgi_param  REDIRECT_STATUS    200;

다음으로 기본 구성 서버에서 다음과 같이 호출해야합니다.

http {
  include    /etc/nginx/mime.types;
  include    /etc/nginx/proxy.conf;
  include    /etc/nginx/fastcgi.conf;
  index    index.html index.htm index.php;
  log_format   main '$remote_addr - $remote_user [$time_local]  $status '
    '"$request" $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
  #access_log   /logs/access.log  main;
  sendfile     on;
  tcp_nopush   on;
 # ........
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.