Qual è un'alternativa più veloce al server http di Python (o SimpleHTTPServer)?


300

Il server http. Di Python (o SimpleHTTPServer per Python 2) è un ottimo modo per servire il contenuto della directory corrente dalla riga di comando:

python -m http.server

Tuttavia, per quanto riguarda i server Web, è molto slooooow ...

Si comporta come se fosse a thread singolo e occasionalmente causa errori di timeout durante il caricamento dei moduli AMD JavaScript utilizzando RequireJS. Il caricamento di una pagina semplice senza immagini può richiedere da cinque a dieci secondi.

Qual è un'alternativa più veloce che è altrettanto conveniente?


17
Questo thread ha appena ripristinato la mia sanità mentale. Stavo usando SimpleHTTPServer e ottenevo errori casuali con RequireJS che mi stavano facendo impazzire! Il server http del nodo funziona come un incantesimo. Grazie!
Dave Cadwallader,

4
@ Chris, ho modificato la domanda in base a queste linee guida per riflettere più grammaticamente il fatto che questa è in realtà una domanda che risponde. Ho spiegato il problema che ho affrontato (vale a dire, timeout e tempo sprecato) e non sono riuscito a elencare ciò che avevo fatto per affrontare il problema perché non conoscevo alternative. Non credo che questa domanda si adatti alla forma "Qual è il tuo ___ preferito", poiché i criteri sono chiaramente definiti. Visitatori diversi potrebbero trovare più utili risposte diverse e le risposte potrebbero non soddisfare i criteri indicati.
Drew Noakes,

26
Adoro come SO abbia l'abitudine di chiudere le domande preferite della gente ...
isomorfismi

4
Questa domanda non è solo utile, ma non corrisponde alla descrizione per la quale viene chiusa. Almeno la ricerca è già stata fatta ...
Bryan Larson,

3
Un'altra opzione, se si desidera servire un repository git, è git instaweb.
Drew Noakes,

Risposte:


394

http-server per node.js è molto conveniente ed è molto più veloce di SimpleHTTPServer di Python. Ciò è dovuto principalmente al fatto che utilizza IO asincrono per la gestione simultanea delle richieste, anziché per serializzare le richieste.

Installazione

Installa node.js se non l'hai già fatto. Quindi utilizzare il gestore pacchetti nodo ( npm) per installare il pacchetto, utilizzando l' -gopzione per l'installazione globale. Se sei su Windows avrai bisogno di un prompt con le autorizzazioni di amministratore e su Linux / OSX vorrai sudoil comando:

npm install http-server -g

Questo scaricherà tutte le dipendenze richieste e installerà http-server.

Uso

Ora, da qualsiasi directory, puoi digitare:

http-server [path] [options]

Il percorso è facoltativo, per impostazione predefinita ./publicse esiste, altrimenti ./.

Le opzioni sono [valori predefiniti]:

  • -p Il numero di porta da ascoltare su [8080]
  • -a L'indirizzo host da associare a [localhost]
  • -i Visualizza pagine indice directory [Vero]
  • -so la --silentmodalità silenziosa non accederà alla console
  • -hoppure --helpVisualizza il messaggio di aiuto ed esce

Quindi per servire la directory corrente sulla porta 8000, digitare:

http-server -p 8000

12
Questo e spettacolare!! Grazie per averlo precisato. È ottimo per testare streaming audio / video che è qualcosa che il server Python non sembra gestire bene.
Gman,

1
@Salmonface, hai sicuramente utilizzato l' -gopzione e ti sei assicurato che durante l'installazione non fossero stati stampati errori? Questo errore significa solo che non può essere trovato dopo l'installazione, il che sembra improbabile se le cose sono andate bene. Su che piattaforma sei? Esegui un comando find sull'unità per trovare un file con nome http-server. L'ho usato con successo su diverse distribuzioni Linux e versioni di Windows.
Drew Noakes,

2
Voglio solo confermare che l'utilizzo di questa soluzione ha migliorato il tempo di caricamento della mia pagina da 20 a 2 secondi!
0leg,

1
Bene, all'inizio è stato un miglioramento rispetto a Python SimpleHTTPServer fino a quando ho esaurito la memoria. http-server consuma un'enorme quantità di memoria per file di grandi dimensioni. La proposta myserver.go è veloce e consuma solo circa 2 MB invece di 5 GB di memoria, prima di iniziare a scambiarsi e diventare molto lento.
daniel,

2
Quindi a partire da novembre 2019 sembra che http-server sia stato rotto per gli utenti di Windows per diversi mesi. Molte delle sue dipendenze sono obsolete. Uno di loro, estatico, ora è abbandonato, quindi non è chiaro quando o se verrà risolto. Ho cercato di risolvere me stesso, ma non è anche chiaro se gli sviluppatori prenderanno PR. Quindi, ho scritto il mio sostituto .
Gman,

106

