¿Cuál es una alternativa más rápida al servidor http.server de Python (o SimpleHTTPServer)?

300

El http.server de Python (o SimpleHTTPServer para Python 2) es una excelente manera de servir el contenido del directorio actual desde la línea de comandos:

python -m http.server

Sin embargo, en lo que respecta a los servidores web, es muy lento ...

Se comporta como si tuviera un solo subproceso y ocasionalmente produce errores de tiempo de espera al cargar módulos AMD de JavaScript con RequireJS. Puede llevar de cinco a diez segundos cargar una página simple sin imágenes.

¿Cuál es una alternativa más rápida que es tan conveniente?

Drew Noakes
fuente
17
Este hilo acaba de restaurar mi cordura. ¡Había estado usando SimpleHTTPServer y obtenía errores aleatorios con RequireJS que me estaban volviendo loco! El servidor http del nodo está funcionando como un encanto. ¡Gracias!
Dave Cadwallader
44
@ChrisF, he editado la pregunta de acuerdo con esta guía para reflejar más gramaticalmente el hecho de que esta es realmente una pregunta que debe responderse. Le expliqué el problema que enfrenté (es decir, los tiempos de espera y el tiempo perdido), y no pude enumerar lo que había hecho para solucionar el problema porque no conocía ninguna alternativa. No creo que esta pregunta se ajuste a la forma "¿Cuál es tu ___ favorita", ya que los criterios están claramente definidos. Diferentes visitantes pueden encontrar diferentes respuestas más útiles, y las respuestas pueden no ajustarse a los criterios dados.
Drew Noakes
26
Me encanta cómo SO tiene la costumbre de cerrar las preguntas favoritas de las personas ...
isomorphismes
44
Esta pregunta no solo es útil, sino que tampoco coincide con la descripción para la que se está cerrando. Al menos la investigación ya se ha realizado ...
Bryan Larson
3
Otra opción, si quieres servir un repositorio git, es git instaweb.
Drew Noakes

Respuestas:

394

El servidor http para node.js es muy conveniente y mucho más rápido que el SimpleHTTPServer de Python. Esto se debe principalmente a que utiliza IO asíncrona para el manejo concurrente de solicitudes, en lugar de serializar solicitudes.

Instalación

Instala node.js si aún no lo has hecho. Luego use el administrador de paquetes de nodo ( npm) para instalar el paquete, usando la -gopción para instalar globalmente. Si está en Windows, necesitará un aviso con permisos de administrador, y en Linux / OSX querrá sudoel comando:

npm install http-server -g

Esto descargará las dependencias necesarias y se instalará http-server.

Utilizar

Ahora, desde cualquier directorio, puede escribir:

http-server [path] [options]

La ruta es opcional, por defecto ./publicsi existe, de lo contrario ./.

Las opciones son [predeterminadas]:

  • -p El número de puerto para escuchar en [8080]
  • -a La dirección de host para enlazar a [localhost]
  • -i Mostrar páginas de índice del directorio [Verdadero]
  • -so el --silentmodo silencioso no se registrará en la consola
  • -ho --helpMuestra el mensaje de ayuda y sale

Entonces, para servir el directorio actual en el puerto 8000, escriba:

http-server -p 8000
Drew Noakes
fuente
12
¡Esto es asombroso! Gracias por señalarlo. Es excelente para probar la transmisión de audio / video, que es algo que el servidor de Python no parece manejar bien en absoluto.
gman
1
@Salmonface, ¿definitivamente usó la -gopción y se aseguró de que no se imprimieron errores durante la instalación? Ese error solo significa que no se puede encontrar después de la instalación, lo que parece poco probable si las cosas salieron bien. ¿En qué plataforma estás? Ejecute un comando de búsqueda en su unidad para buscar un archivo con nombre http-server. Lo he usado con éxito en algunas distribuciones de Linux y versiones de Windows diferentes.
Drew Noakes
2
¡Solo quiero confirmar que el uso de esta solución mejoró el tiempo de carga de mi página de 20 segundos a 2 segundos!
0leg
1
Bueno, al principio fue una mejora sobre el Python SimpleHTTPServer hasta que me quedé sin memoria. El servidor http consume una gran cantidad de memoria para archivos grandes. La propuesta de myserver.go es rápida y consume aproximadamente 2 MB en lugar de 5 GB de memoria, antes de comenzar a intercambiarse y volverse realmente lenta.
daniel
2
Entonces, a partir de noviembre de 2019, parece que el servidor http se ha roto para los usuarios de Windows durante varios meses. Muchas de sus dependencias están desactualizadas. Uno de ellos, extático, ahora está abandonado, por lo que no está claro cuándo o si se solucionará. Busqué arreglarme, pero tampoco está claro si los desarrolladores tomarán relaciones públicas. Entonces, escribí mi propio reemplazo .
Gman el
106

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

un motor de red controlado por eventos escrito en Python y licenciado bajo la licencia MIT de código abierto.

Es multiplataforma y se preinstaló en OS X 10.5 a 10.12. Entre otras cosas, puede iniciar un servidor web simple en el directorio actual con:

twistd -no web --path=.

Detalles

Explicación de las opciones (ver twistd --helpmás):

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

"web" es un comando que ejecuta un servidor web simple en la parte superior del motor asincrónico Twisted. También acepta opciones de línea de comando (después del comando "web" - ver twistd web --helpmás):

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

También hay muchos otros comandos como:

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

Instalación

Ubuntu

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

Mac OS-X (viene preinstalado en 10.5 - 10.12, o está disponible en MacPorts y a través de Pip)

