Bottle: Micro Web Framework
Ich präzisiere: Wie viel Speicherplatz verbrauchen die Dateien des Apache Webservers und welche Ressourcen beansprucht dieser?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
-
Dauerbaustelle
- User
- Beiträge: 996
- Registriert: Mittwoch 9. Januar 2008, 13:48
Also ich hab so im Kopf ~80 Megabytes Memory wenn er nur rumidled, ohne irgendwelches Tuning und so Kram.
- noisefloor
- User
- Beiträge: 4327
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
> Wie groß issen der Apache eigentlich?
Meinst du installiert oder was den Speicherverbrauch angeht?
Auf meinem virtuellen Server mit _wenig_ Traffic belegt der Apache bzw. dessen Kinderprozesse ca. 20-25% RAM (von 512 MB).
Gruß, noisefloor
> Wie groß issen der Apache eigentlich?
Meinst du installiert oder was den Speicherverbrauch angeht?
Auf meinem virtuellen Server mit _wenig_ Traffic belegt der Apache bzw. dessen Kinderprozesse ca. 20-25% RAM (von 512 MB).
Gruß, noisefloor
-
Leonidas
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Ansonsten gibt es auch andere Server wie nginx oder Cherokee, aber ich muss sagen dass es, zumindest für mich nicht lohnt sich mit deren Setup zu beschäftigen. Das ist mir inzwischen zu nervig geworden, aber wenn man das mal ausprobieren will...
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Ich hab jetzt die halbe Nacht mit lighttpd und fastcgi beschäftigt, aber nicht rausgefunden wie man bottle da anbindet.
Aber Bottle läuft doch bei mir an Port 80.
Und ohne Rootrechte geht Port 80 eben nicht.
Und der Port für Webserver ist eben Port 80.
Am Port 80 kommen Anfragen an und die werden vom Programm bearbeitet.
Was kann da schon schlimmes passieren ???
Aber Bottle läuft doch bei mir an Port 80.
Und ohne Rootrechte geht Port 80 eben nicht.
Und der Port für Webserver ist eben Port 80.
Am Port 80 kommen Anfragen an und die werden vom Programm bearbeitet.
Was kann da schon schlimmes passieren ???
-
BlackJack
@MrNiceTry: An Port 80 kann man sich ohne root-Rechte nicht binden, aber *danach* geben Webserver die root-Rechte ab und laufen als eigener Benutzer mit weniger Rechten.
Es kann potentiell *alles* passieren. Wenn es eine Sicherheitslücke gibt, kann jemand von aussen Code mit root-Rechten ausführen. Das will man nicht.
Es kann potentiell *alles* passieren. Wenn es eine Sicherheitslücke gibt, kann jemand von aussen Code mit root-Rechten ausführen. Das will man nicht.
-
Dauerbaustelle
- User
- Beiträge: 996
- Registriert: Mittwoch 9. Januar 2008, 13:48
Lass Bottle als FastCGI-Server auf irgend nem Port laufen und verwende z.B. nginx als Proxy.
- noisefloor
- User
- Beiträge: 4327
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
@MrNiceTry: Beschäftige dich mal mit dem Grundprinzip von CGI.
Das heißt vereinfacht gesagt nichts anderes als das der Webserver ein Skript ausführt. Mit den Rechten des Webservers. Und auf der IP und dem Port, auf dem der Webserver läuft. Den in Bottle integrierten Server brauchst du gar nicht.
Wenn da mit FastCGI zu schwierig ist, kannst du auch erstmal "normales" CGI nehmen. Dann brauchst du in lighttpd nur .py Dateien registrieren (ist in der Doku von lighthttpd erklärt) und den Bottle-Skript an CGI binden (ist in der Bottle Dokue erklärt).
Gruß, noisefloor
@MrNiceTry: Beschäftige dich mal mit dem Grundprinzip von CGI.
Wenn da mit FastCGI zu schwierig ist, kannst du auch erstmal "normales" CGI nehmen. Dann brauchst du in lighttpd nur .py Dateien registrieren (ist in der Doku von lighthttpd erklärt) und den Bottle-Skript an CGI binden (ist in der Bottle Dokue erklärt).
Gruß, noisefloor
Nein, das kann Bottle in der "offiziellen" Version nicht. Ich habe einen Patch dazu geschrieben, der genau das ermöglicht [1], weil ich die selben Anforderungen hatte. (Möglichst leicht, nicht besonders performant auf Port 80 laufend). Der Patch wurde nicht übernommen und mein Repository ist nicht gepflegt. Ich würde dir davon abraten einfach die dortige Bottle Version zu übernehmen. Du könntest aber den Patch auf die aktuelle Bottle Version portieren. Für mehr Infos gibt es einen Thread [2] dazu.MrNiceTry hat geschrieben:Kann Bottle seine Rechte abgeben?
Oder kann man das mit Bottle machen?
Irgend etwas muß es doch geben Bottle zu benutzen, oder ?
Wenn man möglichst leichtgewichtig und performant sein will, kann man statt dem WSGIRefServer den Tornado Adapter benutzen, dann ist die ganze Geschichte auch multithreaded. Damit funktioniert mein Patch aber (noch) nicht.
Alternativ kann ich dir cherokee empfehlen, den kann man ohne Einarbeitungszeit innerhalb weniger Minuten über ein Webfrontend konfigurieren und ist sehr leichtgewichtig, aber trotzdem vielseitig (uwsgi und fastCGI fähig). Das Webfrontend startet man nur zum Zweck der Konfiguration und wird anschließend beendet. Es gibt dort Assistenten für die gängigsten Aufgaben. Alles ziemlich selbsterklärend, aber halt doch wieder ein eigener Server vor dem Python-Prozess, wie bei nginx, Apache, lighttpd.
Ansonsten, wenn es ohne den Patch auskommen soll und ohne vorgeschalteten "ausgewachsenen" Webserver, habe ich sehr gute Erfahrungen mit Pound gemacht. Der macht nichts anderes als auf Port 80 zu laufen, die Anfragen entgegenzunehmen und lokal an Port 8080 (oder einen beliebigen anderen unpriviligierten Port) weiter zu reichen. Nennt sich dann http-proxy / load balancer. Da hast du dann zusätzlich zum Bottle Python Prozess noch <1 MiB im Speicher. Wenn du dann noch Bottle mit Tornado nutzt, hast du eine superschnelle und leichtgewichtige Kombi. Pound gibts im Ubuntu Repo und Tornado sind nur ein paar .py Dateien, die du in das Verzeichnis mit der bottly.py wirfst.
[1] http://github.com/uKev/bottle/commit/5c ... b3156db759
[2] http://www.python-forum.de/viewtopic.php?t=21221
-
Leonidas
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Das Problem ist, dass im Gegensatz zu Apaches mod_fastcgi/mod_fcgid sich Cherokee nicht um die FastCGI-Prozessverwaltung kümmert. Somit muss man immer selbst drauf achten dass der Prozess immer läuft. Bei Apache wird der FastCGI-Prozess mitverwaltet, so dass man dieses Problem nicht hat und Apache sich darum kümmert ihn zu starten bevor ein Request fehlschlägt.uKev hat geschrieben:Alternativ kann ich dir cherokee empfehlen, den kann man ohne Einarbeitungszeit innerhalb weniger Minuten über ein Webfrontend konfigurieren und ist sehr leichtgewichtig, aber trotzdem vielseitig (uwsgi und fastCGI fähig). Das Webfrontend startet man nur zum Zweck der Konfiguration und wird anschließend beendet. Es gibt dort Assistenten für die gängigsten Aufgaben. Alles ziemlich selbsterklärend, aber halt doch wieder ein eigener Server vor dem Python-Prozess, wie bei nginx, Apache, lighttpd.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Äh, nicht ganz, das ist nur die halbe Wahrheit. Cherokee kennt zwei Modi: Entfernter Host und lokaler Interpreter. Der erste Modi entspricht deiner Beschreibung, ist aber eigentlich für entfernte Server gedacht. Wenn man lokaler Interpreter auswählt, gibt man den Befehl an, der ausgeführt werden soll, wenn der Prozess nicht läuft. Cherokee kümmert sich also um alles selbstständig. Läuft bei mir schon ne ganze weile sehr zuverlässig mit FastCGI.Leonidas hat geschrieben: Das Problem ist, dass [...] sich Cherokee nicht um die FastCGI-Prozessverwaltung kümmert. Somit muss man immer selbst drauf achten dass der Prozess immer läuft. [...]
Ich zitiere mal aus der Doku[1]:
Das gilt so ziemlich für alle Arten von Interpreter Anbindung, egal ob fastCGI, uwsgi, scgi... in der Doku[1] findest du sogar Screenshots, die die Konfiguration am Beispiel von scgi und Django zeigen.Interpreter: command to spawn a new source in case it were not accessible[...]
Note that you will have to manually launch the spawner if you use a Remote host as Information source instead of a Local interpreter.
[1] http://www.cherokee-project.com/doc/coo ... jango.html
Hallo,
nach einigen Überlegungen bezüglich der Ansteuerung von Bottle (auch hier im Forum - Danke) habe ich mich jetzt für die klassische Variante mit Apache und WSGI entschieden.
Aber auch das bringt mir im Moment Probleme.
Ubuntu 10.4 Server
Apache
mod-wsgi
In: /var/www/todo
todo.py
bottle.py
adapter.wsgi - alles nach Bottle-Anleitung. (so glaube ich)
Folgender Fehler:
adapter.wsgi (nach Anleitung)
bottle.py ist im gleichen Verzeichnis: /var/www/todo/bottle.py
Danke für jede Unterstützung.
MrNiceTry
nach einigen Überlegungen bezüglich der Ansteuerung von Bottle (auch hier im Forum - Danke) habe ich mich jetzt für die klassische Variante mit Apache und WSGI entschieden.
Aber auch das bringt mir im Moment Probleme.
Ubuntu 10.4 Server
Apache
mod-wsgi
In: /var/www/todo
todo.py
bottle.py
adapter.wsgi - alles nach Bottle-Anleitung. (so glaube ich)
Folgender Fehler:
Code: Alles auswählen
[Fri Oct 08 21:32:32 2010] [notice] Apache/2.2.14 (Ubuntu) mod_wsgi/2.8 Python/2.6.5 configured -- resuming normal operations
[Fri Oct 08 21:32:47 2010] [error] [client xx.xxx.116.91] mod_wsgi (pid=12237): Target WSGI script '/var/www/todo/adapter.wsgi' cannot be loaded as Python module.
[Fri Oct 08 21:32:47 2010] [error] [client xxx.xxx.116.91] mod_wsgi (pid=12237): Exception occurred processing WSGI script '/var/www/todo/adapter.wsgi'.
[Fri Oct 08 21:32:47 2010] [error] [client xxx.xxx.116.91] Traceback (most recent call last):
[Fri Oct 08 21:32:47 2010] [error] [client xxx.xxx.116.91] File "/var/www/todo/adapter.wsgi", line 1, in <module>
[Fri Oct 08 21:32:47 2010] [error] [client xxx.xxx.116.91] import sys, os, bottle
[Fri Oct 08 21:32:47 2010] [error] [client xxx.xxx.116.91] ImportError: No module named bottle
Code: Alles auswählen
import sys, os, bottle
sys.path = ['/var/www/todo/'] + sys.path
os.chdir(os.path.dirname(__file__))
import todo # This loads your application
application = bottle.default_app()
bottle.py ist im gleichen Verzeichnis: /var/www/todo/bottle.py
Danke für jede Unterstützung.
MrNiceTry
Du solltest natürlich erst in das richtige Verzeichnis wechseln und dann importieren.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Na schau dir mal deinen Code an. Du wechselt ja mit os.chdir in dein Verzeichnis. Nur vorher versuchst du bottle zu importieren - und das kann er einfach nicht finden. Importierst du bottle nach dem os.chdir, sollte es eigentlich klappen.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Danke.
Habe wie folgt geändert:
Funktioniert.
Sieht zumindest so aus. Bin morgen sicher.
Danke nochmal und gute Nacht.
MrNiceTry
Habe wie folgt geändert:
Code: Alles auswählen
import sys, os
sys.path = ['/var/www/todo/'] + sys.path
os.chdir(os.path.dirname(__file__))
import bottle
import todo # This loads your application
application = bottle.default_app()
Funktioniert.
Sieht zumindest so aus. Bin morgen sicher.
Danke nochmal und gute Nacht.
MrNiceTry
