Domyślną Apache/mod_wsgi jest tylko kod aplikacji obciążenie na pierwsze żądanie do procesu, który wymaga, aby aplikacje. Pierwszym krokiem jest więc skonfigurowanie mod_wsgi do wstępnego załadowania kodu po uruchomieniu procesu, a nie tylko do pierwszego żądania. Można to zrobić w mod_wsgi 2.X za pomocą dyrektywy WSGIImsportScript.
Zakładając tryb demona, który jest lepszym rozwiązaniem i tak, oznacza to, że masz coś takiego:
# 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>
Po dokonaniu zmiany kodu, zamiast dotyku plik skryptu WSGI, co jest sprawdzane tylko na następne żądanie, zamiast tego wyślij sygnał SIGINT do procesów w grupie procesów demona.
Za pomocą opcji "display-name" do WSGIDaemonProcess można zidentyfikować procesy przy użyciu programu "ps" w stylu BSD. Przy "display-name" ustawionym na "% {GROUP}", wynik "ps" powinien pokazywać "(wsgi: django)" jako nazwę procesu. Zidentyfikuj identyfikator procesu i wykonaj:
kill -SIGINT pid
Zamień "pid" z rzeczywistym identyfikatorem procesu. Jeśli więcej niż jeden proces w grupie procesów demona, wyślij sygnał do wszystkich z nich.
Nie wiem, czy można użyć "killall" w jednym kroku. Miałem problemy ze robi to na MacOS X.
W mod_wsgi 3.X konfiguracja może być prostsze i można używać zamiast:
# 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>
Oznacza to, że nie ma potrzeby stosowania oddzielnej dyrektywy WSGIImportScript jako specyficznego procesu może grupa i grupa aplikacji jako argumenty do WSGIScriptAlias zamiast z efektem ubocznym, że wstępnie załaduje aplikację.
Właściwie pisanie skryptu restartu, który uruchamia ponownie apache i uruchamia 'wget' 5 razy, wydaje mi się sensownym podejściem do mnie. –
Chociaż możesz być ostrożny, że każde z tych połączeń z 'wget' jest obsługiwane przez inny proces - prawdopodobnie będziesz musiał załadować go wiele razy, aby mieć pewność. –
Przetestowałem to, a konfiguracja apache na webfaction (gdzie jest hostowana aplikacja) przechodzi przez instancje, więc 5 'wget''s robi sztuczkę – Jiaaro