2014-12-12 7 views
8

Ich versuche, meine Flask-Anwendung auf CentOS-Server arbeiten zu lassen. Im Grunde ist das Problem, dass ich Python 2.6 in /usr/bin installiert habe, was Systemstandard und Python 3.4 in /usr/local/bin installiert ist. Ich möchte Python 3.4 virtualenv oder zumindest Python 3.4 interpreter für mod_wsgi verwenden, um meine Anwendung zu starten.Führen Sie mod_wsgi mit virtualenv oder Python mit Version anders als das System standardmäßig

Ich habe virtualenv in ~/virtualenvs/flask erstellt.

Ich habe dieses WSGI Skript:

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 

Und folgende Konfiguration in 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> 

jedoch bei dem Versuch, die Anwendung auszuführen, erhalte ich eine Fehlermeldung:

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 

Ich habe festgestellt, dass entweder Python 2.6 läuft und mein virtualenv nicht aktiviert ist. Was wäre der richtige Weg, um dies zum Laufen zu bringen und trotzdem Python 2.6 als Systemstandard zu haben?

Antwort

5

Sie müssen die folgende Zeile in Ihrer apache.conf hinzufügen, um die richtige ausführbare Datei und den Pfad zum virtualenv zu geben.

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

Sie alle Möglichkeiten dieser beiden Befehl finden in the mod_wsgi documentation

Beachten Sie, dass Sie die Version von mod_wsgi mit dem Python-Executable kompatibel haben muss. In Ihrem Fall müssen Sie wahrscheinlich mod_wsgi3.4 installieren und Apache konfigurieren, um es anstelle des Standardmoduls mod_wsgi zu verwenden.

Die ganze sollte Konfigurationsdatei sein:

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

Ich denke, das ist der richtige Weg. Aber ich konnte es in meiner Umgebung nicht schaffen. Zu viele Dinge kaputt und unordentlich, also gab ich auf und versuchte es anders. – Fenikso

+0

Aber sollten 'WSGIPythonHome' und' WSGIPythonPath' nicht außerhalb von '' liegen? – Fenikso

+2

Sie haben recht, diese Optionen müssen außerhalb des '' Blocks liegen. Mein Fehler.Wenn Sie für jedes '' ein anderes virtualenv verwenden müssen, können Sie die Anweisungen 'WSGIDaemonProcess' und' WSGIProcessGroup' verwenden, indem Sie die Option 'python-path' setzen. – afrancais

2

Schauen Sie in die WSGIPythonHome and WSGIPythonPath Richtlinien. Es ist auch möglich, dass Sie eine python2.6 mod_wsgi installiert haben, mod_wsgi muss für die beabsichtigte Python-Version und does not support multiple python versions kompiliert werden. Überprüfe also, ob dein mod_wsgi kompatibel zu py3.4 ist und setze die Anweisungen oben.

Alternativ können Sie die Kolben-App mit einem Python-Server wie Gunicorn und Proxy-Pass von Apache zu Gunicorn ausführen.

+0

Danke für die Anregung. Ich habe versucht, in WSGIPythonHome und WSGIPythonPath zu suchen, aber ich habe keine Ahnung, wie man sie richtig verwendet, da ich keine Beispiele gefunden habe. Wie überprüfe ich auch mod_wsgi "type"? Ich habe gerade 'yum installiert mod_wsgi'. – Fenikso

+0

@Fenikso, @afrancais hat ein vollständigeres Beispiel für die Verwendung der Direktiven, siehe seine Antwort. Sie können überprüfen, auf welchen Python mod_wsgi kompiliert wird, indem Sie ldd in der lib ausführen, wahrscheinlich 'ldd/usr/{lib, lib64}/httpd/modules/mod_wsgi.so' – kalhartt

+0

Danke für die wertvollen Informationen über' ldd' und den Vorschlag von Gunicorn. Am Ende ging ich mit uWSGI + Nginx. Hilfreich war, dass uWSGI mit pip installiert werden kann, damit ich es direkt für die benötigte Python-Version installieren kann. – Fenikso