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

업스트림 앱 서버로 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에는 많은 시간 제한 지시문이 있습니다. 중요한 것을 놓치고 있는지 모르겠습니다. 어떤 도움이라도 대단히 감사하겠습니다 ….



답변

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

proxy_read_timeout 3600;

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


답변

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

연결 유지 플래그를 지우고 여기에 대한 답변에 따라 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;
    }
}

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


답변

먼저 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;
     ...
 }

참조 : 원본 게시물


답변

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

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;
}


답변

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


답변

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

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

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

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


답변

다른 많은 사람들이 여기서 지적했듯이 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;