sudo port install py-twisted

Ventanas

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

HTTPS

Twisted también puede utilizar certificados de seguridad para cifrar la conexión. Use esto con sus opciones existentes --pathy --port(para HTTP simple).

twistd -no web -c cert.pem -k privkey.pem --https=4433
Peter Gibson
fuente
55
A menos que ya tenga node.js configurado, este es el más conveniente. ¡Gracias por compartir!
Chris J
3
En Ubuntu, sudo apt-get install python-twisted-webprimero tienes que hacerlo . (Gracias por esta respuesta, es muy conveniente!)
nkorth
2
Una ventaja especial del servidor retorcido de una línea es que admite descargas reanudables (soporte de rango de bytes), y esa es una característica imprescindible cuando se descargan archivos grandes.
Pankaj
77
el uso de node no transmitió video / audio correctamente para mí, ¡pero usar twistd funciona muy bien!
mareado
2
Puede configurar puertos y obtener otras opciones usando twistd --helpy twistd web --help. Me tomó un tiempo entender eso.
Ehtesh Choudhury
30

1.0 incluye un servidor http y una utilidad para servir archivos con algunas líneas de código.

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

Ejecute esta fuente usando go run myserver.goo para construir un ejecutablego build myserver.go

pd40
fuente
Gran respuesta. Esto se ejecuta más rápido que la solución SimpleHTTPServer y nodejs. :) ¿Hay alguna forma de agregar nombre de usuario y contraseña a la descarga?
Ajax
21

Pruebe webfs , es pequeño y no depende de tener instalada una plataforma como node.js o python.

Hudon
fuente
1
parece que tienes que compilarlo? No vi ningún binario para descargar.
BrainSlugs83
2
Sí, a menos que tu distribución lo tenga. Debian y Ubuntu lo tienen:apt-get install webfs
Hudon
44
Hice un brew install webfsen mi Mac que resultó en 🍺 /usr/local/Cellar/webfs/1.21: 5 files, 96K, built in 15 seconds. Después podría decir webfsd -F -p 3003 -r resources/public/ -f index.htmlque logre lo mismo que twistd -no web -p 3003 --path=resources/public/. Es un poco extenso, así que no es obvio para recordarlo, pero es bueno saberlo como una alternativa a twistd o SimpleHTTPServer.
onetom
Mucho mejor que las otras soluciones. Es muy pequeño, muy rápido y se proporciona como un paquete de sistema operativo. También es compatible con SSL y puede ejecutarse como un demonio del sistema.
Federico
14

Si usa Mercurial, puede usar el servidor HTTP incorporado. En la carpeta que desea servir:

hg serve

De los documentos :

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
fuente
8

También considere devd un pequeño servidor web escrito en go. Los binarios para muchas plataformas están disponibles aquí .

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

Es pequeño, rápido y proporciona algunas características opcionales interesantes, como la recarga en vivo cuando cambian los archivos.

gman
fuente
7

Encontré python -m http.serverpoco confiable: algunas respuestas tomarían segundos.

Ahora uso un servidor llamado Ran https://github.com/m3ng9i/ran

Ran: un servidor web estático simple escrito en Go

Coronel Panic
fuente
5

probar polpetta ...

npm install -g polpetta

entonces tú puedes

polpetta ~ / carpeta

y estás listo para ir :-)

Andrea Giammarchi
fuente
1
¿Puedes explicar por qué deberíamos probar Polpetta ?
Dan Dascalescu
3

Usando Servez como servidor

  1. Descargar Servez
  2. Instalarlo, ejecutarlo
  3. Elija la carpeta para servir
  4. Elige "Inicio"
  5. Vaya http://localhost:8080o seleccione "Iniciar navegador"

servez

Nota: Creé esto porque Web Server para Chrome desaparecerá, ya que Chrome está eliminando el soporte para aplicaciones y porque apoyo a los estudiantes de arte que no tienen experiencia con la línea de comandos.

gman
fuente
Estoy votando por ejecutar ejemplos de WebGL
Felipe Gutiérrez
2

Me gusta el servidor en vivo . Es rápido y tiene una buena función de recarga en vivo, que es muy conveniente durante el desarrollo.

El uso es muy simple:

cd ~/Sites/
live-server

Por defecto, crea un servidor con IP 127.0.0.1 y el puerto 8080.

http://127.0.0.1:8080/

Si el puerto 8080 no es libre, usa otro puerto:

http://127.0.0.1:52749/

http://127.0.0.1:52858/

Si necesita ver el servidor web en otras máquinas en su red local, puede verificar cuál es su IP y usar:

live-server --host=192.168.1.121

Y aquí hay un script que toma automáticamente la dirección IP de la interfaz predeterminada. Funciona solo en macOS .

Si lo coloca .bash_profile, el live-servercomando iniciará automáticamente el servidor con la IP correcta.

# **
# 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
fuente
1

Si tiene PHP instalado, puede usar el servidor incorporado.

php -S 0:8080
usuario1461607
fuente
0

Otro servidor de línea de comandos simple basado en nodos

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

Escrito en parte en respuesta a que el servidor http tiene problemas, particularmente en Windows.

instalación

Instale node.js entonces

npm install -g servez

uso

servez [options] [path]

Sin ruta sirve a la carpeta actual.

Por defecto sirve index.htmlpara rutas de carpeta si existe. Sirve una lista de directorios para carpetas de lo contrario. También sirve encabezados CORS. Opcionalmente, puede activar la autenticación básica con --username=somename --password=somepassy puede servir https.

gman
fuente