O que é uma alternativa mais rápida ao http.server do Python (ou SimpleHTTPServer)?

300

O http.server do Python (ou SimpleHTTPServer para Python 2) é uma ótima maneira de servir o conteúdo do diretório atual na linha de comando:

python -m http.server

No entanto, no que diz respeito aos servidores web, é muito slooooow ...

Ele se comporta como se tivesse um único encadeamento e, ocasionalmente, causa erros de tempo limite ao carregar os módulos AMD JavaScript usando o RequireJS. Pode levar de cinco a dez segundos para carregar uma página simples sem imagens.

O que é uma alternativa mais rápida e conveniente?

Drew Noakes
fonte
17
Esta discussão apenas restaurou minha sanidade. Eu estava usando o SimpleHTTPServer e obtendo erros aleatórios com o RequireJS que estavam me deixando louco! O servidor http do nó está funcionando como um encanto. Obrigado!
precisa
4
@ ChrisF, editei a pergunta de acordo com esta diretriz para refletir gramaticalmente o fato de que essa é realmente uma pergunta respondível. Expliquei o problema que enfrentei (a saber, tempos limite e tempo perdido) e não pude listar o que havia feito para solucionar o problema porque não conhecia nenhuma alternativa. Acho que essa pergunta não se enquadra na forma "Qual é o seu ___ favorito", pois os critérios estão claramente definidos. Visitantes diferentes podem achar respostas diferentes mais úteis, e as respostas podem não se adequar aos critérios fornecidos.
de Drew Noakes
26
Amor como SO tem o hábito de fechar perguntas favoritas das pessoas ...
isomorphismes
4
Esta pergunta não é apenas útil, mas também não corresponde à descrição para a qual está sendo fechada. Pelo menos, a pesquisa já foi feito ...
Bryan Larson
3
Outra opção, se você deseja servir um repositório Git, é git instaweb.
de Drew Noakes

Respostas:

394

O servidor http para node.js é muito conveniente e muito mais rápido que o SimpleHTTPServer do Python. Isso ocorre principalmente porque ele usa E / S assíncronas para manipulação simultânea de solicitações, em vez de serializar solicitações.

Instalação

Instale o node.js se você ainda não o fez. Em seguida, use o gerenciador de pacotes do nó ( npm) para instalar o pacote, usando a -gopção para instalar globalmente. Se você estiver no Windows, precisará de um prompt com permissões de administrador e, no Linux / OSX, desejará sudoo comando:

npm install http-server -g

Isso fará o download de todas as dependências necessárias e a instalação http-server.

Usar

Agora, em qualquer diretório, você pode digitar:

http-server [path] [options]

O caminho é opcional, padronizando ./publicse existir, caso contrário ./.

As opções são [padrões]:

  • -p O número da porta a ser ouvida [8080]
  • -a O endereço do host a ser vinculado ao [localhost]
  • -i Exibir páginas de índice de diretório [True]
  • -s--silentmodo silencioso ou não registrará no console
  • -hou --helpExibe mensagem de ajuda e sai

Portanto, para servir o diretório atual na porta 8000, digite:

http-server -p 8000
Drew Noakes
fonte
12
Isso é incrível!! Obrigado por apontar. É ótimo para testar streaming de áudio / vídeo, algo que o servidor python não parece lidar bem.
gman
1
@ Salmonface, você definitivamente usou a -gopção e garantiu que nenhum erro fosse impresso durante a instalação? Esse erro significa apenas que não pode ser encontrado após a instalação, o que parece improvável se tudo correr bem. Em que plataforma você está? Execute um comando find em sua unidade para encontrar um arquivo com o nome http-server. Eu usei isso com sucesso em algumas distros diferentes do Linux e versões do Windows.
Drew Noakes
2
Eu só quero confirmar que o uso desta solução melhorou o tempo de carregamento da página de 20 para 2 segundos!
perna
1
Bem, no começo foi uma melhoria em relação ao python SimpleHTTPServer até que fiquei sem memória. O servidor http consome uma quantidade enorme de memória para arquivos grandes. A proposta do myserver.go é rápida e consome apenas 2 MB em vez de 5 GB de memória, antes de começar a trocar e ficar muito lenta.
Daniel
2
Portanto, a partir de novembro de 2019, parece que o servidor http foi quebrado para usuários do Windows por vários meses. Muitas de suas dependências estão desatualizadas. Um deles, em êxtase, agora está abandonado, para que não fique claro quando ou se será corrigido. Eu olhei para me consertar, mas também não está claro se os desenvolvedores aceitarão PRs. Então, eu escrevi meu próprio substituto .
gman
106

