2013-08-08 3 views
7

nginx + Unicorn (Ubuntu 12.04)에서 Rails (v3.2.13, Ruby 2.0.0) 응용 프로그램을 실행하고 있습니다. 관리자 사용자가 CVS 파일을 통해 사용자 (수천)를 업로드하는 경우를 제외하면 모두 잘 작동합니다. 문제는 30 초로 제한 시간을 설정했기 때문에 가져 오기 프로세스에 더 많은 시간이 걸립니다. 그래서 30 초 후에 nginx 502 Bad Gateway 페이지가 나옵니다 (Unicorn 작업자는 사망).시간 초과 오류를 피하기 위해 nginx + Unicorn을 구성하는 방법은 무엇입니까?

명백한 해결책은 시간 초과를 늘리는 것이지만, 일반적인 문제는 아니기 때문에 다른 문제가 발생할 수 있으므로이 작업을 원하지 않습니다.

이런 종류의 문제를 처리 할 수있는 방법이 있습니까?

미리 감사드립니다.

추신 : 해결책은 코드를 수정하는 것일 수 있습니다. 그렇다면 사용자가 다른 요청을하지 못하도록하고 싶습니다.

몇 가지 아이디어 (가능하면 모르는) :

  • 설정이 요청에 전념 한 노동자.
  • 유니콘에게 "work in progress"신호를 보내어 사망을 피하십시오.

의 nginx-app.conf

upstream xxx { 
    server unix:/tmp/xxx.socket fail_timeout=0; 
} 


server { 
    listen 80; 

    ... 

    location/{ 

    proxy_pass http://xxx; 
    proxy_redirect  off; 
    ... 

    proxy_connect_timeout  360; 
    proxy_send_timeout   360; 
    proxy_read_timeout   360; 
    } 
} 

unicorn.rb

worker_processes 2 

listen "/tmp/xxx.socket" 

timeout 30 

pid "/tmp/unicorn.xxx.pid" 
+0

PS가 너무 짧으므로 오래 사용하십시오. – juanpastas

+0

고맙습니다 @juanpastas, 매우 도움이됩니다. – cortex

+2

메모 만 남았습니다. 귀하의'proxy_connect_timeout','proxy_send_timeout','proxy_read_timeout' 값들은 매우 비정상입니다. 설명서를 읽으십시오. 아마도 그 의미를 이해하지 못할 것입니다. 그리고'fail_timeout = 0'은 절대 의미가 없습니다. – VBart

답변

9

이렇게하면 대기열을 만드는 것이 좋습니다. 그리고 당신은 :

  • 업로드 CSV 파일이 작업이 진행되는 동안
  • (... 그 시간 동안 갈 수있는) 사용자 데이터를 가져옵니다
  • 당신의 배경 작업 (즉, 30 초 이내 일 것)을 작업 상태/퍼센트/등의 일종의 WIP 페이지를 제공 할 수 있습니다.

예를 들어 https://github.com/resque/resque을 확인하십시오. 다른 대기열이 많이 있습니다.

+0

당신은 많은 것들을 할 수 있습니다 ... 1000s의 이메일을 보내는 것, 비디오/이미지를 변환하는 것 ... 많은 것들. – NilColor

+0

Resque는 본질적으로 Ruby Thread와 동일한 것입니까? 아니면 나는 벗어 났습니까? http : //www.ruby-doc.org/core-2.1.1/Thread.html –

+0

아니요. Message Queue (http://en.wikipedia.org/wiki/Message_queue)입니다. Resque 자체는 스레드를 사용합니다. 스레드는 병렬 처리 용입니다. 비동기 처리를위한 대기열. – NilColor

2

문제의이 종류를 처리 할 수있는 방법이 있나요?

작업을 백그라운드에서 수행하십시오. 대기열에서 작업을 하나씩 가져 와서 처리하는 별도의 프로세스가 있어야합니다. 또한 사용자 요청에 대해 작동하지 않으므로 필요에 따라 작업을 수행 할 수 있습니다. 이 경우 유니콘을 필요로하지 않고 별개의 데몬입니다.

관련 문제