Was ist eine schnellere Alternative zu Pythons http.server (oder SimpleHTTPServer)?

300

Der http.server von Python (oder SimpleHTTPServer für Python 2) ist eine hervorragende Möglichkeit, den Inhalt des aktuellen Verzeichnisses über die Befehlszeile bereitzustellen:

python -m http.server

Was Webserver angeht, ist es jedoch sehr langsam ...

Es verhält sich wie Single-Threaded und verursacht gelegentlich Timeout-Fehler beim Laden von JavaScript-AMD-Modulen mit RequireJS. Das Laden einer einfachen Seite ohne Bilder kann fünf bis zehn Sekunden dauern.

Was ist eine schnellere Alternative, die genauso praktisch ist?

Drew Noakes
quelle
17
Dieser Thread hat gerade meine geistige Gesundheit wiederhergestellt. Ich hatte SimpleHTTPServer verwendet und zufällige Fehler mit RequireJS erhalten, die mich verrückt machten! Der http-Server des Knotens funktioniert wie ein Zauber. Vielen Dank!
Dave Cadwallader
4
@ChrisF, ich habe die Frage gemäß dieser Richtlinie bearbeitet, um die Tatsache, dass dies tatsächlich eine beantwortbare Frage ist, grammatikalischer wiederzugeben. Ich habe das Problem erklärt, mit dem ich konfrontiert war (nämlich Zeitüberschreitungen und Zeitverschwendung), und ich konnte nicht auflisten, was ich getan hatte, um das Problem zu beheben, da ich keine Alternativen kannte. Ich denke nicht, dass diese Frage zur Form "Was ist Ihr Favorit ___" passt, da die Kriterien klar definiert sind. Unterschiedliche Besucher finden unterschiedliche Antworten möglicherweise nützlicher, und Antworten entsprechen möglicherweise nicht den angegebenen Kriterien.
Drew Noakes
26
Lieben Sie, wie SO die Gewohnheit hat, die Lieblingsfragen der Leute zu schließen…
Isomorphismen
4
Diese Frage ist nicht nur nützlich, sie stimmt auch nicht mit der Beschreibung überein, für die sie geschlossen wird. Zumindest die Forschung wurde bereits durchgeführt ...
Bryan Larson
3
Eine andere Option, wenn Sie ein Git-Repo servieren möchten, ist git instaweb.
Drew Noakes

Antworten:

394

http-server für node.js ist sehr praktisch und viel schneller als Pythons SimpleHTTPServer. Dies liegt hauptsächlich daran, dass asynchrone E / A für die gleichzeitige Verarbeitung von Anforderungen verwendet werden, anstatt Anforderungen zu serialisieren.

Installation

Installieren Sie node.js, falls Sie dies noch nicht getan haben. Verwenden Sie dann den Node Package Manager ( npm), um das Paket zu installieren, und verwenden Sie die -gOption, um es global zu installieren. Wenn Sie unter Windows arbeiten, benötigen Sie eine Eingabeaufforderung mit Administratorrechten. Unter Linux / OSX möchten Sie sudoden folgenden Befehl ausführen :

npm install http-server -g

Dadurch werden alle erforderlichen Abhängigkeiten heruntergeladen und installiert http-server.

Verwenden

Jetzt können Sie aus jedem Verzeichnis Folgendes eingeben:

http-server [path] [options]

Der Pfad ist optional ./public, andernfalls standardmäßig, falls vorhanden ./.

Optionen sind [Standardeinstellungen]:

  • -p Die Portnummer, die abgehört werden soll [8080]
  • -a Die Hostadresse, an die [localhost] gebunden werden soll
  • -i Verzeichnisindexseiten anzeigen [True]
  • -soder --silentSilent-Modus wird nicht an der Konsole protokolliert
  • -hoder --helpZeigt eine Hilfemeldung an und wird beendet

Geben Sie Folgendes ein, um das aktuelle Verzeichnis auf Port 8000 bereitzustellen:

