Попытка запустить Pyramid под Apache + mod_wsgi, но не получается - PullRequest
3 голосов
/ 11 марта 2011

У меня работает Apache2 с установленным mod_wsgi.Я подтвердил, что mod_wsgi действительно работает, выполнив this .

Проблема возникает, когда я пытаюсь запустить Pyramid.Я получаю Внутреннюю ошибку сервера, и мой журнал ошибок Apache содержит исключение:

AssertionError: The EvalException middleware is not usable in a multi-process environment

Вот мой VHost:

<VirtualHost *:80>
    ServerName  pyramidtest.dev
    DocumentRoot    /srv/pyramidtest.dev/www/
    AssignUserID    pyramidtest nogroup
    WSGIScriptAlias / /srv/pyramidtest.dev/pyramid/load.wsgi
</VirtualHost>

Вот мой load.wsgi:

import site
site.addsitedir('/opt/pyramid/lib/python2.7/site-packages')

from pyramid.paster import get_app

application = get_app('/srv/pyramidtest.dev/pyramid/test/development.ini', 'main')

mod_wsgi скомпилирован для использования /opt/python2.7 в качестве интерпретатора Python, но я запускаю Pyramid под virtualenv в /opt/pyramid - вот почему у меня в файле load.wsgi site.addsitedir().В случае необходимости apache2 -V:

Server version: Apache/2.2.9 (Debian)
Server built:   Dec 30 2010 11:50:24
Server's Module Magic Number: 20051115:15
Server loaded:  APR 1.2.12, APR-Util 1.2.12
Compiled using: APR 1.2.12, APR-Util 1.2.12
Architecture:   32-bit
Server MPM:     ITK
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/experimental/itk"
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=128
 -D HTTPD_ROOT=""
 -D SUEXEC_BIN="/usr/lib/apache2/suexec"
 -D DEFAULT_PIDLOG="/var/run/apache2.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_LOCKFILE="/var/run/apache2/accept.lock"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="/etc/apache2/mime.types"
 -D SERVER_CONFIG_FILE="/etc/apache2/apache2.conf"

Чего мне не хватает ...?

1 Ответ

6 голосов
/ 11 марта 2011

Вы используете промежуточное программное обеспечение EvalException (как видно из сообщения об ошибке).Это решение этой ошибки на самом деле описано в вики Методы отладки из mod_wsgi.

По сути, поскольку промежуточное ПО позволяет выполнять интерактивную отладку в браузере вашего приложения, все запросы необходимо отправлятьтот же процесс;однако вы запускаете mod_wsgi во встроенном режиме, который может создавать множество процессов по умолчанию.

Из вики:

[...], если вы хотите использоватьэтот браузерный интерактивный отладчик, если ваше приложение запускается во встроенном режиме mod_wsgi, вам нужно настроить Apache таким образом, чтобы он запускал только один дочерний процесс для обработки запросов и чтобы он никогда не создавал никаких дополнительных процессов.Директивы конфигурации Apache, необходимые для достижения этой цели, следующие:

StartServers 1  
ServerLimit 1

Переключение в режим демона (с одним процессом по умолчанию) также решит эту проблему, и его рекомендуется использовать во встроенном режиме.Режим.Вот директивы Apache:

WSGIDaemonProcess pyramidtest.dev display-name=%{GROUP}
WSGIProcessGroup pyramidtest.dev

mod_wsgi также может добавить путь к пути Python для вас.При использовании встроенного режима вы можете использовать:

WSGIPythonPath /opt/pyramid/lib/python2.7/site-packages

При использовании режима демона вместо этого используйте опцию 'python-path' в директиве WSGIDaemonProcess.

WSGIDaemonProcess pyramidtest.dev display-name=%{GROUP} python-path=/opt/pyramid/lib/python2.7/site-packages
WSGIProcessGroup pyramidtest.dev
...