2014-12-12 8 views
8

Próbuję ustawić moją aplikację Flask na serwerze CentOS. Zasadniczo chodzi o to, że mam zainstalowany Python 2.6 w wersji /usr/bin, który jest domyślny dla systemu, a Python 3.4 zainstalowany w /usr/local/bin. Chciałbym użyć interpretera Python 3.4 virtualenv lub co najmniej Python 3.4 dla mod_wsgi do uruchomienia mojej aplikacji.Uruchom mod_wsgi z virtualenv lub Python z wersją inną niż domyślny system

Utworzono virtualenv w ~/virtualenvs/flask.

mam ten skrypt WSGI:

import os 
import sys 
from logging import Formatter, FileHandler 

APP_HOME = r"/home/fenikso/Album" 


activate_this = os.path.join("/home/fenikso/virtualenvs/flask/bin/activate_this.py") 
execfile(activate_this, dict(__file__=activate_this)) 

sys.path.insert(0, APP_HOME) 
os.chdir(APP_HOME) 

from app import app 

handler = FileHandler("app.log") 
handler.setFormatter(Formatter("[%(asctime)s | %(levelname)s] %(message)s")) 
app.logger.addHandler(handler) 
application = app 

I po config Apache:

<VirtualHost *:80> 
     ServerName album2.site.cz 
     Alias /static "/home/fenikso/Album/static" 
     Alias /photos "/home/fenikso/Album/photos" 
     Alias /thumbs "/home/fenikso/Album/thumbs" 
     WSGIScriptAlias/"/home/fenikso/Album/wsgi.py" 
     <Directory "/home/fenikso/Album"> 
      AllowOverride None 
      Allow from all 
     </Directory> 
     <Directory "/home/fenikso/Album/static"> 
      AllowOverride None 
      Allow from all 
     </Directory> 
     <Directory "/home/fenikso/Album/photos"> 
      AllowOverride None 
      Allow from all 
     </Directory> 
     <Directory "/home/fenikso/Album/thumbs"> 
      AllowOverride None 
      Allow from all 
     </Directory> 
</VirtualHost> 

Jednak gdy próbuje uruchomić aplikację, pojawia się błąd:

Apache/2.2.15 (Unix) DAV/2 mod_wsgi/3.2 Python/2.6.6 mod_fcgid/2.3.7 PHP/5.3.3 mod_ssl/2.2.15 OpenSSL/1.0.1e-fips SVN/1.6.11 mod_perl/2.0.4 Perl/v5.10.1 configured -- resuming normal operations 
mod_wsgi (pid=14627): Target WSGI script '/home/fenikso/Album/wsgi.py' cannot be loaded as Python module. 
mod_wsgi (pid=14627): Exception occurred processing WSGI script '/home/fenikso/Album/wsgi.py'. 
Traceback (most recent call last): 
    File "/home/fenikso/Album/wsgi.py", line 15, in <module> 
    from app import app 
    File "/home/fenikso/Album/app.py", line 1, in <module> 
    from flask import Flask 
ImportError: No module named flask 

Zauważyłem, że uruchamiany jest Python 2.6, a mój virtualenv nie jest aktywowany. Jaki byłby właściwy sposób, aby to działało i nadal ma Python 2.6 jako domyślny system?

Odpowiedz

5

Musisz dodać następujący wiersz do pliku apache.conf, aby podać odpowiedni plik wykonywalny i ścieżkę do virtualenv.

WSGIPythonHome /usr/local/bin 
WSGIPythonPath /home/fenikso/virtualenv/lib/python3.4/site-packages 

Znajdziesz tu wszystkie opcje te dwa polecenia in the mod_wsgi documentation

zdawać sobie sprawę, że trzeba mieć wersję mod_wsgi kompatybilnym z wykonywalnego Pythona. W twoim przypadku prawdopodobnie musisz zainstalować mod_wsgi3.4 i skonfigurować apache, aby używał go zamiast standardowego modułu mod_wsgi.

Cały plik konfiguracyjny powinien być:

WSGIPythonHome "/usr/local/bin" 
WSGIPythonPath "/home/fenikso/virtualenv/lib/python3.4/site-packages" 

<VirtualHost *:80> 
     ServerName album2.site.cz 
     Alias /static "/home/fenikso/Album/static" 
     Alias /photos "/home/fenikso/Album/photos" 
     Alias /thumbs "/home/fenikso/Album/thumbs" 
     WSGIScriptAlias/"/home/fenikso/Album/wsgi.py" 
     <Directory "/home/fenikso/Album"> 
      AllowOverride None 
      Allow from all 
     </Directory> 
     <Directory "/home/fenikso/Album/static"> 
      AllowOverride None 
      Allow from all 
     </Directory> 
     <Directory "/home/fenikso/Album/photos"> 
      AllowOverride None 
      Allow from all 
     </Directory> 
     <Directory "/home/fenikso/Album/thumbs"> 
      AllowOverride None 
      Allow from all 
     </Directory> 
</VirtualHost> 
+0

Myślę, że to jest właściwa droga. Jednak nie udało mi się sprawić, by działało w moim środowisku. Zbyt wiele rzeczy połamanych i brudnych, więc zrezygnowałem i spróbowałem w inny sposób. – Fenikso

+0

Jednak nie powinno się 'WSGIPythonHome' i' WSGIPythonPath' być na zewnątrz ''? – Fenikso

+2

Masz całkowitą rację, te opcje muszą znajdować się poza blokiem ''. Mój błąd.Jeśli musisz użyć innego virtualenv dla każdego '' możesz użyć dyrektyw 'WSGIDaemonProcess' i' WSGIProcessGroup', ustawiając opcję 'python-path'. – afrancais

2

Sprawdź w dyrektywach WSGIPythonHome and WSGIPythonPath. Możliwe jest również, że masz zainstalowane mod_wsgi python2.6, mod_wsgi musi być skompilowany dla zamierzonej wersji python i does not support multiple python versions. Sprawdź więc, czy twój mod_wsgi jest kompatybilny z py3.4 i ustaw powyższe dyrektywy.

Alternatywnie, można uruchomić aplikację kolby z serwerem python, takim jak gunicorn i proxypass z apache do gunicorn.

+0

Dzięki za sugestię. Próbowałem zajrzeć do WSGIPythonHome i WSGIPythonPath, ale nie mam pojęcia, jak z nich korzystać poprawnie, ponieważ nie znalazłem żadnych przykładów. Jak również sprawdzić "typ" mod_wsgi? Właśnie zrobiłem 'yum install mod_wsgi'. – Fenikso

+0

@Fenikso, @afrancais ma pełniejszy przykład użycia dyrektyw, zobacz jego odpowiedź. Możesz sprawdzić, który pyton mod_wsgi jest skompilowany, robiąc ldd w bibliotece lib, prawdopodobnie 'ldd/usr/{lib, lib64}/httpd/modules/mod_wsgi.so' – kalhartt

+0

Dzięki za cenne informacje o' ldd' i sugerowaniu Gunicorn. W końcu poszedłem z uWSGI + Nginx. Pomocne było to, że można zainstalować uWSGI za pomocą pip, więc mógłbym zainstalować go bezpośrednio dla wymaganej wersji Pythona. – Fenikso

Powiązane problemy