http-server -p 8000
Drew Noakes
quelle
12
Das ist fantastisch!! Vielen Dank für den Hinweis. Es eignet sich hervorragend zum Testen des Streamings von Audio / Video, was der Python-Server anscheinend überhaupt nicht gut beherrscht.
Gman
1
@Salmonface, haben Sie die -gOption definitiv verwendet und sichergestellt, dass während der Installation keine Fehler gedruckt wurden? Dieser Fehler bedeutet nur, dass er nach der Installation nicht gefunden werden kann, was unwahrscheinlich erscheint, wenn alles gut gelaufen ist. Auf welcher Plattform bist du? Führen Sie einen Suchbefehl auf Ihrem Laufwerk aus, um eine Datei mit Namen zu finden http-server. Ich habe dies erfolgreich auf einigen verschiedenen Linux-Distributionen und Windows-Versionen verwendet.
Drew Noakes
2
Ich möchte nur bestätigen, dass die Verwendung dieser Lösung die Ladezeit meiner Seite von 20 auf 2 Sekunden verbessert hat!
0leg
1
Nun, zuerst war es eine Verbesserung gegenüber dem Python SimpleHTTPServer, bis mir der Speicher ausgegangen war. http-server verbraucht sehr viel Speicher für große Dateien. Der Vorschlag für myserver.go ist schnell und verbraucht nur etwa 2 MB anstelle von 5 GB Speicher, bevor er ausgetauscht wird und sehr langsam wird.
Daniel
2
Ab November 2019 sieht es so aus, als ob der http-Server für Windows-Benutzer seit mehreren Monaten defekt ist. Viele seiner Abhängigkeiten sind veraltet. Einer von ihnen, ekstatisch, ist jetzt aufgegeben, so dass nicht klar ist, wann oder ob er behoben wird. Ich habe versucht, mich selbst zu reparieren, aber es ist auch nicht klar, ob die Entwickler PRs nehmen werden. Also schrieb ich meinen eigenen Ersatz .
Gman
105

