سؤال

هل هناك طريقة للحصول على mod_wsgi إعادة تحميل جميع الوحدات (ربما في دليل معين) على كل حمولة؟

أثناء العمل على التعليمات البرمجية، فإنه مزعج للغاية لإعادة تشغيل Apache في كل مرة يتم تغيير شيء ما. الخيار الوحيد الذي وجدته حتى الآن هو وضع modname = reload(modname) أسفل كل استيراد .. ولكن هذا أيضا مزعج حقا لأنه يعني أنني سأضطر إلى المرور وإزالتها جميعا في وقت لاحق ..

هل كانت مفيدة؟

المحلول

mod_wsgi. الوثائق على إعادة تحميل التعليمات البرمجية هو أفضل رهان للحصول على إجابة.

نصائح أخرى

الرابط:

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

يجب التأكيد. كما يجب التأكيد على أنه يجب استخدام وضع Daemon Systems Unix ل MOD_WSGI ويجب أن تقوم بتطبيق شاشة التعليمات البرمجية الموضحة في الوثائق. لن يعمل خيار إعادة شحن العملية بأكملها في وضع مدمج من MOD_WSGI على أنظمة UNIX. على الرغم من أنه على أنظمة Windows، فإن الخيار الوحيد هو الوضع المضمن، فمن الممكن من خلال القليل من الخداع للقيام بنفس الشيء من خلال تشغيل إعادة تشغيل داخلي لأباش من البرنامج النصي لرصد التعليمات البرمجية. كما هو موضح أيضا في الوثائق.

يهدف الحل التالي إلى مستخدمي Linux فقط، وتم اختبارهم للعمل تحت خادم Ubuntu Server 12.04.1

لتشغيل WSGI تحت وضع الخفي، تحتاج إلى تحديد WSGIProcessGroup و WSGIDaemonProcess توجيهات في ملف تكوين Apache الخاص بك، على سبيل المثال

WSGIProcessGroup my_wsgi_process
WSGIDaemonProcess my_wsgi_process threads=15

تفاصيل أكثر متاحة في http://code.google.com/p/modwsgi/wiki/configverdiriectives.

المكافأة الإضافية هي استقرار إضافي إذا كنت تقوم بتشغيل مواقع WSGI متعددة تحت نفس الخادم، يحتمل أن تكون مع توجيهات VirtualHost. بدون استخدام عمليات الخفي، وجدت مواقعين DJango متضاربة مع بعضها البعض وتحويل 500 خطأ خادم داخلي بدلا من ذلك.

في هذه المرحلة، يكون خادمك في الواقع مراقبة موقع WSGI الخاص بك بالفعل للتغييرات، على الرغم من أنه يشاهد الملف الذي حددته فقط باستخدامه WSGIScriptAlias, ، مثل

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

هذا يعني أنه يمكنك إجبار عملية الخفي في WSGI على إعادة التحميل عن طريق تغيير البرنامج النصي WSGI. بالطبع، ليس لديك لتغيير محتوياتها، بل

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

سوف تفعل الخدعة.

من خلال الاستفادة من الطريقة أعلاه، يمكنك إعادة تحميل موقع WSGI تلقائيا في بيئة الإنتاج دون إعادة تشغيل / إعادة تحميل خادم Apache بأكمله، أو تعديل البرنامج النصي WSGI الخاص بك لإجراء مراقبة تغيير رمز الإنتاج غير آمن.

هذا مفيد بشكل خاص عندما يكون لديك البرامج النصية التلقائية، ولا تريد إعادة تشغيل خادم Apache على النشر.

أثناء التطوير، يمكنك استخدام سجلات نظام ملفات الملفات لاستدعاء touch wsgi.py في كل مرة تتغير وحدة واحدة تحت موقعك، على سبيل المثال، pywatch

أعلم أنه موضوع قديم ولكن هذا قد يساعد شخصا ما. لقتل عمليةك عند كتابة أي ملف في دليل معين، يمكنك استخدام شيء مثل هذا:

رصد

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()

في بدء تشغيل الخادم الخاص بك، اتصل به مثل:

server.py.

import monitor

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

إذا كان ملف الخادم الرئيسي الخاص بك موجود في الدليل الذي يحتوي على جميع ملفاتك، فيمكنك الذهاب:

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

تم ترك إضافة مجلدات أخرى كممارسة ...

ستحتاج إلى "تثبيت pip inotify"

تم كل هذا من الشفرة هنا: https://code.google.com/archive/p/modwsgi/wikis/reloadingsourcode.wikirestarting_daemon_processes.

هذه إجابة على سؤالي المكرر هنا: WSGI عملية إعادة تحميل الوحدات

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top