2009-07-03 52 views
8

Tôi đang chạy một ứng dụng Django trên Apache + mod_python. Khi tôi thực hiện một số thay đổi đối với mã, đôi khi chúng có hiệu lực ngay lập tức, các thời điểm khác chúng không cho đến khi tôi khởi động lại Apache. Tuy nhiên tôi không thực sự muốn làm điều đó vì nó là một máy chủ sản xuất chạy các công cụ khác quá. Có cách nào khác để ép buộc điều đó không?Khởi động lại ứng dụng Django chạy trên Apache + mod_python

Chỉ cần làm rõ, vì tôi thấy một số người nhầm, tôi đang nói về một môi trường sản xuất. Đối với phát triển tôi đang sử dụng máy chủ phát triển của Django, tất nhiên.

Trả lời

15

Nếu có thể, bạn nên chuyển sang mod_wsgi. Điều này bây giờ là recommended way để phục vụ Django anyway, và hiệu quả hơn nhiều về mặt bộ nhớ và tài nguyên máy chủ.

Trong mod_wsgi, mỗi trang web có một tệp .wsgi được liên kết với nó. Để khởi động lại trang web, chỉ cần touch tệp có liên quan và chỉ có mã đó sẽ được tải lại.

+0

Tôi hơi sợ những điều XXgi này sau tất cả những rắc rối tôi gặp phải với FastCGI (chắc chắn, đó là Lighttpd, nhưng vẫn còn): http://stackoverflow.com/questions/393637/django-fastcgi-randomly-raising- operationerror. Không biết wsgi là cách được khuyến khích để triển khai Django ngay bây giờ. Nó từng là mod_python, phải không? Dù sao, tôi sẽ xem xét nó. Cảm ơn! – ibz

+0

s/những điều này/những điều này/:) – ibz

+2

Như đã lưu ý ở nơi khác, bạn phải sử dụng chế độ daemon mod_wsgi để có được tính năng theo đó tải lại sẽ xảy ra khi tệp kịch bản WSGI được chạm vào. –

-1

Sử dụng máy chủ thử nghiệm có trong Django. (như ./manage.py runserver 0.0.0.0:8080) Nó sẽ làm hầu hết mọi thứ bạn cần trong quá trình phát triển. Hạn chế duy nhất là nó không thể xử lý các yêu cầu đồng thời với đa luồng.

Tôi nghe nói rằng có một thủ thuật thiết lập trường hợp tối đa của Apache thành 1 để mọi thay đổi mã được phản ánh ngay lập tức - nhưng vì bạn nói bạn đang chạy các dịch vụ khác, vì vậy đây có thể không phải là trường hợp của bạn.

+0

Thats "MaxRequestsPerChild 1" thiết lập trong httpd.conf như lời kể của zdmytriv, nhưng không làm điều này để xử lý bất kỳ tải trang web. – agiliq

0

Bạn có thể giảm số lượng kết nối xuống 1 bằng cách đặt "MaxRequestsPerChild 1" trong tệp httpd.conf của mình. Nhưng làm điều đó chỉ trên máy chủ thử nghiệm, không phải sản xuất.

hoặc

Nếu bạn không muốn giết các kết nối đang tồn tại và vẫn khởi động lại apache bạn có thể khởi động lại nó "duyên dáng" bằng cách thực hiện "apache2ctl duyên dáng" - tất cả các kết nối hiện tại sẽ được cho phép để hoàn thành.

+0

"apache2ctl duyên dáng" nghe như một thứ gọn gàng. Chắc chắn sẽ nhìn vào đó, mặc dù nó không chính xác những gì tôi đang tìm kiếm. Cảm ơn vì tiền hỗ trợ! – ibz

4

Như những người khác đã đề xuất, hãy sử dụng mod_wsgi để thay thế. Để có khả năng nạp lại tự động, thông qua việc chạm vào tệp tập lệnh WSGI, hoặc thông qua một màn hình tìm kiếm các thay đổi mã, bạn phải sử dụng chế độ daemon trên UNIX. Một bàn tay nhỏ có thể được sử dụng để đạt được cùng trên Windows khi sử dụng chế độ nhúng. Tất cả các chi tiết có thể được tìm thấy trong:

http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode

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