Ich empfehle: Twisted ( http://twistedmatrix.com )

Eine ereignisgesteuerte Netzwerk-Engine, die in Python geschrieben und unter der Open Source MIT-Lizenz lizenziert ist.

Es ist plattformübergreifend und wurde unter OS X 10.5 bis 10.12 vorinstalliert. Unter anderem können Sie einen einfachen Webserver im aktuellen Verzeichnis starten mit:

twistd -no web --path=.

Einzelheiten

Erläuterung der Optionen (siehe twistd --helpmehr):

-n, --nodaemon       don't daemonize, don't use default umask of 0077
-o, --no_save        do not save state on shutdown

"web" ist ein Befehl, der einen einfachen Webserver über der Twisted-Async-Engine ausführt. Es werden auch Befehlszeilenoptionen akzeptiert (nach dem Befehl "web" - siehe twistd web --helpmehr):

  --path=             <path> is either a specific file or a directory to be
                      set as the root of the web server. Use this if you
                      have a directory full of HTML, cgi, php3, epy, or rpy
                      files or any other files that you want to be served up
                      raw.

Es gibt auch eine Reihe anderer Befehle wie:

conch            A Conch SSH service.
dns              A domain name server.
ftp              An FTP server.
inetd            An inetd(8) replacement.
mail             An email service
... etc

Installation

Ubuntu

sudo apt-get install python-twisted-web (or python-twisted for the full engine)

Mac OS-X (wird unter 10.5 - 10.12 vorinstalliert oder ist in MacPorts und über Pip verfügbar)

sudo port install py-twisted

Windows

installer available for download at http://twistedmatrix.com/

HTTPS

Twisted kann auch Sicherheitszertifikate verwenden, um die Verbindung zu verschlüsseln. Verwenden Sie dies mit Ihren vorhandenen --pathund --port(für einfaches HTTP) Optionen.

twistd -no web -c cert.pem -k privkey.pem --https=4433
Peter Gibson
quelle
5
Sofern Sie node.js nicht bereits eingerichtet haben, fand ich dies am bequemsten. Danke für das Teilen!
Chris J
3
Unter Ubuntu muss man sudo apt-get install python-twisted-webzuerst. (Danke für diese Antwort, es ist sehr praktisch!)
Nkorth
2
Ein besonderer Vorteil des Twisted One Line Servers ist die Unterstützung wiederaufnehmbarer Downloads (Unterstützung des Bytebereichs). Diese Funktion ist ein Muss, wenn Sie große Dateien herunterladen.
Pankaj
7
Die Verwendung von Node hat Video / Audio für mich nicht richtig gestreamt. Die Verwendung von Twistd funktioniert jedoch hervorragend!
schwindlig
2
Sie können Ports konfigurieren und andere Optionen mit twistd --helpund abrufen twistd web --help. Ich habe eine Weile gebraucht, um das herauszufinden.
Ehtesh Choudhury
30

1.0 enthält einen http-Server und ein Dienstprogramm zum Bereitstellen von Dateien mit wenigen Codezeilen.

package main

import (
    "fmt"; "log"; "net/http"
)

func main() {
    fmt.Println("Serving files in the current directory on port 8080")
    http.Handle("/", http.FileServer(http.Dir(".")))
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

Führen Sie diese Quelle mit go run myserver.gooder aus, um eine ausführbare Datei zu erstellengo build myserver.go

pd40
quelle
Gute Antwort. Dies läuft schneller als die Lösung von SimpleHTTPServer und nodejs. :) Kann ich dem Download auf irgendeine Weise einen Benutzernamen und ein Passwort hinzufügen?
Ajax
21

Probieren Sie webfs aus , es ist winzig und hängt nicht davon ab, ob eine Plattform wie node.js oder python installiert ist.

Hudon
quelle
1
sieht aus wie du es kompilieren musst? Es wurden keine Binärdateien zum Herunterladen angezeigt.
BrainSlugs83
2
Ja, es sei denn, Ihre Distribution hat es. Debian und Ubuntu haben es:apt-get install webfs
Hudon
4
Ich habe eine brew install webfsauf meinem Mac gemacht, was dazu führte 🍺 /usr/local/Cellar/webfs/1.21: 5 files, 96K, built in 15 seconds. Danach könnte ich einfach sagen webfsd -F -p 3003 -r resources/public/ -f index.html, das gleiche zu erreichen wie twistd -no web -p 3003 --path=resources/public/. Es ist ein bisschen wortreich, also nicht offensichtlich, aber gut zu wissen, als Alternative zu Twistd oder SimpleHTTPServer.
am
Viel besser als die anderen Lösungen. Es ist sehr klein, sehr schnell und wird als Betriebssystempaket bereitgestellt. Es unterstützt auch SSL und kann als Systemdämon ausgeführt werden.
Federico
14

Wenn Sie Mercurial verwenden, können Sie den integrierten HTTP-Server verwenden. In dem Ordner, den Sie bereitstellen möchten:

hg serve

Aus den Dokumenten :

export the repository via HTTP

    Start a local HTTP repository browser and pull server.

    By default, the server logs accesses to stdout and errors to
    stderr. Use the "-A" and "-E" options to log to files.

options:

 -A --accesslog       name of access log file to write to
 -d --daemon          run server in background
    --daemon-pipefds  used internally by daemon mode
 -E --errorlog        name of error log file to write to
 -p --port            port to listen on (default: 8000)
 -a --address         address to listen on (default: all interfaces)
    --prefix          prefix path to serve from (default: server root)
 -n --name            name to show in web pages (default: working dir)
    --webdir-conf     name of the webdir config file (serve more than one repo)
    --pid-file        name of file to write process ID to
    --stdio           for remote clients
 -t --templates       web templates to use
    --style           template style to use
 -6 --ipv6            use IPv6 in addition to IPv4
    --certificate     SSL certificate file

use "hg -v help serve" to show global options
Drew Noakes
quelle
8

Betrachten Sie devd auch als einen kleinen Webserver, der in go geschrieben ist. Binärdateien für viele Plattformen finden Sie hier .

devd -ol path/to/files/to/serve

Es ist klein, schnell und bietet einige interessante optionale Funktionen wie das Live-Neuladen, wenn sich Ihre Dateien ändern.

gman
quelle
7

Ich fand es python -m http.serverunzuverlässig - einige Antworten würden Sekunden dauern.

Jetzt benutze ich einen Server namens Ran https://github.com/m3ng9i/ran

Ran: Ein einfacher statischer Webserver, der in Go geschrieben wurde

Oberst Panik
quelle
5

Probieren Sie Polpetta aus ...

npm installiere -g polpetta

dann kannst du

polpetta ~ / Ordner

und du bist bereit zu gehen :-)

