2012-04-21 12 views
38

Tôi đang chạy một ứng dụng django trên xoắn sử dụng các tập lệnh django-on-twisted từ this site.Máy chủ bị treo đột ngột gặp sự cố khi chạy django

Tất cả các yêu cầu được phục vụ bởi máy chủ nginx để đảo ngược proxy có liên quan đến yêu cầu bị xoắn. Tôi có một thiết lập url cho một API, mà về cơ bản chỉ nhận được yêu cầu và thực hiện một số xử lý trên các tham số nhận được trước khi gửi một phản hồi. Tuy nhiên, khi một khách hàng cụ thể đang nhấn api, máy chủ bị xoắn chỉ tắt. Đã dán bên dưới là nhật ký Nginx:

the.ip.of.client - - [21/Apr/2012:11:30:36 -0400] "GET /api/url/?get=params&more=params HTTP/1.1" 499 0 "-" "Java/1.6.0_24" 

Nhật ký xoắn không hiển thị gì ngoài những điểm dừng xoắn tại thời điểm này. Bởi mã lỗi 499, tôi giả sử rằng khách hàng đóng kết nối bất ngờ, mà tôi không có vấn đề với. Liệu khách hàng có nhận được phản hồi hay không không quan trọng đối với tôi. Dưới đây là chế độ xem django có liên quan:

def api_url(request): 
    if request.GET: 
     get_param = request.GET.get('get', [''])[0] 
     more_param = request.GET.get('more', [''])[0] 
     #some processing here based on the get params 
     return HttpResponse('OK') 
    else: 
     raise Http404 

Yêu cầu từ khách hàng là yêu cầu hợp lệ và không ảnh hưởng đến việc xử lý theo cách bất lợi. Tôi đã thử nghiệm nó từ vỏ. Khi tôi đã thử nó trên máy chủ phát triển django, nó bị rơi theo cùng một cách quá mà không để lại bất kỳ dấu vết nhận được yêu cầu. Mọi thứ hoạt động hoàn hảo tốt khi thử nghiệm nó từ trình duyệt. Ngoài ra, máy chủ xoắn hoạt động tốt cho tất cả các trường hợp sử dụng thông thường. Đây là lần đầu tiên tôi gặp phải vấn đề với nó. Bất kỳ trợ giúp hoặc con trỏ sẽ được đánh giá cao.

+1

gì "tắt" nghĩa là gì? Nó có thoát ra không? Có một tín hiệu khiến nó thoát ra không? –

+0

Máy chủ bị xoắn không ghi bất kỳ thứ gì vào nhật ký. Tôi khá chắc chắn nó không phải là một lối ra sạch. Nó chỉ ngừng hoạt động. Bất kỳ ý tưởng làm thế nào tôi có thể có thể bắt tín hiệu thoát? – tapan

+6

Nếu bạn đang sử dụng bash, thì '$?' Sẽ trợ giúp. Từ trang bash man: **? Mở rộng đến trạng thái thoát của đường dẫn nền trước được thực thi gần đây nhất. ** Vì vậy, ví dụ: 'twistd ...; echo $? ' –

Trả lời

1

Không có mã 499 http trong rfc. Nginx tự định nghĩa mã 499.

Khi khách hàng gửi yêu cầu và đóng kết nối mà không cần chờ đợi phản hồi, mã 499 xảy ra. Nếu có rất nhiều 499 trong số truy cập access_log của bạn, chủ yếu là do các đầu cuối chậm (quá chậm đối với người dùng để đợi). Bạn có thể phải tối ưu hóa hiệu suất trang web của mình.

http://forum.nginx.org/read.php?2,213789,213794#msg-213794

+0

Phần phụ trợ thực sự tốt. 499 được gây ra bởi một bot đang đổ dữ liệu lên backend thông qua các biến. Nó sẽ gửi yêu cầu và ngay lập tức đóng kết nối mà không cần chờ phản hồi. Đây là hành vi có thể chấp nhận được. Tôi chỉ không muốn bị va chạm vì nó. Tôi đang sử dụng gunicorn bây giờ và nó hoạt động hoàn hảo cho cùng một trường hợp sử dụng. – tapan

1
  • bạn nói vấn đề là từ một khách hàng đánh một url cụ thể (tái sản xuất?)
  • vì nó làm việc cho bạn với gunicorn nhưng không django-on-xoắn, một trong hai kịch bản không phải là hoạt động bình thường hoặc twisted.web2 là vấn đề.

hãy thử $ sh init.sh yourdjangoproject stand.

bạn cũng có thể cố gắng sửa đổi run.py để bắt SystemExit:

import pdb 
try: 
    # __main__ stuff here. 
except (KeyboardInterrupt, SystemExit): 
    pdb.set_trace() 
+0

Cảm ơn bạn đã trả lời! Tôi thực sự không ở vị trí để kiểm tra điều này vì chúng tôi đã chuyển sang một kiến ​​trúc hoàn toàn mới. Nhưng, tôi sẽ cố gắng và thiết lập một môi trường cho trường hợp cụ thể này đôi khi sau đó và xem câu trả lời của bạn có giúp ích gì không. – tapan