WSGI Python mit Phusion Passenger auf Webhosting 8000

  • Moin Moin :)


    Ich möchte letztendlich Python auf meinem Webhosting benutzen. Und zb Flask benutzen (also WSGI Webframeworks).


    Nun versuche ich dieses Tutorial [0] durchzuführen:

    [0] https://www.phusionpassenger.c…hroughs/start/python.html


    Und bin gescheitert...


    pasted-from-clipboard.png

    (ich habe erfolglos versucht die Error ID zu finden)



    Ich bin dem oben genannten Tutorial [0] gefolgt.


    Ich habe eine Subdomain angelegt: passenger.geheime-domain.de


    Ich habe wie im Tutorial [0] per ssh die Befehle ausgeführt:

    git clone https://github.com/phusion/passenger-python-flask-demo.git

    cd passenger-python-flask-demo Dieses Verzeichnis als Root der Subdomain festgelegt. (/ordnerstruktur/passenger-python-flask-demo)


    Bei der Subdomain unter dem Punkt "Python"  /ordnerstruktur/passenger-python-flask-demo als App Root angegeben.


    gemäß des Tutorials [0] /ordnerstruktur/passenger-python-flask-demo/passenger_wsgi.py erstellt und mit folgendem Inhalt versehen:

    # passenger_wsgi.py

    from app import MyApp as application


    Dann bei der Subdomain unter dem Punkt "Python" die "Anwendung einschalten" gedrückt:

    Log:

    Information: Die Einstellungen wurden gespeichert.

    Warnung: Aus Sicherheitsgründen sollte das App Root außerhalb des Documentroot liegen


    Und danach passenger.geheime-domain.de geöffnet und die oben genannte Fehlermeldung bekommen...


    Was habe ich falsch gemacht?


    Ich würde mich sehr über Hilfe freuen!


    Lg

  • Eines meiner Problem könnte sein, das Flask nicht installiert ist aber: pip install Flask funktioniert per shh nicht... Es ist genauso wie Python nicht verfügbar.


    Also wie kann ich Flask trotzdem installieren und benutzen?

  • Mir geht es auch so. Die vorherige Python-Unterstützung war schon sehr dürftig.Passenger scheint jetzt mal ein vernünftiger und gängiger Ansatz zu sein. Kann jemand von Netcup vielleicht eine ganz einfache Python App mit Flask, Django oder was auch immer als Beispiel aufzeigen?

  • Ok, war doch ganz anders als gedacht. Nach etwas Googeln fand ich https://qflw.de/netcup-flask/


    Darin wird erklärt, dass Flask selbst und alle Python-Abhängigkeiten davon erst noch auf den Webhosting Account übertragen werden müssen. Also wird per Virtualenv Flask isoliert installiert und dann aus dem site-packages-Ordner alle Abhängigkeiten herausgegriffen und zusammen mit der Passenger Beispiel-App (https://github.com/phusion/passenger-python-flask-demo) auf den Webspace geladen. Ich meine das geht mit einem pip-Parameter auch einfacher (kriege ich gerade nicht zusammen).


    Wichtig: der Port scheint in Flask bei mir nicht ausgewertet zu werden. Ich hatte es so gemacht in der app.py:


    Code
    if __name__ == '__main__':
          app.run(host='0.0.0.0', port=8080)

    ...und gehofft, es auf einer vorhandenen Domain auf Port 8080 laufen zu lassen. Aber danach war mein Wordpress erst mal weg und die Flask-Beispiel-App erschien auf Port 80. Du hattest es also schon richtig gemacht, die App auf einer separaten Domain zu betreiben.


    Ich verstehe nur nicht, warum Netcup die Abhängigkeiten nicht einfach in einem der lib-Verzeichnisse bereitstellt. Dann würde es doch von vornherein schon funktionieren ?!


    Ich vermute mal mit den Abhängigkeiten von Django sollte das genauso funktionieren. Allerdings sind das schon ganz schön viele, weshalb ich das gar nicht erst probieren werde. Aber ganz einfache Flask-Apps lassen sich so schon mal gut betreiben.


    Gruß,

    Mustafa


  • So habe ich Django mit Phusion Passenger auf Webhosting 8000 zum laufen gebracht .

    Zuerst ein Ordner für das Projekt auf die Entwicklungsmachine anlegen.


    $  mkdir webapp


    $  cd webapp


    Dann ein Virtualenv erzeugen und die nötige Python-Abhängigkeiten mit pip installieren.


    $  python3 -m virtualenv venv


    $  source venv/bin/activate


    Für diese Demo, wird als Beispiel denn Django installiert


    (venv)$  pip install Django


    Nun kann das Django-Projekt gestartet werden


    (venv)$  django-admin startproject helloworld


    Die Passenger Datei wird mit folgeden Python-Anweisungen im Ordner httpdocs/webapp angelegt:


    Python
    import sys, os
    ApplicationDirectory = 'helloworld'
    ApplicationName = 'helloworld'
    os.chdir(os.path.join(os.getcwd(), ApplicationDirectory))
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', ApplicationName + '.settings')
    from django.core.wsgi import get_wsgi_application
    application = get_wsgi_application()


    Auf die Entwicklungsmachine, haben wir nun die folgende Struktur


    webapp

    ├── venv

    ├── helloworld

    └── passenger_wsgi.py


    Nun wird per FTP der Ordner webapp/ aus Entwicklungsumgebung zu httpdocs/ auf dem Webserver kopiert.


    Auf dem Webserver, haben wir nun die folgende Struktur


    httpdocs

    └── webapp

    ├── venv

    ├── helloworld

    └── passenger_wsgi.py


    Die Python-Abhängigkeiten sind an diese Stellen noch nicht auf dem Serververfügbar, da die mit der Passenger-Datei im gleichen Ordner untergebracht werden mussen.


    Mit dem folgenden symbolischen Verweis wird alle installierten Abhängigkeiten im Ordner webapp/ verfügbar. Dafür, sich per ssh auf Server einlogen und im bash folgende command ausführen:


    § ln -sr httpdocs/webapp/venv/lib/python3.5/site-packages/* httpdocs/webapp && rm httpdocs/webapp/*.dist-info


    Nun können im WCP die Python-Eingenschaften angepasst werden und Python aktivieren.


    In diesen Beispiel, haben wir httpdocs/webapp als ApllicationRoot.


    Das DocumentRoot wird ebenfalls im Hosting-Einstellungen angepasst und zeigt hier auf httpdocs/webapp/helloworld.


    --


    Grüße

  • Super gemacht Zang! Jetzt haben wir die beiden wichtigsten Python Web Frameworks Flask und Django am Laufen.


    Aber für die Erzeugung des DB-Schema auf einem DB-Server braucht man noch das manage.py Script von Django. Da sehe ich mangels Python Interpreter im Moment schwarz. Mit SQLite könnte man das Schema noch auf dem Entwicklungsrechner erzeugen (mit manage.py makemigration und danach manage.py migrate) und die SQLite-Datei anschließend mit hochladen. Für kleinere Projekte könnte das gut und gerne reichen.


    Als Workaround für einen DB-Server könnte ich mir sowas vorstellen:

    Code
    python manage.py sqlmigrate polls 0001

    Das spuckt dann die SQL Statements aus, womit man das Schema auf dem DB-Server manuell erzeugen könnte. Also z.B.:

    Code
    -- Create model Question
    --
    CREATE TABLE "polls_question" (    "id" serial NOT NULL PRIMARY KEY,    "question_text" varchar(200) NOT NULL,    "pub_date" timestamp with time zone NOT NULL
    );
    ...
    
    COMMIT;

    Aber das ist alles echt umständlich. Nur wenn man ein fertiges Projekt in Betrieb nehmen möchte und dann keine weiteren Änderungen mehr plant, macht das vielleicht Sinn. Mangels Python Interpreter, Pip etc. wird man aber wohl sowieso bei einem VPS landen.


    Gruß

    Mustafa

  • Aber für die Erzeugung des DB-Schema auf einem DB-Server braucht man noch das manage.py Script von Django

    Wird denn bei Django ein State im lokalen Dateisystem gespeichert?

    Die Datenbankserver des Webhostings sind doch auch von extern erreichbar - hier kannst du das manage.py Script doch von deinem lokalen Rechner aus starten und nur die Dateiänderungen ins Webhosting laden. Die DB Änderungen machst du dann auf deinem lokalen Rechner.

  • Danke H6G. Wieder was dazu gelernt. Ich persönlich lasse eigentlich nur Zugriffe von localhost auf die DB-Server zu. Die DNS-Einträge der DBs hatte ich zwar gesehen, aber mir noch keine weiteren Gedanken gemacht. Das ist tatsächlich ein sehr guter Ansatz, den ich mal ausprobieren werde. Mein Webhosting 4000 garantiert mir ja 6GB RAM, womit auch mal ein größeres Projekt realisierbar wird.

  • Bachsau Klar würde das funktionieren. Dann musst Du aber auch alle benötigten Libs integrieren, die existieren im Chroot garantiert nicht. Das ist mMn eine Mammut-Aufgabe. Vor allem, wenn man es aktuell halten möchte. Da greift man wahrscheinlich lieber gleich zu einem VPS oder RS, bevor man so viel herumbastelt.

    "Wer nur noch Enten sieht, hat die Kontrolle über seine Server verloren." (Netzentenfund)

  • H6G: Ich habe den Ansatz von dir versucht. Es scheint ganz gut zu funktionieren. Vielen Dank nochmal dafür! Allerdings hat die Verbindung zur Datenbank per IP-Adresse nicht geklappt. Aber der Hostname des DB-Servers war dann wohl in Ordnung. Hier ein Beispiel für die settings.py:



    Sehr lobenswert ist, dass der mysqlclient auf dem Server in der Python-Umgebung wohl vorinstalliert ist. Das ist nämlich immer ein ziemlicher Krampf, den zu Django passenden Client mit der geforderten Python-Version zu finden und zu installieren. Mit pip geht das ja regelmäßig schief. Auf dem Entwicklungsrechner musste ich da dann erst mal durch. Umso überraschter war ich, dass ich nach dem Erzeugen des Schemas und Hochladen der Dateien nichts mehr weiter unternehmen musste und es auf Anhieb lief.


    Ich werde die settings.py noch mit einer kleinen Logik versehen, die je nach dem, auf welcher Umgebung es sich befindet, entweder SQLite (Entwicklungsumgebung) oder MySQL (auf dem Netcup-Server) verwendet.


    Damit bin ich dann erst mal zufrieden. Allerdings wäre es schon gut zu wissen, welche Python-Module noch so vorinstalliert sind. Ins Lib/site-packages-Verzeichnis kann ich ja nicht reinschauen.


    Noch etwas: ich habe als Entwicklungsrechner Windows verwendet. Da der mysqlclient ja bereits vorinstalliert ist, bleibt alles andere Plattform-unabhängig und läuft damit auf beiden Systemen.


    Gruß,

    Mustafa

  • Manchmal kommt die Ernüchterung etwas zeitversetzt. Offensichtlich war die alte DB-Session noch im Cache:


    Code
    django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
    Did you install mysqlclient?

    Wie es aussieht, ist der mysqlclient doch nicht vorinstalliert. Wär ja auch zu schön gewesen...

  • Allerdings wäre es schon gut zu wissen, welche Python-Module noch so vorinstalliert sind. Ins Lib/site-packages-Verzeichnis kann ich ja nicht reinschauen.

    Auch nicht mit PHP/Perl/usw. über den Webserver? ;)

    "Wer nur noch Enten sieht, hat die Kontrolle über seine Server verloren." (Netzentenfund)

  • SQLite unterscheidet sich aber schon recht deutlich von MySQL. Ich würde mich nicht darauf verlassen, dass man einen SQLite-Dump einfach so auf einen MySQL-Server laden kann, und das Schema dann auch so aussieht, wie es aussehen sollte.


    mustafa Versuch' mal `help("modules")`

  • Django unterstützt verschiedene DB-Backends (ich meine sogar zeitgleich mit mehreren DBs) und erzeugt das Schema entsprechend. Ich kann sehr wohl lokal mit SQLite testen und die selbe Anwendung im Web gegen MySQL laufen lassen. Dabei werden keine Dumps erzeugt. Auch Demodaten lassen sich als sog. Fixture DB-unabhängig in diesem Prozess einspielen. Leider scheitert mein Vorhaben gerade daran, an den mysqlclient oder einer Alternative als Python 3.5 Bibliothek zu kommen. Python 3.5, welches auf dem Server im Hintergrund läuft, ist auf den aktuellen Linux-Betriebssystemen nicht vorhanden und beim Kompillieren fehlen mir immer einige Abhängigkeiten, was mich gerade etwas an diesem Vorhaben zweifeln lässt.


    Aber danke für das Kommando help("modules"), welches in der Python Shell genau das ausgibt, was ich brauche. Aber auf dem Netcup Server ist ja leider kein Python Interpreter installiert. Ich müsste mir also eine kleine Flask oder Django-App bauen, die mir die Ausgabe des Kommandos erzeugt. Das wird mir aber gerade zu viel.


    Ich persönlich schließe für mich das Thema ab und sage, dass Python im Webhosting bei Netcup nur eingeschränkt (vielleicht mit SQLite als DB-Backend) nutzbar ist. Ohne Python Interpreter und PIP wird man dazu genötigt, Brücken zu bauen, die man eigentlich gar nicht betreten möchte...

  • Der hat noch nicht geantwortet. Aber zwischenzeitlich kam doch noch etwas Motivation und ich habe es mit dem MySQL-Connector hinbekommen. Auf dem Entwicklungsrechner: pip install mysql-connector-python --allow-external mysql-connector-python und dann alle heruntergeladenen Bibliotheken mit hochladen.


    Der soll zwar nicht so performant sein wie der mysqlclient. Aber zumindest funktioniert es erstmal.

  • Ich habe eine kurze Frage, was Eure Erläuterungen betrifft.


    Ist es darüber denn auch möglich zusätzliche Python Packages zu nutzen (z.B: Numpy, SciKit etc...)?

    Also quasi alles erst einmal lokal entwickeln und dann auf den Server hochladen?

    Oder habe ich das falsch mitgelesen?

  • Moin zusammen,

    bin wohl ein wenig spät zu meiner eigenen Party xD

    Vielen Dank für die Tipps ;) (Habe jetzt erst verstanden, dass man die Packages in den Passenger App Root Ordner manuell hochladen muss... musste...)


    Ich habe ein paar Sachen herausgefunden die bestimmt nützlich sind:

    • Wie man easy peasy Python Version xx auch auf einem !Webhosting (Webhosting8000) installiert
    • ... Python in der Konsole nutzen kann
    • ... Venvs macht
    • ... Packages installiert
    • ... Passenger Python 3.9 (die selbst installierte Python Version) nutzen lässt
      • ... auch das Python einer Venv mit Packages

    Mit App Root meine ich den Ordner, der im CCP unter dem Punkt Python > App Root eingestellt wird.

    In diesem Ordner sucht Passenger u.a. nach der Startup Datei (z.B. passenger_wsgi.py)


    Das Tutorial basiert teils auf dem Vorwissen meines 1. Beitrags.


    Vorher aber noch kurz eine Kleinigkeit:

    • Wenn man in dem App Root in dem Ordner „tmp“ die Datei „always_restart.txt“ ohne Inhalt erstellt, lädt Passenger bei jedem Reload (F5) die App neu.
    • Um die App besser Debuggen zu können kann man im CCP unter Python Passenger auf „Entwicklung“ stellen. Nur bei einem Fehler werden dann detaillierte Fehlermeldungen angezeigt, aber auch der allgemeine Output der App. z.B. auch print(„Hallo ich werde angezeigt wenn es einen Fehler gibt“).


    Jetzt zum eigentlichen Spaß:


    1. Setup und Installation von Miniconda3, Python 3.9,und Erstellung von Virtuellen Umgebungen:
      (Das alles hat noch nicht was mit Passenger zu tun deswegen ist hier der App Root Ordner erstmal egal...)
      m Python für den shared Webhosting User zugänglich zu machen muss „miniconda“ heruntergeladen werden. https://docs.conda.io/en/latest/miniconda.html Der neuste Installer funzt irgendwie manchmal nicht, deswegen einfach eine alte Version von https://repo.anaconda.com/miniconda/ nehmen. Der Miniconda3-4.5.11-Linux-x86_64.sh Installer funktioniert definitiv.
    2. Wenn ihr die richtige Shell Datei auf dem Server heruntergeladen habt könnt ihr die mit bash Miniconda3-*.sh installieren. Dieses Tutorial bezieht sich auf minicona3 und den Standard Installationspfad ($HOME/minicona3).
    3. Dann wird je nach Installer (Miniconda2 -> Python2 oder Miniconda3 -> Python3) Python in der jeweiligen Aktualität des Installer installiert. Der Miniconda3-4.5.11-Linux-x86_64.sh Installer bring Python3.7 mit.
    4. Ihr müsst bestätigen, dass ihr miniconda3 in PATH tun möchtet.
      WICHTIG: miniconda3 erstellt die Datei ~/.bashrc und denkt die wird geladen … Pustekuchen bei Netcup müssen wir erst die Datei ~/.profile mit folgendem Inhalt erstellen:
      Bash: ./profile
      if [ -f ~/.bashrc ]; then
          . ~/.bashrc
      fi
    5. Dann einmal ein und aus und ein loggen und voila!
    6. Nun können wir mit conda update -n base -c defaults conda alles aktualisieren.
      Falls etwas danach nicht ganz klappt das packet mit conda update pip aktualisieren geht auch mit conda update python oder conda update conda
      Jetzt sollte das neueste Python installiert sein (Python3.9)
    7. Mit conda create --name testenv können wir eine Venv mit den globalen Python Binaries erstellen. Wenn man PythonX braucht einfach conda create -n pythonx_venv python=X oder nachträglich conda install python=X
      Die venvs sind unter ~/miniconda3/envs zu sehen, man kann sie mit conda env list alle anzeigen. Um sie zu aktivieren und Packages nach zu installieren: conda activate testvenv (Beim ersten Mal kommt noch so eine Konfigurationssache, Ja drücken und relogin). Mit conda deactivate kann man die venv verlassen.
    8. Packages können mit conda selbst bzw. pip selbst wie gewohnt installiert werden.
      Ich würde conda nehmen da macht man nichts falsch, wenn man verschiedenen Python Versionen installiert hat.
      conda install <package>


    Jetzt ist alles bereit! Was man mit Passenger tun mus:


    Also die app.py mit flask oder django etc. liegt in diesem Beispiel auch im App Root.

    Im App Root müssen wir diese Datei erstellen: passenger_wsgi.py und diese im CCP unter dem Punkt Python > Startup Datei festlegen.

    Je nachdem was ihr jetzt anders gemach habt müsst ihr den angehängten Code zur passenger_wsgi.py ändern.

    Außerdem müsst ihr den Code in der letzten Zeile Ändern: from app import MyApp as application

    Uuuuuuund Fertig!!!

    Einfach auf die Seite gehen voila ;)


    Puh das hat mich auch 3 Tage gedauert um das alles zusammen zu basteln xD

    Euch noch nen schönen Tag!


    Ich habe eine kurze Frage, was Eure Erläuterungen betrifft.


    Ist es darüber denn auch möglich zusätzliche Python Packages zu nutzen (z.B: Numpy, SciKit etc...)?

    Also quasi alles erst einmal lokal entwickeln und dann auf den Server hochladen?

    Oder habe ich das falsch mitgelesen?

    Jo genau

    Könnt ihr nicht einfach selbst einen Interpreter hochladen? Wenn man Zugriff auf eine Shell hat, sollte es doch ein Leichtes sein, für den Benutzer ein eigenes Python aufzusetzen.

    Tadaaaa


    Lg

  • Hallo zusammen,


    in den letzten 2 Tagen habe ich mich hier durch das Forum gewühlt und einige Trial-and-Error-Schleifen unternommen, bis ich endlich ein Flask-Projekt (mit Python 3) im Netcup Webhosting erfolgreich zum Fliegen bekommen habe.


    Vielleicht landen ja auch andere Hilfesuchende nach der Recherche an dieser Stelle. In diesem Fall habe ich meine Erfahrungen und eine Schritt-für-Schritt-Anleitung unter https://saschaszott.github.io/…up-python-webhosting.html abgelegt.


    Es gibt noch etwas Optimierungspotential, aber zumindest führt die Anleitung (Stand Februar 2021) zu einer funktionieren Lösung.


    netcup: könntet ihr bitte den veralteten Beitrag unter https://www.netcup-wiki.de/wiki/Python_Webprogrammierung als solchen kenntlich machen?


    Beste Grüße!