Nginx에서 FastCGI를 사용하여 게이트웨이 시간 초과를 방지하는 방법


203

Django, FastCGI 및 Nginx를 실행 중입니다. 누군가가 XML을 통해 일부 데이터를 보낼 수있는 곳에서 처리 한 다음 전송 된 각 노드에 대한 상태 코드를 반환하는 일종의 API를 만들고 있습니다.

문제는 XML을 처리하는 데 너무 오래 걸리면 Nginx에서 504 게이트웨이 시간 초과가 발생한다는 것입니다 .60 초 이상이라고 생각합니다.

따라서 위치 / api와 일치하는 요청이 120 초 동안 시간 초과되지 않도록 Nginx를 설정하고 싶습니다. 어떤 환경에서 그렇게 할 수 있습니까?

내가 지금까지 가지고있는 것은 :

    # Handles all api calls
    location ^~ /api/ {
        proxy_read_timeout 120;
        proxy_connect_timeout 120;
        fastcgi_pass 127.0.0.1:8080;
    }

편집 : 내가 가지고있는 것이 작동하지 않습니다 :)


7
시간 초과 값을 "120"대신 "2m"으로 설정할 수 있습니다.
Cenk Alti

1
데이터가 스트리밍되지 않는 것은 좋지 않은 것 같습니다. 즉, 서버가 60 초 이상 응답을 시작하면 받아 들일 수없는 것 같습니다.
Adam Gent

답변:


245

프록시 시간 초과는 FastCGI가 아닌 프록시에 적합합니다 ...

FastCGI를 시간 제한에 영향을 미치는 지침은 client_header_timeout, client_body_timeout하고 send_timeout.

편집 : nginx 위키에서 찾은 것을 고려할 때 send_timeout 지시문 은 응답의 일반적인 시간 초과 (비트 오도)를 설정합니다. FastCGI의 경우 fastcgi 프로세스 응답 제한 시간에fastcgi_read_timeout 영향을주는 것이 있습니다.

HTH.


8
uwsgi를 사용하고이 오류가있는 사람은 uwsgi_read_timeout 600; 내 문제를 해결했다.
Homer6

2
내 질문은 (서버 관리자 아마추어로서) 어디에서 변경해야합니까? httpd.conf 파일?
jeffkee

2
도움이된다면 미디어 템플의 DV 시스템에서 / etc / nginx /에있었습니다.
jeffkee

Abdo는 디버깅하는 좋은 방법을 제공합니다. 여전히 문제가 발생하면 nginx.conf에서 최대 클라이언트 메시지 크기를 늘려야 할 수도 있습니다 (client_max_body_size ** M;)
Sam Grondahl

2
시간 초과 imho를 늘리는 것은 올바른 해결책이 아닙니다.
JazzCat

24

유니콘과 레일에 nginx를 사용하는 사람들의 경우 대부분 시간 초과가 unicorn.rb파일에 있습니다.

unicorn.rb에 큰 시간 초과를 두십시오

timeout 500

여전히 문제가 발생하면 nginx의 업스트림에서 fail_timeout = 0을 사용하여 문제가 해결되는지 확인하십시오. 이는 디버깅을위한 것이며 프로덕션 환경에서는 위험 할 수 있습니다.

upstream foo_server {
        server 127.0.0.1:3000 fail_timeout=0;
}

3
나는이 장고에 대해 때문에 사람들이 그것을을 downvoted 생각하지만 당신의 대답은 :) 레일 + 유니콘 내 게이트웨이 시간 초과 문제 해결
ZiggyTheHamster

4

에서 http의 nginx 섹션 (/etc/nginx/nginx.conf)를 추가하거나 수정 :

keepalive_timeout 300s

에서 server의 nginx 섹션 (/etc/nginx/sites-available/your-config-file.com)이 줄을 추가합니다 :

client_max_body_size 50M;
fastcgi_buffers 8 1600k;
fastcgi_buffer_size 3200k;
fastcgi_connect_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;

php의 경우 127.0.0.1:9000 (/etc/php/7.X/fpm/pool.d/www.conf)에서 파일을 수정합니다

request_terminate_timeout = 300

도와 드리겠습니다.


시간을 10000 초로 변경하면 "나쁜"일이 발생합니까?
utdev

아무 나쁜 일도 일어나지 않지만 서비스는 더 많은 시간을 기다립니다. 원하는대로 값을 변경할 수 있습니다.
호세 카를로스 라모스 Carmenates

1

유니콘을 사용하는 경우.

top서버에. 유니콘은 현재 100 %의 CPU를 사용하고있을 것입니다. 이 문제에는 몇 가지 이유가 있습니다.

  • HTTP 요청을 확인해야합니다. 일부는 매우 어려울 수 있습니다.

  • 유니콘의 버전을 확인하십시오. 최근에 업데이트하여 문제가 발생했을 수 있습니다.


0

서버 프록시에서 이와 같이 설정

location / {

                proxy_pass http://ip:80;                

                proxy_connect_timeout   90;
                proxy_send_timeout      90;
                proxy_read_timeout      90;

            }

서버 PHP에서 그렇게 설정

server {
        client_body_timeout 120;
        location = /index.php {

                #include fastcgi.conf; //example
                #fastcgi_pass unix:/run/php/php7.3-fpm.sock;//example veriosn

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