Jaka jest szybsza alternatywa dla http.server (lub SimpleHTTPServer) Pythona?

300

Serwer http Pythona (lub SimpleHTTPServer dla Pythona 2) to świetny sposób na podanie zawartości bieżącego katalogu z wiersza poleceń:

python -m http.server

Jednak jeśli chodzi o serwery WWW, jest to bardzo powolne ...

Zachowuje się tak, jakby był jednowątkowy i czasami powoduje błędy przekroczenia limitu czasu podczas ładowania modułów JavaScript AMD przy użyciu RequireJS. Załadowanie prostej strony bez zdjęć może zająć od pięciu do dziesięciu sekund.

Jaka jest szybsza alternatywa, która jest równie wygodna?

Drew Noakes
źródło
17
Ten wątek właśnie przywrócił mi zdrowie psychiczne. Korzystałem z SimpleHTTPServer i otrzymywałem przypadkowe błędy w RequireJS, które doprowadzały mnie do szału! Serwer HTTP węzła działa jak urok. Dzięki!
Dave Cadwallader,
4
@ChrisF, zredagowałem pytanie zgodnie z tymi wytycznymi, aby gramatycznie odzwierciedlić fakt, że jest to pytanie , na które można odpowiedzieć. Wyjaśniłem problem, z którym się spotkałem (a mianowicie limity czasu i zmarnowany czas) i nie mogłem wymienić tego, co zrobiłem, aby rozwiązać problem, ponieważ nie znałem żadnych alternatyw. Nie sądzę, aby to pytanie pasowało do kształtu „Jaki jest twój ulubiony ___”, ponieważ kryteria są jasno określone. Różni odwiedzający mogą uznać różne odpowiedzi za bardziej przydatne, a odpowiedzi mogą nie spełniać podanych kryteriów.
Drew Noakes,
26
Uwielbiam, jak SO ma w zwyczaju zamykać ulubione pytania ludzi…
izomorfizm
4
To pytanie jest nie tylko przydatne, ale także nie pasuje do opisu, dla którego jest zamykane. Przynajmniej badania zostały już przeprowadzone ...
Bryan Larson
3
Inną opcją, jeśli chcesz obsłużyć repozytorium git, jest git instaweb.
Drew Noakes,

Odpowiedzi:

394

Serwer http dla node.js jest bardzo wygodny i jest znacznie szybszy niż SimpleHTTPServer Pythona. Jest tak przede wszystkim dlatego, że wykorzystuje asynchroniczne operacje we / wy do równoczesnej obsługi żądań zamiast szeregowania żądań.

Instalacja

Zainstaluj node.js, jeśli jeszcze tego nie zrobiłeś. Następnie użyj menedżera pakietów węzłów ( npm), aby zainstalować pakiet, korzystając z -gopcji instalacji globalnej. Jeśli korzystasz z systemu Windows, potrzebujesz monitu z uprawnieniami administratora, a w systemie Linux / OSX będziesz chciał wykonać sudopolecenie:

npm install http-server -g

Spowoduje to pobranie wszystkich wymaganych zależności i instalację http-server.

Posługiwać się

Teraz z dowolnego katalogu możesz wpisać:

http-server [path] [options]

Ścieżka jest opcjonalna, domyślnie ./publicjeśli istnieje, w przeciwnym razie ./.

Opcje to [domyślne]:

  • -p Numer portu do nasłuchiwania [8080]
  • -a Adres hosta do powiązania z [localhost]
  • -i Wyświetl strony indeksu katalogu [True]
  • -slub --silenttryb cichy nie zaloguje się do konsoli
  • -hlub --helpWyświetla komunikat pomocy i wychodzi

Aby więc obsłużyć bieżący katalog na porcie 8000, wpisz:

