2009-11-09 36 views
22

Khi tôi cập nhật mã trên trang web của mình, tôi (tự nhiên) khởi động lại bản sao apache của tôi để thay đổi sẽ có hiệu lực.Tăng tốc tải trang đầu tiên trong django

Thật không may trang đầu tiên được phân phát bởi mỗi cá thể apache khá chậm khi tải mọi thứ vào RAM lần đầu tiên (5-7 giây cho trang web cụ thể này).

Yêu cầu tiếp theo chỉ mất 0,5 - 1,5 giây vì vậy tôi muốn loại bỏ hiệu ứng này cho người dùng của mình.

Có cách nào tốt hơn để có được tất cả mọi thứ được nạp vào RAM hơn để làm một wget x lần (trong đó x là số trường hợp apache xác định bởi ServerLimit trong http.conf của tôi)

Viết một kịch bản khởi động lại mà khởi động lại apache và chạy wget 5 lần có vẻ như loại hacky với tôi.

Cảm ơn!

+4

Thực ra, viết một tập lệnh khởi động lại để khởi động lại apache và chạy 'wget' 5 lần có vẻ như là một cách tiếp cận hợp lý với tôi. –

+2

Mặc dù bạn có thể phải cẩn thận rằng mỗi cuộc gọi đến 'wget' được xử lý bởi một quá trình khác - bạn có thể phải tải nó lên một số lượng tốt để chắc chắn. –

+1

Tôi đã thử nghiệm nó và cấu hình apache tại webfaction (nơi mà các ứng dụng được lưu trữ) làm chu kỳ thông qua các trường hợp như vậy 5 'wget' của thủ thuật – Jiaaro

Trả lời

31

Giá trị mặc định cho Apache/mod_wsgi là để chỉ mã ứng dụng tải về yêu cầu đầu tiên với một quá trình đòi hỏi rằng các ứng dụng. Vì vậy, bước đầu tiên là cấu hình mod_wsgi để tải trước mã của bạn khi quá trình bắt đầu và không chỉ yêu cầu đầu tiên. Điều này có thể được thực hiện trong mod_wsgi 2.X bằng cách sử dụng chỉ thị WSGIImportScript.

Giả sử chế độ daemon, đó là lựa chọn tốt hơn dù sao, điều này có nghĩa bạn sẽ phải một cái gì đó như:

# Define process group. 

WSGIDaemonProcess django display-name=%{GROUP} 

# Mount application. 

WSGIScriptAlias//usr/local/django/mysite/apache/django.wsgi 

# Ensure application preloaded on process start. Must specify the 
# process group and application group (Python interpreter) to use. 

WSGIImportScript /usr/local/django/mysite/apache/django.wsgi \ 
    process-group=django application-group=%{GLOBAL} 

<Directory /usr/local/django/mysite/apache> 

    # Ensure application runs in same process group and application 
    # group as was preloaded into on process start. 

    WSGIProcessGroup django 
    WSGIApplicationGroup %{GLOBAL} 

    Order deny,allow 
    Allow from all 
</Directory> 

Khi bạn đã thực hiện một sự thay đổi mã, thay vì liên lạc file WSGI kịch bản, mà chỉ kiểm tra trên yêu cầu tiếp theo, gửi tín hiệu SIGINT tới các tiến trình trong nhóm xử lý daemon.

Với tùy chọn 'tên hiển thị' cho WSGIDaemonProcess bạn có thể xác định quy trình nào bằng cách sử dụng chương trình 'ps' kiểu BSD. Với 'tên hiển thị' được đặt thành '% {GROUP}', đầu ra 'ps' sẽ hiển thị '(wsgi: django)' làm tên quy trình. Xác định ID quá trình và thực hiện:

kill -SIGINT pid 

Hoán đổi 'pid' bằng ID tiến trình thực tế. Nếu có nhiều quá trình trong nhóm xử lý daemon, hãy gửi tín hiệu đến tất cả chúng.

Không chắc chắn nếu 'killall' có thể được sử dụng để thực hiện việc này trong một bước. Tôi có vấn đề với làm nó trên hệ điều hành MacOS X.

Trong mod_wsgi 3.x cấu hình có thể được đơn giản và có thể sử dụng thay vì:

# Define process group. 

WSGIDaemonProcess django display-name=%{GROUP} 

# Mount application and designate which process group and 
# application group (Python interpreter) to run it in. As 
# process group and application group named, this will have 
# side effect of preloading application on process start. 

WSGIScriptAlias//usr/local/django/mysite/apache/django.wsgi \ 
    process-group=django application-group=%{GLOBAL} 

<Directory /usr/local/django/mysite/apache> 
    Order deny,allow 
    Allow from all 
</Directory> 

Nghĩa là, không có nhu cầu sử dụng chỉ thị WSGIImportScript riêng biệt như quá trình cụ thể có thể nhóm và nhóm ứng dụng làm đối số cho WSGIScriptAlias ​​thay vì có tác dụng phụ là nó sẽ tải trước ứng dụng.

3

Bạn đang chạy Django như thế nào (mod_python vs mod_wsgi)?

Nếu bạn đang chạy mod_wsgi (ở chế độ daemon), khởi động lại Apache không cần thiết để tải lại ứng dụng của bạn. Tất cả những gì bạn cần làm là cập nhật mtime của tập lệnh wsgi (được thực hiện dễ dàng với touch). tài liệu

mod_wsgi của có một lời giải thích khá kỹ lưỡng của quá trình:

ReloadingSourceCode

+0

Tôi đã tự hỏi tại sao nó không tải lại ứng dụng! Tôi sẽ phải thay thế kịch bản khởi động lại của mình bằng một script wsgi chạm :) sẽ giải quyết vấn đề tải đầu tiên của tôi? hay tôi vẫn cần wget? – Jiaaro

+0

Nó sẽ giảm thời gian dành cho lần tải đầu tiên, nhưng nó sẽ không loại bỏ nó. –

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