2009-04-20 15 views
10

Có cách nào để có mod_wsgi tải lại tất cả các mô-đun (có thể trong một thư mục cụ thể) trên mỗi tải?mod_wsgi lực tải lại mô-đun

Trong khi làm việc trên mã, nó rất khó chịu để khởi động lại apache mỗi khi một cái gì đó được thay đổi. Tùy chọn duy nhất mà tôi đã tìm thấy cho đến nay là đặt modname = reload(modname) bên dưới mỗi lần nhập .. nhưng điều đó cũng thực sự gây phiền nhiễu vì điều đó có nghĩa là tôi sẽ phải trải qua và xóa tất cả chúng vào một ngày sau ..

Trả lời

5

mod_wsgi documentation on code reloading là đặt cược tốt nhất cho câu trả lời.

+2

Tôi đã đọc rằng .. không phải là hữu ích mặc dù: ( – Ian

+0

Ian, điều này là vì bạn đang ở trên Windows hoặc sử dụng mod_wsgi ở chế độ nhúng? Bởi vì nếu không trang đó có một số mã để khởi động lại tự động và nó hoạt động hoàn hảo. –

+0

Không, đây là trên linux. Việc tải lại tự động chỉ áp dụng cho tập lệnh được truy cập, không áp dụng cho các mô-đun mà tập lệnh sau đó gọi. – Ian

11

Liên kết:

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

Cần nhấn mạnh. Cũng cần nhấn mạnh rằng trên các hệ thống UNIX, chế độ daemon của mod_wsgi phải được sử dụng và bạn phải triển khai trình giám sát mã được mô tả trong tài liệu. Toàn bộ quá trình tải lại tùy chọn sẽ không hoạt động cho chế độ nhúng của mod_wsgi trên các hệ thống UNIX. Mặc dù trên các hệ thống Windows, tùy chọn duy nhất là chế độ nhúng, có thể thông qua một chút thủ thuật để làm điều tương tự bằng cách kích hoạt khởi động lại nội bộ của Apache từ tập lệnh theo dõi mã. Điều này cũng được mô tả trong tài liệu.

9

Các giải pháp sau đây nhằm chỉ những người dùng Linux, và đã được thử nghiệm làm việc dưới Ubuntu Server 12.04.1

Để chạy WSGI dưới chế độ daemon, bạn cần phải xác định WSGIProcessGroupWSGIDaemonProcess chỉ thị trong tập tin cấu hình Apache của bạn Ví dụ

WSGIProcessGroup my_wsgi_process 
WSGIDaemonProcess my_wsgi_process threads=15 

Thông tin chi tiết có sẵn trong http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives

Một thêm tiền thưởng là sự ổn định thêm nếu bạn đang chạy nhiều trang web WSGI dưới sam e máy chủ, có khả năng với chỉ thị VirtualHost. Nếu không sử dụng quy trình daemon, tôi đã tìm thấy hai trang web Django xung đột với nhau và chuyển lên 500 Lỗi Máy chủ Nội bộ theo cách khác.

Tại thời điểm này, máy chủ của bạn là trong thực tế đã theo dõi trang web WSGI của bạn cho những thay đổi, mặc dù nó chỉ theo dõi các tập tin mà bạn chỉ định sử dụng WSGIScriptAlias, như

WSGIScriptAlias//var/www/my_django_site/my_django_site/wsgi.py 

Điều này có nghĩa rằng bạn có thể buộc quá trình daemon WSGI để tải lại bằng cách thay đổi tập lệnh WSGI. Tất nhiên, bạn không phải thay đổi nội dung của nó, nhưng thay vào đó,

$ touch /var/www/my_django_site/my_django_site/wsgi.py 

sẽ thực hiện thủ thuật.

Bằng cách sử dụng phương pháp trên, bạn có thể tự động tải lại trang web WSGI trong môi trường sản xuất mà không cần khởi động lại/tải lại toàn bộ máy chủ Apache hoặc sửa đổi kịch bản WSGI của bạn để thực hiện giám sát thay đổi mã sản xuất không an toàn.

Điều này đặc biệt hữu ích khi bạn đã triển khai tự động tập lệnh và không muốn khởi động lại máy chủ Apache khi triển khai.

Trong phát triển, bạn có thể sử dụng một hệ thống tập tin thay đổi watcher để gọi touch wsgi.py mỗi khi một module dưới thay đổi trang web của bạn, ví dụ, pywatch

2

Tôi biết đó là một chủ đề cũ nhưng điều này có thể giúp đỡ một ai đó.Để giết quá trình của bạn khi bất kỳ tập tin trong một thư mục nào đó được ghi vào, bạn có thể sử dụng một cái gì đó như thế này:

monitor.py

import os, sys, time, signal, threading, atexit 
import inotify.adapters 

def _monitor(path): 

    i = inotify.adapters.InotifyTree(path) 

    print "monitoring", path 
    while 1: 
     for event in i.event_gen(): 
      if event is not None: 
       (header, type_names, watch_path, filename) = event 
       if 'IN_CLOSE_WRITE' in type_names: 
        prefix = 'monitor (pid=%d):' % os.getpid() 
        print "%s %s/%s changed," % (prefix, path, filename), 'restarting!' 
        os.kill(os.getpid(), signal.SIGKILL) 

def start(path): 

    t = threading.Thread(target = _monitor, args = (path,)) 
    t.setDaemon(True) 
    t.start() 

    print 'Started change monitor. (pid=%d)' % os.getpid() 

Trong khi khởi động máy chủ của bạn, hãy gọi nó thích:

máy chủ py

import monitor 

monitor.start(<directory which contains your wsgi files>) 

nếu tập tin máy chủ chính của bạn là trong thư mục chứa tất cả các file của bạn, bạn có thể đi như:

monitor.start(os.path.dirname(__file__)) 

Thêm các thư mục khác là trái như một bài tập ...

Bạn sẽ cần phải PIP cài đặt inotify '

này được cribbed từ mã ở đây: https://code.google.com/archive/p/modwsgi/wikis/ReloadingSourceCode.wiki#Restarting_Daemon_Processes

Đây là một trả lời cho câu hỏi trùng lặp của tôi ở đây: WSGI process reload modules