NGINX : 업스트림에서 응답 헤더를 읽는 동안 업스트림 시간 초과 (110 : 연결 시간 초과)


130

업스트림 앱 서버로 Puma를 실행하고 백그라운드 DB 클러스터로 Riak을 실행하고 있습니다. 약 25,000 명의 사용자에 대한 데이터 청크를지도 축소하고 Riak에서 앱으로 반환하는 요청을 보내면 Nginx 로그에 오류가 발생합니다.

업스트림에서 응답 헤더를 읽는 동안 업스트림 시간 초과 (110 : 연결 시간 초과)

동일한 요청으로 nginx 프록시없이 직접 업스트림을 쿼리하면 필요한 데이터를 얻습니다.

Nginx 시간 초과는 프록시가 입력되면 발생합니다.

**nginx.conf**

http {
    keepalive_timeout 10m;
    proxy_connect_timeout  600s;
    proxy_send_timeout  600s;
    proxy_read_timeout  600s;
    fastcgi_send_timeout 600s;
    fastcgi_read_timeout 600s;
    include /etc/nginx/sites-enabled/*.conf;
}

**virtual host conf**

upstream ss_api {
  server 127.0.0.1:3000 max_fails=0  fail_timeout=600;
}

server {
  listen 81;
  server_name xxxxx.com; # change to match your URL

  location / {
    # match the name of upstream directive which is defined above
    proxy_pass http://ss_api; 
    proxy_set_header  Host $http_host;
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_cache cloud;
    proxy_cache_valid  200 302  60m;
    proxy_cache_valid  404      1m;
    proxy_cache_bypass $http_authorization;
    proxy_cache_bypass http://ss_api/account/;
    add_header X-Cache-Status $upstream_cache_status;
  }
}

Nginx에는 많은 시간 제한 지시문이 있습니다. 중요한 것을 놓치고 있는지 모르겠습니다. 어떤 도움이라도 대단히 감사하겠습니다 ....


600 초 이후에만 타임 아웃되어야합니까? 127.0.0.1:3000에 TCP 서버를 설정하여 연결 만 허용하고 아무 작업도 수행하지 않고 시간이 얼마나 걸리는지 확인하여 시간을 측정 할 수 있습니다. 600 초 여야합니다 ...
rogerdpack

답변:


47

이는 업스트림이 요청에 응답하는 데 너무 많은 시간이 걸리고 NGINX가 업스트림이 요청을 처리하는 데 이미 실패했다고 생각하여 오류로 응답하기 때문에 발생합니다. location구성 블록에 proxy_read_timeout을 포함하고 늘리십시오 . 나에게도 같은 일이 일어 났고 직장에서 내부 앱에 1 시간 제한 시간을 사용했습니다.

proxy_read_timeout 3600;

이를 통해 NGINX는 업스트림이 무언가를 반환 할 때까지 한 시간 (3600 초)을 기다립니다.


6
가지고 있습니다 proxy_read_timeout에서 의 HTTP 부분은 도움이되지 않을 수 있습니다. 나는이 proxy_pass지시문 위치 섹션 만이 proxy_read_timeout설정은 차이를했다. (nginx 1.16.0)
JonnyJD

... 어쩌면 일이 :) 변경 나를 위해 HTTP / 서버 / 위치에서 작동하는 것 같다
rogerdpack

39

항상 시간 제한을 늘리지 말아야합니다. 백엔드 서버 응답 시간이 어떤 경우에도 문제가되지는 않습니다.

연결 유지 플래그를 지우고 여기에 대한 답변에 따라 http 버전을 지정하여이 문제를 해결했습니다. https://stackoverflow.com/a/36589120/479632

server {
    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;

        # these two lines here
        proxy_http_version 1.1;
        proxy_set_header Connection "";

        proxy_pass http://localhost:5000;
    }
}

불행히도 나는 이것이 왜 작동하는지 설명 할 수 없으며 링크 된 답변에 언급 된 문서에서 해독하지 못했기 때문에 누군가가 설명을 가지고 있다면 나는 그것을 듣고 매우 관심이 있습니다.


1
proxy_read_timeout프록시 (특정 URL에 대한 경우라도)에 더 많은 처리 시간이 필요하다는 것을 알고 있다면을 조정하지 않는 이유는 무엇 입니까?
Josh M.

안녕하세요! 더 이상 정확한 문제를 기억하지 못하지만 URL의 실제 시간과 관련이 없지만 이러한 설정 없이는 시간 제한이 올바르게 처리되지 않았다고 생각합니다.
Almund

@magicbacon 이것은 몇 년 전 일이어서 더 이상 사건을 거의 기억하지 못하지만 당신이 $http_host맞습니까? 나는 그것이 https를 위해 날지 않을 것이라고 생각하고 있습니다. https 요청을 프록시하는 데에도 추가 설정이 필요할 수 있습니다.
Almund

+1 ... 이것은 어색한 해킹처럼 보이지만 실제로 이것은 공식 문서에서 가져온 것입니다. 킵 얼라이브와 함께 업스트림 지시문을 사용하고이 두 줄을 사용하면 문제가 해결되는 것 같습니다.
Karussell

1
@TimDavis 나는 아마도 그게 더 낫다. WebSockets : serverlab.ca/tutorials/linux/web-servers-linux/…
Almund

26

먼저 nginx 오류 로그 파일을 참조하여 어떤 업스트림이 느려지는지 파악하고 그에 따라 읽기 시간을 조정하십시오.

2017/09/27 13:34:03 [error] 16559#16559: *14381 upstream timed out (110: Connection timed out) while reading response header from upstream, client:xxxxxxxxxxxxxxxxxxxxxxxxx", upstream: "fastcgi://unix:/var/run/php/php5.6-fpm.sock", host: "xxxxxxxxxxxxxxx", referrer: "xxxxxxxxxxxxxxxxxxxx"

그래서 내 서버 구성에서 fastcgi_read_timeout을 조정해야합니다.

 location ~ \.php$ {
     fastcgi_read_timeout 240;
     ...
 }

참조 : 원본 게시물


다음은 시간 정보를 추가하는 방법입니다. "필요한"정도를 확인하는 데 실패한 경우 stackoverflow.com/questions/18627469/… FWIW
rogerdpack

10

귀하의 경우 프록시에서 약간의 최적화를 돕거나 "# 시간 초과 설정"을 사용할 수 있습니다.

location / 
{        

  # time out settings
  proxy_connect_timeout 159s;
  proxy_send_timeout   600;
  proxy_read_timeout   600;
  proxy_buffer_size    64k;
  proxy_buffers     16 32k;
  proxy_busy_buffers_size 64k;
  proxy_temp_file_write_size 64k;
  proxy_pass_header Set-Cookie;
  proxy_redirect     off;
  proxy_hide_header  Vary;
  proxy_set_header   Accept-Encoding '';
  proxy_ignore_headers Cache-Control Expires;
  proxy_set_header   Referer $http_referer;
  proxy_set_header   Host   $host;
  proxy_set_header   Cookie $http_cookie;
  proxy_set_header   X-Real-IP  $remote_addr;
  proxy_set_header X-Forwarded-Host $host;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

나를 위해 위치 섹션 에서 이러한 설정을 사용하면 차이가 있습니다. 에서 그들을 갖는 HTTP의 I도했다 pssibly 때문에 (섹션 도움을하지 않았다 proxy_pass위치 섹션을 참조하십시오.
JonnyJD

이 선언으로 정확히 무엇을 최적화하고 있습니까?
Vlad

9

이 오류는 여러 가지 이유로 발생할 수 있다고 생각하지만 사용중인 모듈에 따라 다를 수 있습니다. 예를 들어 uwsgi 모듈을 사용하여 이것을 보았으므로 "uwsgi_read_timeout"을 설정해야했습니다.


2
나는 uwsgi_read_timeout 3600; proxy_send_timeout 3600; proxy_read_timeout 3600; 나를 위해 작동합니다.
tyan

9

특히 타임 아웃 된 특정 업스트림을 보여주는 업스트림 부분 error_logs에서 를 살펴 보는 것이 좋습니다 .

그런 다음이를 바탕으로 proxy_read_timeout, fastcgi_read_timeout또는 uwsgi_read_timeout.

또한 구성이로드되었는지 확인하십시오.

자세한 내용은 여기에서 Nginx 업스트림 시간 초과 (해결 방법 및 이유)


4

다른 많은 사람들이 여기서 지적했듯이 NGINX의 시간 제한 설정을 늘리면 문제를 해결할 수 있습니다.

그러나 시간 제한 설정을 늘리는 것은 이러한 답변 중 다수가 제안하는 것만 큼 간단하지 않을 수 있습니다. 이 스레드의 거의 모든 사람들이 제안하는 것처럼 나 자신 이이 문제에 직면하여 /etc/nginx/nginx.conf 파일 에서 시간 제한 설정을 변경하려고했습니다 . 이것은 나에게 조금도 도움이되지 않았습니다. NGINX의 타임 아웃 설정에는 명백한 변화가 없습니다. 이제 몇 시간 후에 마침내이 문제를 해결할 수있었습니다.

해결책은 이 포럼 스레드 에 있으며, 타임 아웃 설정을 /etc/nginx/conf.d/timeout.conf넣어야한다는 것입니다 (이 파일이 존재하지 않으면 만들어야 함). 스레드에서 제안한 것과 동일한 설정을 사용했습니다.

proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;

1

동일한 문제가 발생하여 레일 컨트롤러에서 "매일"오류가 발생했습니다. 이유는 모르겠지만 프로덕션에서 puma는 오류를 반복해서 실행하여 메시지를 발생시킵니다.

업스트림에서 응답 헤더를 읽는 동안 업스트림 시간 초과 (110 : 연결 시간 초과)

아마도 Nginx가 퓨마에서 데이터를 계속해서 가져 오려고하기 때문일 것입니다. 재미있는 점은 컨트롤러에서 다른 작업을 호출하더라도 오류로 인해 시간 초과 메시지가 발생하여 단일 오타가 모든 앱을 차단한다는 것입니다.

log / puma.stderr.log 파일을 확인하여 상황인지 확인하십시오.


0

우리 측에서는 프록시 캐시와 함께 spdy를 사용했습니다. 캐시가 만료되면 캐시가 업데이트 될 때까지이 오류가 발생합니다.


0

누군가에게 도움이되기를 바랍니다 : 나는이 오류가 발생했으며 원인은 phpfpm의 로그 폴더에 대한 잘못된 권한이었습니다. phpfpm이 쓸 수 있도록 변경 한 후 모든 것이 정상이었습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.