2013-03-17 37 views
10

Tôi có một ứng dụng Django đang chạy ở Gunicorn phía sau Nginx. Tất cả mọi thứ hoạt động tốt, thoát khỏi một điều kỳ lạ: Tôi có một cái nhìn "tải về" và một API json RESTful. Khi gọi chế độ xem tải xuống, tôi sử dụng urllib2 để truy cập API json để nhận thông tin. Và một cách nghiêm túc khi tôi cố gắng thực hiện điều này http nhận được yêu cầu đến api json, yêu cầu lần ra với lỗi HTTP Error 504: Gateway Time-out.Thời gian chờ của nhân viên Gunicorn

Khi tôi chạy mã bằng ./manage.py runerver, mọi thứ hoạt động tốt. Http nhận được yêu cầu đến api json cũng chỉ mất một vài phần nghìn giây, vì vậy không có nguy cơ chạy vào một thời gian chờ.

Ở đây Tình hình trong Pseudo code:

myproject/views.py: (truy cập như: http://myproject.com/download)

1 def download(request, *args, **kwargs): 
2  import urllib2 
3  opener = urllib2.build_opener() 
4  opener.open('http://myproject.com/api/get_project_stats') 

Các opener.open() cuộc gọi trong dòng bốn chạy vào một thời gian chờ khi chạy trong Gunicorn , khi chạy với ./manage.py runserver everytihng hoạt động tốt (và cuộc gọi api chỉ mất vài miliseconds.

Có ai có cùng vấn đề không? quan trọng: Bạn đã giải quyết nó như thế nào?

+0

Các bạn đã thử chơi với [Cài đặt thời gian chờ Gunicorn] (http: // docs.gunicorn.org/en/latest/configure.html#timeout) –

Trả lời

13

tôi đã cùng một vấn đề sử dụng Gunicorn, nginx, Django và Requests

mỗi khi tôi đã làm:

response = requests.get('http://my.url.com/here') 

người lao động sẽ timeout

tôi giải quyết vấn đề bằng cách chuyển từ Syncronous (đồng bộ) công nhân cho công nhân không đồng bộ (eventlet).

nếu bạn đang tung ra dòng lệnh add:

-k 'eventlet' 

nếu bạn đang sử dụng một tập tin cấu hình add:

worker_class = "eventlet" 
+0

Cảm ơn câu trả lời! Đây chính là nó! (Nhưng tôi đã không giải quyết vấn đề này với các công nhân eventlet không đồng bộ. Tôi đã giải quyết nó bằng cách thực hiện yêu cầu HTTP trong một tác vụ không đồng bộ bằng cách sử dụng cần tây.) – Anton

+0

Điều này làm việc cho tôi khi tôi gặp vấn đề tương tự. –

+1

Bạn cũng phải cài đặt eventlet. Tôi đã sử dụng 'pip install eventlet' và sau đó thêm' --worker-class eventlet' vào dòng lệnh. – Gesias

Các vấn đề liên quan