Я пытаюсь запустить Apache2 с поддержкой процессов демона mod_wsgi в Ubuntu 10.04.3 LTS (lucid).
Проблема в том, что я не могу найти рабочую конфигурацию директивы WSGISocketPrefix. Мои настройки:
<VirtualHost *:80>
...
WSGIDaemonProcess myapp threads=5
WSGIScriptAlias / /var/www/myapp/myapp.wsgi
<Directory /var/www/myapp>
WSGIProcessGroup myapp
WSGIApplicationGroup %{GLOBAL}
WSGIScriptReloading On
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
Apache работает как root. Я использую фреймворк Flask Python, поэтому следовал этому руководству: http://flask.pocoo.org/docs/deploying/mod_wsgi/#configuring-apache. Без других настроек получил Служба 503 временно недоступна Ошибка HTTP. В журнале ошибок Apache я получил такое сообщение:
[Mon Oct 17 15:24:24 2011] [error] [client 90.181.85.69] (13)Permission denied: mod_wsgi (pid=21805): Unable to connect to WSGI daemon process 'kvinono' on '/var/run/apache2/wsgi.16282.4.1.sock' after multiple attempts.
Потом я нашел это: https://code.google.com/p/modwsgi/wiki/ConfigurationIssues#Location_Of_UNIX_Sockets, поэтому я попытался установить WSGISocketPrefix на любое значение, которое приходило мне в голову, и всегда пытался перезапустить / перезагрузить Apache и смотрел, работает ли он. Никогда не работал, всегда ошибка разрешения, только в другом месте. Я попытался настроить пользователя / группу на процесс WSGI:
WSGIDaemonProcess myapp user=www-data group=www-data threads=5
... и в то же время установить правильные разрешения для таких папок, как / var / run / wsgi и т.п., но это не помогло. Запуск процесса демона WSGI с правами root / root был невозможен, Apache не позволяет мне этого делать. На самом деле WSGI мог писать, и он действительно записал файл сокета в папку, когда все разрешения были установлены правильно, но это не решило ошибку. Даже с существующим файлом сокета он давал совершенно то же самое доступ запрещен ошибка. После еще нескольких попыток и комбинаций я попытался установить WSGISocketPrefix даже в / tmp. Опять же, WSGI смог создать файл сокета, но все равно "вылетел" из-за указанной выше ошибки.
Я в полном отчаянии :-( Если вы предложите мне потанцевать вокруг костра и спеть какие-нибудь шаманские проклятия, я готов сделать это, только если это поможет решить проблему.
Ответ Грэма Дамплтона может сработать, я не пробовал. Я использую mod_wsgi 3.2, и у меня такая же проблема.
Проблема, похоже, в том, что WSGISocketPrefix начинается в / etc / httpd (или / etc / apache2) и использует простую конкатенацию. Итак, когда вы добавляете в свой конфиг
WSGISocketPrefix /var/run/wsgi
в итоге он пытается поместить файл в / etc / httpd // var / run / wsgi. По какой-то причине он не регистрирует эту ошибку.
Обходной путь? У меня так работает:
WSGISocketPrefix ../../var/run/wsgi
Я обнаружил это, используя "var / run / wsgi" (без начала /) в качестве префикса и увидел в журналах:
[Thu Feb 14 14:50:28 2013] [alert] (2)No such file or directory: mod_wsgi (pid=18702): Couldn't bind unix domain socket '/etc/httpd/var/run/wsgi.18702.0.1.sock'.
Надеюсь, это исправлено в последней версии, но, по крайней мере, мы можем придерживаться нашего распространенного пакета ОС.
Вы используете ITK MPM для Apache. Вам нужно будет использовать mod_wsgi 3.3 или новее, который содержит исправление:
При компиляции с ITK MPM для Apache при использовании режима демона сокет слушателя для процесса демона будет помечен как принадлежащий тому же пользователю, который запускает процесс демона. Это, по крайней мере, позволит направить запрос, обрабатываемый в ITK MPM, процессу-демону, принадлежащему тому же пользователю, что и сценарий. Смотрите выпуск:
Однако вы не можете просто использовать двоичный файл, поставляемый операционной системой, поскольку те, которые доступны, вероятно, будут только для рабочего и prefork MPM. Для ITK MPM вам нужно будет скомпилировать mod_wsgi из исходного кода, и у вас ДОЛЖНЫ быть установлены соответствующие файлы заголовков для ITK MPM, а не файлы для worker или prefork MPM. Это потому, что исходный код mod_wsgi имеет:
if (!geteuid()) {
#if defined(MPM_ITK)
if (chown(process->socket, process->uid, -1) < 0) {
#else
if (chown(process->socket, ap_unixd_config.user_id, -1) < 0) {
#endif
ap_log_error(APLOG_MARK, APLOG_ALERT, errno, wsgi_server,
"mod_wsgi (pid=%d): Couldn't change owner of unix "
"domain socket '%s'.", getpid(),
process->socket);
return -1;
}
}
IOW, это выбор времени компиляции в отношении того, как настроить разрешения, при этом он правильно устанавливается только для ITK MPM, если заголовки ITK MPM установлены правильно и поэтому обнаружен MPM_ITK #define.
Таким образом, вам нужно будет сделать следующее:
(1) Убедитесь, что файлы заголовков ITK MPM установлены. Если вы используете бинарный пакет для Apache, посмотрите, есть ли вариант ITK пакета Apache dev.
(2) Скомпилируйте и установите mod_wsgi из исходного кода, доступного в общедоступном загружаемом исходном пакете mod_wsgi 3.3.
Пакет с исходным кодом mod_wsgi и инструкции по установке доступны по адресу:
Попробуй это:
<VirtualHost *:80>
...
WSGIDaemonProcess myapp threads=5
WSGIScriptAlias / /var/www/myapp/myapp.wsgi/
<Directory /var/www/myapp/>
WSGIProcessGroup myapp
WSGIApplicationGroup %{GLOBAL}
WSGIScriptReloading On
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
Итак, вы пытаетесь добавить символ '/' в конец пути и каталогов wsgi.