http-server -p 8000
Drew Noakes
źródło
12
To jest niesamowite!! Dziękujemy za zwrócenie na to uwagi. Doskonale nadaje się do testowania przesyłania strumieniowego audio / wideo, co wydaje się być czymś, co nie wydaje się, aby serwer python w ogóle dobrze sobie radził.
gman
1
@ Salmonface, czy na pewno skorzystałeś z tej -gopcji i upewniłeś się, że podczas instalacji nie zostały wydrukowane żadne błędy? Ten błąd oznacza po prostu, że nie można go znaleźć po instalacji, co wydaje się mało prawdopodobne, jeśli wszystko pójdzie dobrze. Na jakiej platformie jesteś? Uruchom polecenie find na swoim dysku, aby znaleźć plik o nazwie http-server. Z powodzeniem wykorzystałem to w kilku różnych dystrybucjach Linuksa i wersjach Windows.
Drew Noakes,
2
Chcę tylko potwierdzić, że użycie tego rozwiązania poprawiło mój czas ładowania strony z 20 do 2 sekund!
0leg
1
Cóż, na początku była to poprawa w stosunku do Pythona SimpleHTTPServer, dopóki nie zabrakło mi pamięci. Serwer http zużywa ogromną ilość pamięci na duże pliki. Propozycja myserver.go jest szybka i zużywa zaledwie około 2 MB zamiast 5 GB pamięci, zanim zacznie się zamieniać i robi się naprawdę wolna.
Daniel
2
Tak więc od listopada 2019 r. Wygląda na to, że serwer HTTP został zepsuty dla użytkowników systemu Windows od kilku miesięcy. Wiele jego zależności jest już nieaktualnych. Jeden z nich, ekstatyczny, jest teraz porzucony, więc nie jest jasne, kiedy i czy zostanie naprawiony. Chciałem się naprawić, ale nie jest też jasne, czy deweloperzy wezmą PR. Napisałem więc własnego zastępcę .
gman
105

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

oparty na zdarzeniach silnik sieciowy napisany w Pythonie i licencjonowany na licencji MIT typu open source.

Jest wieloplatformowy i został wstępnie zainstalowany w systemie OS X od 10.5 do 10.12. Między innymi możesz uruchomić prosty serwer WWW w bieżącym katalogu za pomocą:

twistd -no web --path=.

Detale

Objaśnienie opcji ( twistd --helpwięcej informacji):

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

„web” to polecenie, które działa na prostym serwerze WWW na silniku asynchronicznym Twisted. Akceptuje również opcje wiersza poleceń (po poleceniu „web” - twistd web --helpwięcej informacji):

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

Istnieje również kilka innych poleceń, takich jak:

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

Instalacja

Ubuntu

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

Mac OS-X (jest fabrycznie zainstalowany w wersji 10.5 - 10.12 lub jest dostępny w MacPorts i przez Pip)

sudo port install py-twisted

Windows

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

HTTPS

Twisted może również wykorzystywać certyfikaty bezpieczeństwa do szyfrowania połączenia. Użyj tego z istniejącymi opcjami --pathi --port(dla zwykłego HTTP).

twistd -no web -c cert.pem -k privkey.pem --https=4433
Peter Gibson
źródło
5
Jeśli nie masz już skonfigurowanego node.js, uważam, że jest to najwygodniejszy sposób. Dzięki za udostępnienie!
Chris J
3
W systemie Ubuntu musisz sudo apt-get install python-twisted-webnajpierw. (Dzięki za tę odpowiedź, jest to bardzo wygodne!)
nkorth
2
Jedną ze szczególnych zalet skręconego serwera z jedną linią, jest możliwość wznawiania pobierania (obsługa zakresu bajtów) i jest to niezbędna funkcja podczas pobierania dużych plików.
Pankaj,
7
użycie węzła nie przesyła poprawnie wideo / audio, użycie twistd działa jednak świetnie!
dizy
2
Możesz skonfigurować porty i uzyskać inne opcje za pomocą twistd --helpi twistd web --help. Zajęło mi to trochę czasu, aby to zrozumieć.
Ehtesh Choudhury,
30

1.0 zawiera serwer http i wykorzystanie do udostępniania plików z kilkoma liniami kodu.

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

Uruchom to źródło za pomocą go run myserver.golub, aby zbudować plik wykonywalnygo build myserver.go

pd40
źródło
Świetna odpowiedź. Działa to szybciej niż SimpleHTTPServer i rozwiązanie nodejs. :) Czy jest jakiś sposób, aby dodać nazwę użytkownika i hasło do pobierania?
Ajax
21

Wypróbuj webfs , jest mały i nie zależy od zainstalowania platformy takiej jak node.js lub python.

