Streamlit-Anwendungen auf Port 80 ausführen
Published on
Streamlit ist ein leistungsstarkes Werkzeug, das Entwicklern ermöglicht, interaktive Webanwendungen mit minimalem Aufwand zu erstellen. Es ist jedoch nicht ohne Herausforderungen, insbesondere im Hinblick auf die Konfiguration. Ein häufig auftretendes Problem besteht darin, Anwendungen auf Port 80 auszuführen. In diesem umfassenden Leitfaden gehen wir auf das Thema ein und greifen dabei auf Erfahrungen von Benutzern, Expertenmeinungen und praktische Beispiele zurück, um Ihnen bei der Bewältigung dieser Herausforderung mit Zuversicht zur Seite zu stehen.
Möchten Sie eine kostenlose Datenanalyse- und Datenvisualisierungs-App mit Streamlit erstellen?
PyGWalker (opens in a new tab) ist eine Python-Bibliothek, mit der Sie ganz einfach eine benutzerfreundliche Benutzeroberfläche ähnlich wie Tableau in Ihre eigene Streamlit-App integrieren können. Schauen Sie sich dieses erstaunliche Video von Sven von Coding is Fun (opens in a new tab) an, in dem die detaillierten Schritte zur Stärkung Ihrer Streamlit-App mit dieser leistungsstarken Python-Bibliothek für Datenvisualisierung gezeigt werden!
Ein besonderer Dank geht an Sven und seine großartigen Beiträge (opens in a new tab) zur PyGWalker-Community!
Darüber hinaus können Sie auch die PyGWalker GitHub-Seite (opens in a new tab) für weitere PyGWalker-Beispiele besuchen.
Teil 1: Die Herausforderung der Konfiguration von Streamlit für die Ausführung auf Port 80
Im Mai 2022 hatte ein Benutzer in der Streamlit-Community namens Nom_ji Schwierigkeiten beim Versuch, eine Anwendung auf Port 80 auszuführen. Obwohl er den entsprechenden Konfigurationsschritten folgte, wie sie in der offiziellen Streamlit-Dokumentation dargelegt sind, erhielt Nom_ji beim Bereitstellen der App auf Port 80 einen PermissionError: [Errno 13]
.
Interessanterweise lief die Anwendung einwandfrei auf den Ports 8051 und 8080. Dies führt uns zum ersten wichtigen Punkt:
- Nicht alle Ports sind gleich. Ports unter 1024, einschließlich Port 80, gelten in Unix-ähnlichen Betriebssystemen als privilegiert und erfordern normalerweise Superuser- (oder Root-) Zugriff.
Als Reaktion auf Nom_jis Problem schlug Randyzwitch, der ehemalige Leiter der Entwicklerbeziehungen bei Streamlit, vor, sicherzustellen, dass Port 80 nicht von einer anderen Instanz belegt ist. Überprüfen Sie vorhandene Instanzen auf einem Port mit dem Befehl netstat
in der Terminal:
sudo netstat -tuln | grep :80
Dieser Befehl listet alle derzeit auf Port 80 laufenden Dienste auf. Wenn der Befehl eine Ausgabe zurückgibt, bedeutet dies, dass Port 80 bereits verwendet wird und Sie den anderen Dienst stoppen müssen, bevor Sie Ihre Streamlit-Anwendung auf diesem Port ausführen können.
Teil 2: Tiefere Einblicke in die Portzuweisung in Streamlit
Ein weiteres Problem, auf das Streamlit-Benutzer stoßen können, besteht darin, mehrere Streamlit-Anwendungen gleichzeitig auszuführen, von denen jede ihren eigenen Port benötigt. BeyondMyself, ein Moderator der Streamlit-Community, lieferte eine einfache Lösung dafür: Geben Sie den Parameter --server.port
an, wenn Sie die Anwendung starten.
Beispielsweise führt der Befehl streamlit run myapp.py --server.port 8080
die in myapp.py
definierte Streamlit-App auf Port 8080 aus. Sie können anstelle von 8080 eine beliebige verfügbare Portnummer verwenden, sofern sie noch nicht verwendet wird.
Wenn Sie also planen, mehrere Streamlit-Anwendungen auszuführen, stellen Sie sicher, dass Sie:
- Jeder Anwendung eine eindeutige Portnummer zuweisen.
- Stellen Sie sicher, dass der gewählte Port nicht bereits von einem anderen Dienst verwendet wird.
Teil 3: Streamlit-Anwendungen auf Standardports erscheinen lassen
Obwohl Sie Ihre Streamlit-Anwendungen auf jedem verfügbaren Port ausführen können, gibt es möglicherweise Szenarien, in denen Sie möchten, dass die App bei Zugriff über eine Domain auf einem Standardport (wie 80) erscheint. Hier kommt das Konzept eines Reverse-Proxys ins Spiel.
Ein Reverse-Proxy kann Anfragen von einem Webserver wie Apache oder Nginx an den Port weiterleiten, auf dem Ihre Streamlit-Anwendung läuft. Dies kann auf verschiedene Arten eingerichtet werden:
- Leiten Sie alle Anfragen an Ihre Domain an Ihre Streamlit-Anwendung weiter.
- Konfigurieren Sie Ihren Webserver so, dass Anfragen an bestimmte Unterverzeichnisse zu unterschiedlichen Streamlit-Anwendungen weitergeleitet werden.
Zum Beispiel könnten Sie, wenn Sie mehrere Streamlit-Anwendungen auf verschiedenen Ports ausführen,
mydomain.com/app1
an die auf Port 8000 laufende Streamlit-Anwendung und mydomain.com/app2
an die Anwendung auf Port 8080 weiterleiten. Diese Einrichtung suggeriert aus der Perspektive des Benutzers, dass die Apps auf Port 80 ausgeführt werden.
Teil 4: Festlegung einer festen Portnummer für Streamlit-Anwendungen
Schließlich möchten Sie möglicherweise die Portnummer für Ihre Streamlit-Anwendungen festlegen, um einen stabilen Link für Ihre Teammitglieder oder Benutzer freizugeben. Hier kommt die Datei ./streamlit/config.toml
ins Spiel.
In der Datei config.toml
können Sie die feste Portnummer angeben. Zum Beispiel:
[server]
port = 8501
Diese Konfiguration teilt Streamlit mit, dass bei der Ausführung Ihrer App immer Port 8501 verwendet werden soll. Beachten Sie, dass dieser Port nicht von einem anderen Dienst verwendet werden darf, sonst schlägt die App fehl.
Zusammenfassend sollten Sie:
- Stellen Sie sicher, dass Sie Superuser-Zugriff für privilegierte Ports haben.
- Überprüfen Sie vorhandene Instanzen auf einem Port mit
netstat
. - Verwenden Sie den Parameter
--server.port
für die Ausführung mehrerer Apps. - Verwenden Sie Reverse-Proxys, um Apps auf Port 80 auszuführen.
- Verwenden Sie die Datei
config.toml
, um die Portnummer festzulegen.
Teil 5: Umgang mit häufigen Fehlern
Trotz Befolgen der beschriebenen Schritte können immer noch Fehler auftreten, wie beispielsweise der Fehler "Port ist reserviert". Dieser Fehler tritt normalerweise auf, wenn ein anderer Prozess nicht ordnungsgemäß beendet wurde oder etwas anderes auf dem Port läuft, den Sie verwenden möchten.
Um zu überprüfen, ob ein Port belegt ist, können Sie den netstat
-Befehl verwenden. Hier ist ein einfacher Code-Schnipsel, mit dem Sie überprüfen können, ob ein bestimmter Port (in diesem Fall Port 80) verwendet wird:
netstat -tuln | grep :80
In der Ausgabe, wenn Sie die gewünschte Portnummer sehen, bedeutet dies, dass der Port belegt ist. In Linux-Systemen können Sie auch den lsof
-Befehl verwenden, um herauszufinden, welcher Prozess einen bestimmten Port verwendet:
sudo lsof -i :80
Sobald Sie den Prozess identifiziert haben, können Sie ihn mit dem kill
-Befehl beenden.
kill -9 PID
Ersetzen Sie PID
durch die Prozess-ID, die Sie aus dem vorherigen Befehl erhalten haben.
Wenn Sie sicher sind, dass nichts anderes den Port verwendet und Sie dennoch den Fehler erhalten, liegt möglicherweise ein Problem mit den Netzwerkeinstellungen Ihres Betriebssystems vor. In diesem Fall sollten Sie Hilfe von einem IT-Experten oder der Streamlit-Community suchen.
Teil 6: Streamlit-Anwendungen auf dem neuesten Stand halten
Eine weitere Herausforderung, mit der Sie konfrontiert sein könnten, besteht darin, sicherzustellen, dass Ihre Streamlit-Anwendung immer aktuelle Daten anzeigt. Dies ist besonders wichtig, wenn Ihre App Live-Daten oder häufig aktualisierte Daten anzeigt. Die Lösung für diese Herausforderung liegt im Streamlit-Cache.
Der Caching-Mechanismus von Streamlit ermöglicht es Ihrer App, Daten im Speicher zu speichern, so dass sie nicht jedes Mal, wenn die App läuft, von der Festplatte geladen oder von einem Remote-Server abgerufen werden müssen.
Durch die Verwendung des @st.cache
-Dekorators in Ihren Datenlade-Funktionen können Sie die Geschwindigkeit und Reaktionsfähigkeit Ihrer Anwendung erheblich verbessern. Wenn Sie zum Beispiel eine Funktion haben, die Daten von einem Remote-Server abruft, könnten Sie den @st.cache
-Dekorator über der Funktion wie folgt hinzufügen:
@st.cache
def get_data():
# Daten vom Remote-Server abrufen
return data
Damit speichert Streamlit die zurückgegebenen Daten in seinem Cache. Wenn die Funktion erneut aufgerufen wird, überprüft Streamlit zuerst, ob die Daten im Cache vorhanden sind. Falls ja, verwendet Streamlit die gecachten Daten anstatt die Funktion erneut aufzurufen.
Zusätzlich bietet Streamlit den ttl
-Parameter, mit dem Sie angeben können, wie lange die Daten zwischengespeichert werden sollen. Wenn Sie ttl
auf eine bestimmte Anzahl von Sekunden setzen, aktualisiert Streamlit automatisch die zwischengespeicherten Daten nach dieser Dauer.
Hier ist ein Beispiel dafür, wie Sie den ttl
-Parameter in Ihrer Funktion verwenden können:
@st.cache(ttl=60*60*2)
def get_data():
# Daten vom Remote-Server abrufen
return data
In diesem Beispiel ist ttl
auf zwei Stunden (60 Sekunden * 60 Minuten * 2) eingestellt, was bedeutet, dass Streamlit die Daten alle zwei Stunden automatisch aktualisiert.
Fazit
Das Ausführen von Streamlit-Anwendungen auf Port 80 ist nicht so einfach, wie es auf den ersten Blick erscheinen mag, aufgrund der privilegierten Natur des Ports und anderer möglicher Probleme wie belegte Ports oder Berechtigungen. Aber mit den Erkenntnissen, die wir in diesem Leitfaden besprochen haben, sollten Sie gut darauf vorbereitet sein, diese Herausforderungen zu bewältigen.
Denken Sie daran, wenn Sie Schwierigkeiten haben, zögern Sie nicht, sich an die Streamlit-Community zu wenden. Sie ist mit sachkundigen Personen gefüllt, die wahrscheinlich ähnliche Probleme hatten und gerne helfen.
Häufig gestellte Fragen
1. Warum kann ich meine Streamlit-Anwendung nicht auf Port 80 ausführen?
Ports unter 1024, einschließlich Port 80, werden in Unix-ähnlichen Betriebssystemen als privilegiert angesehen und erfordern in der Regel Superuser- (oder Root-) Zugriff. Stellen Sie sicher, dass Sie die erforderlichen Berechtigungen haben und der Port nicht bereits verwendet wird.
2. Wie kann ich mehrere Streamlit-Anwendungen gleichzeitig ausführen?
Sie können mehrere Streamlit-Anwendungen ausführen, indem Sie unterschiedliche Portnummern für jede Anwendung festlegen und den --server.port
-Parameter beim Starten der Anwendung verwenden.
3. Wie kann ich meine Streamlit-Anwendungsdaten aktuell halten?
Sie können den @st.cache
-Dekorator in Ihren Datenlade-Funktionen verwenden, um Daten im Speicher zu speichern und die Geschwindigkeit und Reaktionsfähigkeit Ihrer Anwendung zu verbessern. Streamlit bietet auch den ttl
-Parameter an, um anzugeben, wie lange die Daten zwischengespeichert werden sollen.