Python'un http.server (veya SimpleHTTPServer) 'a daha hızlı bir alternatif nedir?


300

Python'un http.server'ı (veya Python 2 için SimpleHTTPServer), geçerli dizinin içeriğini komut satırından sunmanın harika bir yoludur:

python -m http.server

Ancak, web sunucuları gittikçe, çok slooooow ...

Tek iş parçacıklı gibi davranır ve bazen JavaScript AMD modüllerini RequireJS kullanarak yüklerken zaman aşımı hatalarına neden olur. Görüntü içermeyen basit bir sayfanın yüklenmesi beş ila on saniye sürebilir.

Bu kadar kullanışlı olan daha hızlı bir alternatif nedir?


17
Bu konu benim aklıma yeni geldi. SimpleHTTPServer kullanıyordum ve beni deli eden RequireJS ile rastgele hatalar alıyordum! düğümün http sunucusu bir cazibe gibi çalışıyor. Teşekkürler!
Dave Cadwallader

4
@ChrisF, sorunun aslında cevaplanabilir bir soru olduğu gerçeğini daha gramer biçimde yansıtmak için soruyu bu kılavuza göre düzenledim . Karşılaştığım problemi açıkladım (zaman aşımları ve zaman israfı) ve herhangi bir alternatif bilmediğim için sorunu çözmek için ne yaptığımı listeleyemedim. Kriterler açıkça tanımlandığı için bu sorunun "En sevdiğiniz ___ '' şekline uyduğunu sanmıyorum. Farklı ziyaretçiler farklı cevapları daha yararlı bulabilir ve cevaplar verilen kriterlere uymayabilir.
Drew Noakes

26
SO'nun insanların en sevdiği soruları kapatma alışkanlığı nasıl olduğunu sevin…
isomorphismes

4
Bu soru sadece yararlı olmakla kalmaz, aynı zamanda kapatıldığı tanımla da eşleşmez. En azından araştırma zaten yapıldı ...
Bryan Larson

3
Bir git repo sunmak istiyorsanız, başka bir seçenek git instaweb.
Drew Noakes

Yanıtlar:


394

node.js için http sunucusu çok kullanışlıdır ve Python'un SimpleHTTPServer'ından çok daha hızlıdır. Bunun başlıca nedeni, isteklerin serileştirilmesi yerine, isteklerin eşzamanlı olarak işlenmesi için asenkron IO kullanmasıdır.

Kurulum

Henüz yapmadıysanız node.js dosyasını yükleyin. Ardından npm, paketi -gyüklemek için genel olarak yükleme seçeneğini kullanarak düğüm paketi yöneticisini ( ) kullanın . Windows'daysanız, yönetici izinleri ile ilgili bir bilgi istemine ihtiyacınız olacak ve Linux / OSX'de sudoşu komutu isteyeceksiniz :

npm install http-server -g

Bu, gerekli bağımlılıkları indirecek ve yükleyecektir http-server.

kullanım

Şimdi, herhangi bir dizinden şunu yazabilirsiniz:

http-server [path] [options]

Yol isteğe bağlıdır, ./publicvarsa varsayılan olarak yapılır ./.

Seçenekler [varsayılan]:

  • -p Dinlenecek port numarası [8080]
  • -a [Localhost] 'a bağlanacak ana bilgisayar adresi
  • -i Dizin dizini sayfalarını göster [Doğru]
  • -sveya --silentSessiz mod konsola oturum açmaz
  • -hveya --helpYardım mesajını görüntüler ve çıkar

8000 numaralı bağlantı noktasında geçerli dizini sunmak için şunu yazın:

http-server -p 8000

12
Bu harika !! Bu konuya işaret ettiğiniz için teşekkür ederiz. Python sunucusunun hiç iyi işlemediği görünen bir ses / video akışını test etmek için harika.
gman