Eu recomendo: Twisted ( http://twistedmatrix.com )

um mecanismo de rede orientado a eventos, escrito em Python e licenciado sob a licença MIT de código aberto.

É multiplataforma e foi pré-instalado no OS X 10.5 a 10.12. Entre outras coisas, você pode iniciar um servidor Web simples no diretório atual com:

twistd -no web --path=.

Detalhes

Explicação das opções (veja twistd --helppara mais informações):

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

"web" é um comando que executa um servidor web simples em cima do mecanismo assíncrono Twisted. Também aceita opções de linha de comando (após o comando "web" - veja twistd web --helppara mais):

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

Há também vários outros 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

Instalação

Ubuntu

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

Mac OS-X (vem pré-instalado nas versões 10.5 - 10.12 ou está disponível no MacPorts e no Pip)

sudo port install py-twisted

janelas

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

HTTPS

O Twisted também pode utilizar certificados de segurança para criptografar a conexão. Use isso com as opções existentes --pathe --port(para HTTP simples).

twistd -no web -c cert.pem -k privkey.pem --https=4433
Peter Gibson
fonte
5
A menos que você já tenha o node.js configurado, achei o mais conveniente. Obrigado por compartilhar!
Chris J
3
No Ubuntu, você precisa sudo apt-get install python-twisted-webprimeiro. (Obrigado por esta resposta, é muito conveniente!)
nkorth
2
Uma vantagem especial do servidor de uma linha trançada: ele suporta downloads recuperáveis ​​(suporte à faixa de bytes) e é necessário ter um recurso ao baixar arquivos grandes.
Pankaj
7
usando o nó não transmitiu vídeo / áudio corretamente para mim, usando o twistd funciona muito bem!
dizy
2
Você pode configurar portas e obter outras opções usando twistd --helpe twistd web --help. Levei um tempo para descobrir isso.
Ehtesh Choudhury
30

1.0 inclui um servidor http & util para servir arquivos com algumas linhas 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)
    }
}

Execute esta fonte usando go run myserver.goou para criar um arquivo executávelgo build myserver.go

pd40
fonte
Ótima resposta. Isso é executado mais rapidamente que a solução SimpleHTTPServer e nodejs. :) Existe alguma maneira de adicionar nome de usuário e senha ao download?
Ajax
21

Experimente os webfs , é pequeno e não depende de ter uma plataforma como node.js ou python instalada.

Hudon
fonte
1
parece que você precisa compilá-lo? Não encontrou binários para download.
precisa saber é o seguinte
2
sim, a menos que sua distribuição o tenha. O Debian e o Ubuntu possuem:apt-get install webfs
Hudon 04/04
4
Eu fiz um brew install webfsno meu Mac, o que resultou 🍺 /usr/local/Cellar/webfs/1.21: 5 files, 96K, built in 15 seconds. Depois, eu poderia dizer apenas webfsd -F -p 3003 -r resources/public/ -f index.htmlpara conseguir o mesmo que twistd -no web -p 3003 --path=resources/public/. É um pouco prolixo, por isso não é óbvio para lembrar, mas é bom saber como uma alternativa ao twistd ou SimpleHTTPServer.
OnDec
Muito melhor que as outras soluções. É muito pequeno, muito rápido e fornecido como um pacote de SO. Ele também suporta SSL e pode ser executado como um daemon do sistema.
Federico
14

Se você usa o Mercurial, pode usar o servidor HTTP incorporado. Na pasta que você deseja exibir:

hg serve

Dos 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
fonte
8

Considere também o devd, um pequeno servidor da Web escrito em go. Binários para muitas plataformas estão disponíveis aqui .

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

É pequeno, rápido e oferece alguns recursos opcionais interessantes, como recarga ao vivo quando os arquivos são alterados.

gman
fonte
7

Achei python -m http.servernão confiável - algumas respostas levariam segundos.

Agora eu uso um servidor chamado Ran https://github.com/m3ng9i/ran

Ran: um servidor Web estático simples, escrito em Go

Coronel Panic
fonte
5

experimente o polpetta ...

npm install -g polpetta

então você pode

pasta ~ / polpetta

e você está pronto para ir :-)

Andrea Giammarchi
fonte
1
Você pode expandir sobre por que devemos dar polpetta uma tentativa?
Dan Dascalescu 26/01/19
3

Usando Servez como servidor

  1. Baixar Servez
  2. Instale, execute
  3. Escolha a pasta para servir
  4. Escolha "Iniciar"
  5. Vá para http://localhost:8080ou escolha "Iniciar navegador"

servez

Nota: juntei isso porque o Web Server para Chrome está desaparecendo, pois o Chrome está removendo o suporte para aplicativos e porque eu apoio estudantes de arte que não têm experiência com a linha de comando

gman
fonte
Eu estou votando para executar exemplos WebGL
Felipe Gutierrez
2

Eu gosto de servidor ao vivo . É rápido e possui um bom recurso de recarga ao vivo, o que é muito conveniente durante o desenvolvimento.

O uso é muito simples:

cd ~/Sites/
live-server

Por padrão, ele cria um servidor com IP 127.0.0.1 e porta 8080.

http://127.0.0.1:8080/

Se a porta 8080 não estiver livre, ela usará outra porta:

http://127.0.0.1:52749/

http://127.0.0.1:52858/

Se você precisar ver o servidor da Web em outras máquinas na sua rede local, poderá verificar qual é o seu IP e usar:

live-server --host=192.168.1.121

E aqui está um script que pega automaticamente o endereço IP da interface padrão. Funciona apenas no macOS .

Se você o inserir .bash_profile, o live-servercomando iniciará automaticamente o servidor com o IP correto.

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

Se você tiver o PHP instalado, poderá usar o servidor interno.

php -S 0:8080
user1461607
fonte
0

Ainda outro servidor de linha de comando simples baseado em nó

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

Escrito parcialmente em resposta ao servidor http com problemas, principalmente no Windows.

instalação

Instale o node.js então

npm install -g servez

uso

servez [options] [path]

Sem caminho, ele serve a pasta atual.

Por padrão, ele serve index.htmlpara caminhos de pasta, se existir. Serve uma listagem de diretórios para pastas caso contrário. Ele também serve cabeçalhos CORS. Opcionalmente, você pode ativar a autenticação básica --username=somename --password=somepasse pode servir https.

gman
fonte