Hudon
źródło
1
wygląda na to, że musisz to skompilować? Nie widziałem żadnych plików binarnych do pobrania.
BrainSlugs83
2
tak, chyba że ma go Twoja dystrybucja. Debian i Ubuntu mają to:apt-get install webfs
Hudon
4
Zrobiłem brew install webfsna moim komputerze Mac, co spowodowało 🍺 /usr/local/Cellar/webfs/1.21: 5 files, 96K, built in 15 seconds. Potem mogę po prostu powiedzieć, webfsd -F -p 3003 -r resources/public/ -f index.htmlaby osiągnąć to samo co twistd -no web -p 3003 --path=resources/public/. To trochę trudne, więc nie jest oczywiste, aby pamiętać, ale warto wiedzieć, że jest to alternatywa dla twistd lub SimpleHTTPServer.
onetom
Znacznie lepiej niż inne rozwiązania. Jest bardzo mały, bardzo szybki i dostarczany jako pakiet systemu operacyjnego. Obsługuje również SSL i może działać jako demon systemu.
Federico
14

Jeśli używasz Mercurial, możesz użyć wbudowanego serwera HTTP. W folderze, który chcesz podać:

hg serve

Z dokumentów :

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
źródło
8

Rozważ też devd jako mały serwer WWW napisany w trybie go. Pliki binarne dla wielu platform są dostępne tutaj .

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

Jest mały, szybki i oferuje kilka interesujących opcjonalnych funkcji, takich jak przeładowywanie na żywo, gdy zmieniają się twoje pliki.

gman
źródło
7

Znalazłem python -m http.serverniewiarygodne - niektóre odpowiedzi zajęłyby sekundy.

Teraz używam serwera o nazwie Ran https://github.com/m3ng9i/ran

Ran: prosty statyczny serwer internetowy napisany w Go

Pułkownik Panika
źródło
5

wypróbuj polpetta ...

npm install -g polpetta

wtedy możesz

polpetta ~ / folder

i jesteś gotowy do pracy :-)

Andrea Giammarchi
źródło
1
Czy możesz wyjaśnić, dlaczego warto wypróbować polpetta ?
Dan Dascalescu
3

Używanie Servez jako serwera

  1. Pobierz Servez
  2. Zainstaluj, uruchom
  3. Wybierz folder do wyświetlenia
  4. Wybierz „Start”
  5. Przejdź do http://localhost:8080lub wybierz „Uruchom przeglądarkę”

servz

Uwaga: rzuciłem to razem, ponieważ serwer Web dla Chrome odchodzi, ponieważ Chrome usuwa obsługę aplikacji i ponieważ wspieram studentów sztuki, którzy nie mają doświadczenia z wierszem poleceń

gman
źródło
Głosuję za uruchomieniem przykładów WebGL
Felipe Gutierrez,
2

Lubię serwer na żywo . Jest szybki i ma ładną funkcję przeładowania na żywo, co jest bardzo wygodne podczas opracowywania.

Użycie jest bardzo proste:

cd ~/Sites/
live-server

Domyślnie tworzy serwer o IP 127.0.0.1 i porcie 8080.

http://127.0.0.1:8080/

Jeśli port 8080 nie jest wolny, używa innego portu:

http://127.0.0.1:52749/

http://127.0.0.1:52858/

Jeśli chcesz zobaczyć serwer WWW na innych komputerach w sieci lokalnej, możesz sprawdzić swój adres IP i użyć:

live-server --host=192.168.1.121

A oto skrypt, który automatycznie pobiera adres IP domyślnego interfejsu. Działa tylko w systemie macOS .

Jeśli go włożysz .bash_profile, live-serverpolecenie automatycznie uruchomi serwer z poprawnym adresem 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
źródło
1

Jeśli masz zainstalowany PHP, możesz użyć wbudowanego serwera.

php -S 0:8080
użytkownik1461607
źródło
0

Jeszcze inny oparty na węzłach prosty serwer linii poleceń

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

Napisane częściowo w odpowiedzi na problemy z serwerem http, szczególnie w systemie Windows.

instalacja

Zainstaluj następnie node.js

npm install -g servez

stosowanie

servez [options] [path]

Bez ścieżki obsługuje bieżący folder.

Domyślnie służy index.htmldo ścieżek folderów, jeśli istnieje. W przeciwnym razie służy do wyświetlania katalogu dla folderów. Służy również do nagłówków CORS. Opcjonalnie możesz włączyć uwierzytelnianie podstawowe za pomocą --username=somename --password=somepassi możesz obsługiwać protokół https.

gman
źródło