1
@Salmonface, -gseçeneği kesinlikle kullandınız ve kurulum sırasında hiçbir hatanın yazdırılmadığından emin misiniz? Bu hata sadece kurulumdan sonra bulunamayacağı anlamına gelir, bu da işler iyi gittiğinde görünmez. Hangi platformdasın? Adında bir dosya bulmak için sürücünüzde bir find komutu çalıştırın http-server. Bunu birkaç farklı Linux dağıtımında ve Windows sürümünde başarıyla kullandım.
Drew Noakes

2
Sadece bu çözümü kullanmanın sayfa yükleme süremi 20s'den 2s'ye yükselttiğini doğrulamak istiyorum!
0leg

1
İlk başta, ben bellek bitene kadar SimpleHTTPServer python üzerinde bir gelişme oldu. http-server büyük dosyalar için büyük miktarda bellek tüketir. Myserver.go teklifi hızlıdır ve takas etmeye ve gerçekten yavaşlamaya başlamadan önce 5 GB Bellek yerine yaklaşık 2 MB tüketir.
daniel

2
Kasım 2019'dan itibaren, http-server Windows kullanıcıları için birkaç aydır bozuldu gibi görünüyor. Bağımlılıklarının çoğu güncel değil. Bunlardan biri, kendinden geçmiş, şimdi terk edildi, bu yüzden ne zaman düzeltileceğini veya düzeltileceğini net değil. Kendimi düzeltmeye baktım, ancak geliştiricilerin PR alıp almayacağı da belli değil. Bu yüzden kendi yerine yazdım .
gman

106