Raccomando: Twisted ( http://twistedmatrix.com )

un motore di rete basato su eventi scritto in Python e concesso in licenza con la licenza MIT open source.

È multipiattaforma ed è stato preinstallato su OS X da 10.5 a 10.12. Tra le altre cose è possibile avviare un semplice server Web nella directory corrente con:

twistd -no web --path=.

Dettagli

Spiegazione delle opzioni (vedere twistd --helpdi più):

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

"web" è un comando che esegue un semplice server Web sopra il motore asincrono Twisted. Accetta anche le opzioni della riga di comando (dopo il comando "web" - vedi twistd web --helpdi più):

  --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.

Ci sono anche un sacco di altri comandi come:

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

Installazione

Ubuntu

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

Mac OS-X (viene preinstallato su 10.5 - 10.12 o è disponibile in MacPorts e tramite Pip)

sudo port install py-twisted

finestre

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

HTTPS

Twisted può anche utilizzare certificati di sicurezza per crittografare la connessione. Utilizzalo con le opzioni esistenti --pathe --port(per HTTP semplice).

twistd -no web -c cert.pem -k privkey.pem --https=4433

5
A meno che tu non abbia già configurato node.js, ho scoperto che questo è il più conveniente. Grazie per la condivisione!
Chris J,

3
Su Ubuntu, devi sudo apt-get install python-twisted-webprima. (Grazie per questa risposta, è molto conveniente!)
Nord

2
Un vantaggio speciale del server a una linea attorcigliato, supporta download ripristinabili (supporto dell'intervallo di byte) e questa è una caratteristica indispensabile quando si scaricano file di grandi dimensioni.
Pankaj,

7
l'utilizzo di node non ha eseguito lo streaming video / audio in modo corretto per me, tuttavia l'utilizzo di twistd funziona alla grande!
dizy

2
È possibile configurare le porte e ottenere altre opzioni utilizzando twistd --helpe twistd web --help. Mi ci è voluto un po 'per capirlo.
Ehtesh Choudhury,

30

1.0 include un server http e util per servire file con poche righe di codice.

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)
    }
}

Esegui questa fonte usando go run myserver.goo per costruire un eseguibilego build myserver.go


Bella risposta. Funziona più velocemente della soluzione SimpleHTTPServer e nodejs. :) Esiste un modo per aggiungere nome utente e password al download?
Ajax

21

Prova webfs , è minuscolo e non dipende dal fatto che sia installata una piattaforma come node.js o python.


1
sembra che devi compilarlo? Non ho visto alcun file binario per il download.
BrainSlugs83

2
sì, a meno che non lo abbia la tua distribuzione. Debian e Ubuntu ce l'hanno:apt-get install webfs
Hudon

4
Ho fatto un brew install webfssul mio Mac che ha provocato 🍺 /usr/local/Cellar/webfs/1.21: 5 files, 96K, built in 15 seconds. Dopo potrei solo dire webfsd -F -p 3003 -r resources/public/ -f index.htmldi ottenere lo stesso risultato twistd -no web -p 3003 --path=resources/public/. È un po 'prolisso, quindi non ovvio da ricordare, ma buono da sapere come alternativa a twistd o SimpleHTTPServer.
onetom

Molto meglio delle altre soluzioni. È molto piccolo, molto veloce e fornito come pacchetto del sistema operativo. Supporta anche SSL e può essere eseguito come demone di sistema.
Federico

14

Se usi Mercurial, puoi utilizzare il server HTTP integrato. Nella cartella che desideri pubblicare:

hg serve

Dai documenti :

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


8

Considera anche devd un piccolo server web scritto in go. I binari per molte piattaforme sono disponibili qui .

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

È piccolo, veloce e offre alcune interessanti funzionalità opzionali come il live-ricaricamento quando i file cambiano.




3

Utilizzo di Servez come server

  1. Scarica Servez
  2. Installalo, eseguilo
  3. Scegli la cartella da pubblicare
  4. Scegli "Avvia"
  5. Vai a http://localhost:8080o seleziona "Avvia browser"

servez

Nota: l'ho messo insieme perché Web Server per Chrome sta scomparendo poiché Chrome sta rimuovendo il supporto per le app e perché supporto gli studenti d'arte che non hanno esperienza con la riga di comando


Sto votando per la pubblicazione di esempi WebGL
Felipe Gutierrez,

2

Mi piace il live-server . È veloce e ha una bella funzione di ricarica dal vivo, che è molto conveniente durante lo sviluppo.

L'utilizzo è molto semplice:

cd ~/Sites/
live-server

Per impostazione predefinita, crea un server con IP 127.0.0.1 e porta 8080.

http://127.0.0.1:8080/

Se la porta 8080 non è libera, utilizza un'altra porta:

http://127.0.0.1:52749/

http://127.0.0.1:52858/

Se hai bisogno di vedere il web server su altri computer della tua rete locale, puoi controllare qual è il tuo IP e usare:

live-server --host=192.168.1.121

Ed ecco uno script che acquisisce automaticamente l'indirizzo IP dell'interfaccia predefinita. Funziona solo su macOS .

Se lo inserisci .bash_profile, il live-servercomando avvierà automaticamente il server con l'IP corretto.

# **
# 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'

1

Se hai PHP installato puoi usare il server integrato.

php -S 0:8080

0

Ancora un altro server a riga di comando semplice basato su nodo

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

Scritto in parte in risposta a problemi con il server http, in particolare su Windows.

installazione

Installa node.js quindi

npm install -g servez

uso

servez [options] [path]

Senza percorso serve la cartella corrente.

Di default serve index.htmlper i percorsi delle cartelle se esiste. Altrimenti serve un elenco di directory per le cartelle. Serve anche le intestazioni CORS. Opzionalmente puoi attivare l'autenticazione di base con --username=somename --password=somepasse puoi servire https.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.