Quelle est une alternative plus rapide au serveur http.server (ou SimpleHTTPServer) de Python?

300

Le serveur http.server de Python (ou SimpleHTTPServer pour Python 2) est un excellent moyen de servir le contenu du répertoire actuel à partir de la ligne de commande:

python -m http.server

Cependant, en ce qui concerne les serveurs Web, c'est très lent ...

Il se comporte comme s'il s'agissait d'un seul thread et provoque parfois des erreurs de dépassement de délai lors du chargement des modules JavaScript AMD à l'aide de RequireJS. Le chargement d'une page simple sans images peut prendre de cinq à dix secondes.

Quelle est une alternative plus rapide et tout aussi pratique?

Drew Noakes
la source
17
Ce fil vient de restaurer ma raison. J'utilisais SimpleHTTPServer et obtenais des erreurs aléatoires avec RequireJS qui me rendaient fou! Le serveur http du nœud fonctionne comme un charme. Merci!
Dave Cadwallader
4
@ChrisF, j'ai édité la question conformément à cette directive pour refléter plus grammaticalement le fait qu'il s'agit en fait d'une question recevable. J'ai expliqué le problème auquel j'étais confronté (à savoir les délais d'attente et le temps perdu), et je n'ai pas pu énumérer ce que j'avais fait pour résoudre le problème parce que je ne connaissais aucune alternative. Je ne pense pas que cette question corresponde à la forme "Quelle est votre ___ préférée", car les critères sont clairement définis. Différents visiteurs peuvent trouver différentes réponses plus utiles et les réponses peuvent ne pas correspondre aux critères donnés.
Drew Noakes
26
J'adore la façon dont SO a l'habitude de fermer les questions préférées des gens…
isomorphismes
4
Cette question n'est pas seulement utile, elle ne correspond pas non plus à la description pour laquelle elle est fermée. Au moins la recherche a déjà été faite ...
Bryan Larson
3
Une autre option, si vous souhaitez servir un dépôt git, est git instaweb.
Drew Noakes

Réponses:

394

Le serveur http pour node.js est très pratique et beaucoup plus rapide que SimpleHTTPServer de Python. Cela est principalement dû au fait qu'il utilise des E / S asynchrones pour le traitement simultané des demandes, au lieu de sérialiser les demandes.

Installation

Installez node.js si vous ne l'avez pas déjà fait. Utilisez ensuite le gestionnaire de packages de nœuds ( npm) pour installer le package, en utilisant l' -goption pour installer globalement. Si vous êtes sous Windows, vous aurez besoin d'une invite avec des autorisations d'administrateur, et sous Linux / OSX, vous voudrez sudola commande:

npm install http-server -g

Cela téléchargera toutes les dépendances requises et installera http-server.

Utilisation

Maintenant, à partir de n'importe quel répertoire, vous pouvez taper:

http-server [path] [options]

Le chemin est facultatif, par défaut ./publics'il existe, sinon ./.

Les options sont [par défaut]:

  • -p Le numéro de port à écouter sur [8080]
  • -a L'adresse d'hôte à laquelle se lier à [localhost]
  • -i Afficher les pages d'index du répertoire [Vrai]
  • -sou le --silentmode silencieux ne se connecte pas à la console
  • -hou --helpAffiche un message d'aide et quitte

Donc, pour servir le répertoire actuel sur le port 8000, tapez:

http-server -p 8000
Drew Noakes
la source
12
C'est génial!! Je vous remercie de le faire remarquer. C'est génial pour tester le streaming audio / vidéo, ce que le serveur python ne semble pas bien gérer du tout.
gman
1
@Salmonface, avez-vous vraiment utilisé l' -goption et vous êtes-vous assuré qu'aucune erreur n'a été imprimée lors de l'installation? Cette erreur signifie simplement qu'elle ne peut pas être trouvée après l'installation, ce qui semble peu probable si les choses se sont bien passées. Sur quelle plateforme êtes-vous? Exécutez une commande find sur votre lecteur pour rechercher un fichier avec un nom http-server. Je l'ai utilisé avec succès sur quelques distributions Linux différentes et versions Windows.
Drew Noakes
2
Je veux juste confirmer que l'utilisation de cette solution a amélioré le temps de chargement de ma page de 20s à 2s!
0leg
1
Eh bien, au début, c'était une amélioration par rapport au python SimpleHTTPServer jusqu'à ce que je manque de mémoire. Le serveur http consomme une énorme quantité de mémoire pour les fichiers volumineux. La proposition myserver.go est rapide et consomme environ 2 Mo au lieu de 5 Go de mémoire, avant de commencer à échanger et de devenir vraiment lente.
daniel
2
Donc, depuis novembre 2019, il semble que le serveur http ait été interrompu pour les utilisateurs de Windows pendant plusieurs mois. Beaucoup de ses dépendances sont bien dépassées. L'un d'eux, extatique, est maintenant abandonné, il n'est donc pas clair quand ou si il sera corrigé. J'ai cherché à me réparer, mais il n'est pas clair non plus si les développeurs prendront des RP. J'ai donc écrit mon propre remplaçant .
gman
106

Je recommande: Twisted ( http://twistedmatrix.com )

un moteur de mise en réseau événementiel écrit en Python et sous licence sous la licence open source MIT.

Il est multiplateforme et a été préinstallé sur OS X 10.5 à 10.12. Entre autres, vous pouvez démarrer un simple serveur Web dans le répertoire courant avec:

twistd -no web --path=.

Détails

Explication des options (voir twistd --helppour en savoir plus):

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

"web" est une commande qui exécute un serveur Web simple au-dessus du moteur asynchrone Twisted. Il accepte également les options de ligne de commande (après la commande "web" - voir twistd web --helppour en savoir plus):

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

Il existe également un tas d'autres commandes telles que:

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 (vient préinstallé sur 10.5 - 10.12, ou est disponible dans MacPorts et via Pip)

sudo port install py-twisted

les fenêtres

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

HTTPS

Twisted peut également utiliser des certificats de sécurité pour crypter la connexion. Utilisez-le avec vos options existantes --pathet --port(pour le HTTP simple).

twistd -no web -c cert.pem -k privkey.pem --https=4433
Peter Gibson
la source
5
À moins que vous n'ayez déjà configuré node.js, j'ai trouvé que c'était le plus pratique. Merci d'avoir partagé!
Chris J
3
Sur Ubuntu, vous devez d' sudo apt-get install python-twisted-webabord. (Merci pour cette réponse, c'est très pratique!)
nkorth
2
Un avantage particulier du serveur une ligne torsadée, il prend en charge les téléchargements pouvant être repris (prise en charge de la plage d'octets), et c'est une fonctionnalité indispensable lorsque vous téléchargez des fichiers volumineux.
Pankaj
7
l'utilisation de node n'a pas diffusé de vidéo / audio correctement pour moi, l'utilisation de twistd fonctionne très bien!
vertigineux
2
Vous pouvez configurer des ports et obtenir d'autres options en utilisant twistd --helpet twistd web --help. Cela m'a pris un certain temps pour comprendre cela.
Ehtesh Choudhury
30

1.0 comprend un serveur http & util pour servir des fichiers avec quelques lignes de code.

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

Exécutez cette source en utilisant go run myserver.goou pour construire un exécutablego build myserver.go

pd40
la source
Très bonne réponse. Cela s'exécute plus rapidement que SimpleHTTPServer et la solution nodejs. :) Existe-t-il un moyen d'ajouter le nom d'utilisateur et le mot de passe au téléchargement?
Ajax
21

Essayez webfs , il est minuscule et ne dépend pas de l'installation d'une plateforme comme node.js ou python.

Hudon
la source
1
on dirait que vous devez le compiler? Je n'ai vu aucun fichier binaire à télécharger.
BrainSlugs83
2
oui, sauf si votre distribution l'a. Debian et Ubuntu l'ont:apt-get install webfs
Hudon
4
J'ai fait un brew install webfssur mon Mac qui en a résulté 🍺 /usr/local/Cellar/webfs/1.21: 5 files, 96K, built in 15 seconds. Ensuite, je pourrais simplement dire webfsd -F -p 3003 -r resources/public/ -f index.htmlde réaliser la même chose que twistd -no web -p 3003 --path=resources/public/. C'est un peu verbeux donc pas évident à retenir mais bon à savoir comme alternative à twistd ou SimpleHTTPServer.
onetom
Beaucoup mieux que les autres solutions. Il est très petit, très rapide et fourni sous forme de package de système d'exploitation. Il prend également en charge SSL et peut s'exécuter en tant que démon système.
Federico
14

Si vous utilisez Mercurial, vous pouvez utiliser le serveur HTTP intégré. Dans le dossier que vous souhaitez servir:

hg serve

De la documentation :

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
la source
8

Considérez également devd un petit serveur web écrit en go. Des fichiers binaires pour de nombreuses plateformes sont disponibles ici .

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

Il est petit, rapide et offre des fonctionnalités optionnelles intéressantes comme le rechargement en direct lorsque vos fichiers changent.

gman
la source
7

J'ai trouvé python -m http.serverpeu fiable - certaines réponses prenaient quelques secondes.

Maintenant, j'utilise un serveur appelé Ran https://github.com/m3ng9i/ran

Ran: un simple serveur web statique écrit en Go

Colonel Panic
la source
5

essayez Polpetta ...

npm install -g polpetta

Ensuite vous pouvez

polpetta ~ / dossier

et vous êtes prêt à partir :-)

Andrea Giammarchi
la source
1
Pouvez-vous expliquer pourquoi nous devrions essayer Polpetta ?
Dan Dascalescu
3

Utiliser Servez comme serveur

  1. Télécharger Servez
  2. Installez-le, exécutez-le
  3. Choisissez le dossier à servir
  4. Choisissez "Démarrer"
  5. Allez http://localhost:8080ou choisissez "Lancer le navigateur"

servez

Remarque: J'ai jeté cela ensemble parce que Web Server pour Chrome disparaît car Chrome supprime la prise en charge des applications et parce que je prends en charge les étudiants en art qui n'ont aucune expérience de la ligne de commande

gman
la source
Je vote pour l'exécution d'exemples WebGL
Felipe Gutierrez
2

J'aime le live-server . Il est rapide et possède une belle fonction de rechargement en direct, ce qui est très pratique pendant le développement.

L'utilisation est très simple:

cd ~/Sites/
live-server

Par défaut, il crée un serveur avec IP 127.0.0.1 et le port 8080.

http://127.0.0.1:8080/

Si le port 8080 n'est pas libre, il utilise un autre port:

http://127.0.0.1:52749/

http://127.0.0.1:52858/

Si vous devez voir le serveur Web sur d'autres machines de votre réseau local, vous pouvez vérifier quelle est votre adresse IP et utiliser:

live-server --host=192.168.1.121

Et voici un script qui récupère automatiquement l'adresse IP de l'interface par défaut. Il fonctionne uniquement sur macOS .

Si vous le placez .bash_profile, la live-servercommande lancera automatiquement le serveur avec l'adresse IP correcte.

# **
# 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
la source
1

Si vous avez installé PHP, vous pouvez utiliser le serveur intégré.

php -S 0:8080
user1461607
la source
0

Encore un autre serveur de ligne de commande simple basé sur un nœud

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

Écrit en partie en réponse à des problèmes de serveur http, en particulier sur Windows.

installation

Installez node.js puis

npm install -g servez

usage

servez [options] [path]

Sans chemin, il sert le dossier actuel.

Par défaut, il sert index.htmlpour les chemins de dossier s'il existe. Sinon, il sert une liste de répertoires pour les dossiers. Il sert également les en-têtes CORS. Vous pouvez éventuellement activer l'authentification de base avec --username=somename --password=somepasset vous pouvez servir https.

gman
la source