Tavsiye ederim: Bükülmüş ( http://twistedmatrix.com )

Python ile yazılmış ve açık kaynak kodlu MIT lisansı altında lisanslanmış olay güdümlü bir ağ motoru.

Platformlar arasıdır ve OS X 10.5 - 10.12'ye önceden kurulmuştur. Diğer şeylerin yanı sıra, geçerli dizinde basit bir web sunucusu başlatabilirsiniz:

twistd -no web --path=.

ayrıntılar

Seçeneklerin Açıklaması ( twistd --helpdaha fazla bilgi için bakınız ):

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

"web", Twisted async motorunun üstünde basit bir web sunucusu çalıştıran bir Komuttur. Ayrıca komut satırı seçeneklerini de kabul eder ("web" komutundan sonra - twistd web --helpdaha fazla bilgi için bakın ):

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

Ayrıca, aşağıdakiler gibi bir dizi başka komut da vardır:

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

Kurulum

Ubuntu

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

Mac OS-X (10.5 - 10.12'de önceden yüklenmiş olarak gelir veya MacPorts ve Pip aracılığıyla edinilebilir)

sudo port install py-twisted

pencereler

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

HTTPS

Twisted, bağlantıyı şifrelemek için güvenlik sertifikaları da kullanabilir. Bunu mevcut --pathve --port(düz HTTP için) seçeneklerinizle birlikte kullanın.

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

5
Zaten node.js kurulumu yapmadıysanız, bunu en uygun buldum. Paylaşım için teşekkürler!
Chris J

3
Ubuntu'da sudo apt-get install python-twisted-webönce yapmanız gerekir . (Bu cevap için teşekkürler, çok uygun!)
nkorth

2
Bükülmüş bir hat sunucusunun özel bir avantajı, devam ettirilebilir indirmeleri (bayt aralığı desteği) destekler ve büyük dosyaları indirirken bu bir özellik olmalıdır.
Pankaj

7
düğüm kullanarak benim için düzgün video / ses akışı vermedi, twistd kullanarak olsa harika çalışıyor!
13:13

2
Sen bağlantı noktalarını yapılandırma ve kullanan diğer seçenekleri alabilirsiniz twistd --helpve twistd web --help. Bunu çözmem için biraz zamanımı aldı.
Ehtesh Choudhury

30

1.0, birkaç kod satırı içeren dosyaları sunmak için bir http sunucusu ve util içerir .

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

go run myserver.goYürütülebilir bir dosya oluşturmak için veya tuşunu kullanarak bu kaynağı çalıştırıngo build myserver.go


Mükemmel cevap. Bu, SimpleHTTPServer ve nodejs çözümünden daha hızlı çalışır. :) İndirmeye kullanıcı adı ve şifre eklememin bir yolu var mı?
Ajax

21

Webfs'i deneyin , küçük ve node.js veya python gibi bir platforma sahip olmasına bağlı değil.


1
derlemek zorunda gibi görünüyor? İndirilecek herhangi bir ikili dosya görmedim.
BrainSlugs83

2
evet, dağıtımınızda yoksa. Debian ve Ubuntu'da:apt-get install webfs
Hudon

4
Mac'imde bir brew install webfssonuç aldım 🍺 /usr/local/Cellar/webfs/1.21: 5 files, 96K, built in 15 seconds. Daha sonra webfsd -F -p 3003 -r resources/public/ -f index.htmlaynı şeyi başarmayı söyleyebilirim twistd -no web -p 3003 --path=resources/public/. Biraz garip hatırlanması açık değil ama twistd veya SimpleHTTPServer'a alternatif olarak bilmek iyi.
onetom

Diğer çözümlerden çok daha iyi. Çok küçük, çok hızlı ve bir işletim sistemi paketi olarak sağlandı. Ayrıca SSL'yi destekler ve bir sistem arka plan programı olarak çalışabilir.
Federico

14

Mercurial kullanıyorsanız, yerleşik HTTP sunucusunu kullanabilirsiniz. Sunmak istediğiniz klasörde:

hg serve

Gönderen docs :

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

Ayrıca devd yazılmış küçük bir web sunucusu düşünün . Birçok platform için ikili dosyalar burada mevcuttur .

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

Küçük, hızlıdır ve dosyalarınız değiştiğinde canlı yeniden yükleme gibi bazı ilginç isteğe bağlı özellikler sunar.




3

Servez'i sunucu olarak kullanma

  1. İndir Servez
  2. Kur, Çalıştır
  3. Sunulacak klasörü seçin
  4. "Başlat" ı seçin
  5. http://localhost:8080"Tarayıcıyı Başlat" a gidin veya seçin

servez

Not: Chrome, uygulamalar için desteği kaldırdığı için Chrome için Web Sunucusu kullanımdan kaldırıldığı ve komut satırıyla sıfır deneyimi olan sanat öğrencilerini desteklediğim için bunu bir araya getirdim


WebGL örneklerini çalıştırmak için oy kullanıyorum
Felipe Gutierrez

2

Canlı sunucuyu severim . Hızlıdır ve geliştirme sırasında çok uygun olan güzel bir canlı yeniden yükleme özelliğine sahiptir.

Kullanımı çok basit:

cd ~/Sites/
live-server

Varsayılan olarak IP 127.0.0.1 ve 8080 numaralı bağlantı noktasına sahip bir sunucu oluşturur.

http://127.0.0.1:8080/

8080 numaralı bağlantı noktası ücretsiz değilse, başka bir bağlantı noktası kullanır:

http://127.0.0.1:52749/

http://127.0.0.1:52858/

Web sunucusunu yerel ağınızdaki diğer makinelerde görmeniz gerekiyorsa IP'nizin ne olduğunu kontrol edebilir ve kullanabilirsiniz:

live-server --host=192.168.1.121

Ve burada varsayılan arayüzün IP adresini otomatik olarak alan bir komut dosyası. Yalnızca macOS üzerinde çalışır .

Eğer koyarsanız .bash_profile, live-serverkomut sunucuyu otomatik olarak doğru IP ile başlatır.

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


0

Yine başka bir düğüm tabanlı basit komut satırı sunucusu

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

Kısmen http-server sorunlarına yanıt olarak, özellikle pencerelerde yazılmıştır.

Kurulum

Node.js dosyasını yükleyin ve ardından

npm install -g servez

kullanım

servez [options] [path]

Hiçbir yol olmadan geçerli klasöre hizmet eder.

Varsayılan olarak, index.htmlvarsa klasör yolları için hizmet eder . Aksi takdirde klasörler için bir dizin listesi sunar. Ayrıca CORS başlıklarına da hizmet eder. İsteğe bağlı olarak temel kimlik doğrulamayı ile açabilir --username=somename --password=somepassve https sunabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.