Andrea Giammarchi
quelle
1
Können Sie näher erläutern , warum wir Polpetta ausprobieren sollten?
Dan Dascalescu
3

Verwenden von Servez als Server

  1. Laden Sie Servez herunter
  2. Installieren Sie es, führen Sie es aus
  3. Wählen Sie den Ordner aus, der bereitgestellt werden soll
  4. Wählen Sie "Start"
  5. Gehen Sie zu http://localhost:8080oder wählen Sie "Browser starten"

Aufschlag

Hinweis: Ich habe dies zusammengeschmissen, weil Web Server für Chrome nicht mehr verfügbar ist, da Chrome die Unterstützung für Apps entfernt, und weil ich Kunststudenten unterstütze, die keine Erfahrung mit der Befehlszeile haben

gman
quelle
Ich stimme für das Ausführen von WebGL-Beispielen
Felipe Gutierrez
2

Ich mag Live-Server . Es ist schnell und hat eine nette Live-Reload-Funktion, die während der Entwicklung sehr praktisch ist.

Die Verwendung ist sehr einfach:

cd ~/Sites/
live-server

Standardmäßig wird ein Server mit IP 127.0.0.1 und Port 8080 erstellt.

http://127.0.0.1:8080/

Wenn Port 8080 nicht frei ist, wird ein anderer Port verwendet:

http://127.0.0.1:52749/

http://127.0.0.1:52858/

Wenn Sie den Webserver auf anderen Computern in Ihrem lokalen Netzwerk sehen müssen, können Sie Ihre IP-Adresse überprüfen und Folgendes verwenden:

live-server --host=192.168.1.121

Und hier ist ein Skript, das automatisch die IP-Adresse der Standardschnittstelle abruft. Es funktioniert nur unter MacOS .

Wenn Sie es eingeben, startet .bash_profileder live-serverBefehl automatisch den Server mit der richtigen IP.

# **
# Get IP address of default interface
# *
function getIPofDefaultInterface()
{
    local  __resultvar=$1

    # Get default route interface
    if=$(route -n get 0.0.0.0 2>/dev/null | awk '/interface: / {print $2}')
    if [ -n "$if" ]; then
            # Get IP of the default route interface
            local __IP=$( ipconfig getifaddr $if )
            eval $__resultvar="'$__IP'"
    else
        # Echo "No default route found"
        eval $__resultvar="'0.0.0.0'"
    fi
}

alias getIP='getIPofDefaultInterface IP; echo $IP'

# **
# live-server
# https://www.npmjs.com/package/live-server
# *
alias live-server='getIPofDefaultInterface IP && live-server --host=$IP'
nico
quelle
1

Wenn Sie PHP installiert haben, können Sie den eingebauten Server verwenden.

php -S 0:8080
user1461607
quelle
0

Noch ein knotenbasierter einfacher Befehlszeilenserver

https://github.com/greggman/servez-cli

Teilweise als Antwort auf Probleme mit dem http-Server geschrieben, insbesondere unter Windows.

Installation

Installieren Sie dann node.js

npm install -g servez

Verwendung

servez [options] [path]

Ohne Pfad wird der aktuelle Ordner bereitgestellt.

Standardmäßig dient es index.htmlfür Ordnerpfade, falls vorhanden. Andernfalls wird eine Verzeichnisliste für Ordner bereitgestellt. Es dient auch CORS-Header. Sie können optional die Basisauthentifizierung mit --username=somename --password=somepassaktivieren und https bereitstellen.

gman
quelle