Apa alternatif yang lebih cepat untuk http.server Python (atau SimpleHTTPServer)?

300

Http.server Python (atau SimpleHTTPServer untuk Python 2) adalah cara yang bagus untuk melayani isi direktori saat ini dari baris perintah:

python -m http.server

Namun, sejauh server web pergi, itu sangat slooooow ...

Berperilaku seolah-olah itu single threaded, dan kadang-kadang menyebabkan kesalahan waktu saat memuat modul JavaScript AMD menggunakan RequireJS. Diperlukan waktu lima hingga sepuluh detik untuk memuat halaman sederhana tanpa gambar.

Apa alternatif yang lebih cepat yang nyaman?

Drew Noakes
sumber
17
Utas ini baru saja memulihkan kewarasan saya. Saya telah menggunakan SimpleHTTPServer dan mendapatkan kesalahan acak dengan RequireJS yang membuat saya gila! http-server node bekerja seperti pesona. Terima kasih!
Dave Cadwallader
4
@ChrisF, saya telah mengedit pertanyaan sesuai dengan pedoman ini untuk lebih tata bahasa mencerminkan fakta bahwa ini adalah benar-benar sebuah pertanyaan dijawab. Saya telah menjelaskan masalah yang saya hadapi (yaitu, timeout dan buang-buang waktu), dan saya tidak bisa menyebutkan apa yang telah saya lakukan untuk mengatasi masalah tersebut karena saya tidak tahu alternatif lain. Saya tidak berpikir pertanyaan ini cocok dengan bentuk "Apa favorit Anda ___", karena kriteria yang didefinisikan dengan jelas. Pengunjung yang berbeda mungkin menemukan jawaban yang berbeda lebih bermanfaat, dan jawaban mungkin tidak sesuai dengan kriteria yang diberikan.
Drew Noakes
26
Sukai bagaimana SO memiliki kebiasaan menutup pertanyaan favorit orang-orang ...
isomorfisma
4
Pertanyaan ini tidak hanya berguna, tetapi juga tidak cocok dengan deskripsi yang sedang ditutup. Setidaknya penelitian telah dilakukan ...
Bryan Larson
3
Pilihan lain, jika Anda ingin menyajikan repo git, adalah git instaweb.
Drew Noakes

Jawaban:

394

http-server untuk node.js sangat nyaman, dan jauh lebih cepat daripada SimpleHTTPServer Python. Ini terutama karena menggunakan IO yang tidak sinkron untuk penanganan permintaan secara bersamaan, alih-alih permintaan serialisasi.

Instalasi

Instal node.js jika Anda belum melakukannya. Kemudian gunakan manajer paket simpul ( npm) untuk menginstal paket, menggunakan -gopsi untuk menginstal secara global. Jika Anda menggunakan Windows, Anda akan memerlukan prompt dengan izin administrator, dan di Linux / OSX Anda akan menginginkan sudoperintah:

npm install http-server -g

Ini akan mengunduh semua dependensi yang diperlukan dan menginstal http-server.

Menggunakan

Sekarang, dari direktori mana pun, Anda dapat mengetik:

http-server [path] [options]

Path bersifat opsional, default ke ./publicjika ada, jika tidak ./.

Opsinya adalah [default]:

  • -p Nomor port untuk didengarkan pada [8080]
  • -a Alamat host untuk diikat ke [localhost]
  • -i Tampilkan halaman indeks direktori [Benar]
  • -satau --silentmode Diam tidak akan masuk ke konsol
  • -hatau --helpMenampilkan pesan bantuan dan keluar

Jadi untuk melayani direktori saat ini pada port 8000, ketik:

http-server -p 8000
Drew Noakes
sumber
12
Ini luar biasa !! terimakasih telah menunjukkan itu. Ini bagus untuk menguji streaming audio / video yang merupakan sesuatu yang tampaknya tidak ditangani dengan baik oleh server python.
GM
1
@Salmonface, apakah Anda benar-benar menggunakan -gopsi ini, dan apakah Anda memastikan tidak ada kesalahan yang dicetak selama instalasi? Kesalahan itu hanya berarti tidak dapat ditemukan setelah instalasi, yang tampaknya tidak mungkin jika semuanya berjalan dengan baik. Anda berada di platform apa? Jalankan perintah find di drive Anda untuk menemukan file dengan nama http-server. Saya telah menggunakan ini dengan sukses pada beberapa distro Linux dan versi Windows yang berbeda.
Drew Noakes
2
Saya hanya ingin mengonfirmasi bahwa menggunakan solusi ini meningkatkan waktu buka halaman dari 20-an menjadi 2-an!
0leg
1
Yah, pada awalnya itu adalah peningkatan dari python SimpleHTTPServer sampai saya kehabisan memori. http-server mengkonsumsi sejumlah besar memori untuk file besar. Proposal myserver.go cepat dan hanya menghabiskan sekitar 2 MB, bukannya 5 GB Memori, sebelum mulai bertukar dan menjadi sangat lambat.
daniel
2
Jadi pada Nov 2019 sepertinya http-server telah rusak untuk pengguna windows selama beberapa bulan. Banyak ketergantungannya sudah ketinggalan zaman. Salah satunya, gembira, sekarang ditinggalkan sehingga tidak jelas kapan atau apakah akan diperbaiki. Saya melihat ke dalam memperbaiki diri saya tetapi juga tidak jelas apakah para devs akan mengambil PR. Jadi, saya menulis pengganti saya sendiri .
GM
106

Saya sarankan: Twisted ( http://twistedmatrix.com )

mesin jaringan yang digerakkan oleh peristiwa yang ditulis dalam Python dan dilisensikan di bawah lisensi MIT sumber terbuka.

Ini lintas platform dan sudah diinstal pada OS X 10.5 hingga 10.12. Di antara hal-hal lain, Anda dapat memulai server web sederhana di direktori saat ini dengan:

twistd -no web --path=.

Detail

Penjelasan Opsi (lihat twistd --helplebih lanjut):

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

"web" adalah Perintah yang menjalankan server web sederhana di atas mesin async Twisted. Ia juga menerima opsi baris perintah (setelah perintah "web" - lihat twistd web --helplebih lanjut):

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

Ada juga banyak perintah lain seperti:

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

Instalasi

Ubuntu

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

Mac OS-X (telah diinstal sebelumnya pada 10.5 - 10.12, atau tersedia di MacPorts dan melalui Pip)

sudo port install py-twisted

Windows

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

HTTPS

Twisted juga dapat menggunakan sertifikat keamanan untuk mengenkripsi koneksi. Gunakan ini dengan opsi yang ada --pathdan --port(untuk HTTP biasa) Anda.

twistd -no web -c cert.pem -k privkey.pem --https=4433
Peter Gibson
sumber
5
Kecuali Anda sudah menyiapkan node.js, saya menemukan ini sebagai yang paling nyaman. Terima kasih telah berbagi!
Chris J
3
Di Ubuntu, Anda harus sudo apt-get install python-twisted-webterlebih dahulu. (Terima kasih atas jawaban ini, sangat mudah!)
nkorth
2
Satu keuntungan khusus dari server satu jalur terpelintir, mendukung unduhan yang dapat dilanjutkan (dukungan rentang byte), dan itu adalah fitur yang harus dimiliki ketika Anda mengunduh file besar.
Pankaj
7
menggunakan node tidak mengalirkan video / audio dengan benar untuk saya, menggunakan twistd berfungsi dengan baik!
pusing
2
Anda dapat mengkonfigurasi port dan mendapatkan opsi lain menggunakan twistd --helpdan twistd web --help. Butuh waktu beberapa saat untuk memikirkannya.
Ehtesh Choudhury
30

1.0 termasuk server http & util untuk melayani file dengan beberapa baris kode.

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

Jalankan sumber ini menggunakan go run myserver.goatau untuk membangun yang dapat dieksekusigo build myserver.go

pd40
sumber
Jawaban yang bagus Ini berjalan lebih cepat daripada solusi SimpleHTTPServer dan nodejs. :) Apakah ada cara saya dapat menambahkan nama pengguna dan kata sandi ke unduhan?
Ajax
21

Coba webfs , ini kecil dan tidak tergantung pada memiliki platform seperti node.js atau python diinstal.

Hudon
sumber
1
Sepertinya Anda harus mengkompilasinya? Tidak melihat binari untuk diunduh.
BrainSlugs83
2
ya, kecuali distro Anda memilikinya. Debian dan Ubuntu memilikinya:apt-get install webfs
Hudon
4
Saya melakukan brew install webfsdi Mac saya yang menghasilkan 🍺 /usr/local/Cellar/webfs/1.21: 5 files, 96K, built in 15 seconds. Setelah itu saya bisa mengatakan webfsd -F -p 3003 -r resources/public/ -f index.htmluntuk mencapai yang sama dengan twistd -no web -p 3003 --path=resources/public/. Ini agak bertele-tele sehingga tidak jelas untuk diingat tetapi baik untuk diketahui sebagai alternatif untuk twistd atau SimpleHTTPServer.
onetom
Jauh lebih baik daripada solusi lainnya. Ini sangat kecil, sangat cepat dan disediakan sebagai paket OS. Ini juga mendukung SSL dan dapat dijalankan sebagai daemon sistem.
Federico
14

Jika Anda menggunakan Mercurial, Anda dapat menggunakan server HTTP bawaan. Dalam folder yang ingin Anda sajikan:

hg serve

Dari dokumen :

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

Juga pertimbangkan devd server web kecil yang ditulis di mana saja. Binari untuk banyak platform tersedia di sini .

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

Ini kecil, cepat, dan menyediakan beberapa fitur opsional yang menarik seperti live-reload ketika file Anda berubah.

gman
sumber
7

Saya menemukan python -m http.servertidak dapat diandalkan - beberapa tanggapan akan memakan waktu detik.

Sekarang saya menggunakan server bernama Ran https://github.com/m3ng9i/ran

Ran: server web statis sederhana yang ditulis dalam Go

Kolonel Panic
sumber
5

coba polpetta ...

npm instal -g polpetta

maka kamu bisa

polpetta ~ / folder

dan Anda siap untuk pergi :-)

Andrea Giammarchi
sumber
1
Bisakah Anda menjelaskan mengapa kami harus mencoba polpetta ?
Dan Dascalescu
3

Menggunakan Servez sebagai server

  1. Unduh Servez
  2. Instal, Jalankan
  3. Pilih folder untuk dilayani
  4. Pilih "Mulai"
  5. Pergi ke http://localhost:8080atau pilih "Luncurkan Browser"

servez

Catatan: Saya melemparkan ini bersama-sama karena Server Web untuk Chrome akan pergi karena Chrome menghapus dukungan untuk aplikasi dan karena saya mendukung siswa seni yang memiliki pengalaman nol dengan baris perintah

gman
sumber
Saya memberikan suara untuk menjalankan contoh
Felipe Gutierrez
2

Saya suka live-server . Cepat dan memiliki fitur isi ulang langsung yang bagus, yang sangat nyaman selama pengembangan.

Penggunaannya sangat sederhana:

cd ~/Sites/
live-server

Secara default ia membuat server dengan IP 127.0.0.1 dan port 8080.

http://127.0.0.1:8080/

Jika port 8080 tidak gratis, ia menggunakan port lain:

http://127.0.0.1==2749/

http://127.0.0.1:52858/

Jika Anda perlu melihat server web pada mesin lain di jaringan lokal Anda, Anda dapat memeriksa apa IP Anda dan gunakan:

live-server --host=192.168.1.121

Dan berikut ini adalah skrip yang secara otomatis mengambil alamat IP dari antarmuka default. Ini bekerja pada macOS saja .

Jika Anda memasukkannya ke dalam .bash_profile, live-serverperintah akan secara otomatis meluncurkan server dengan IP yang benar.

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

Jika Anda memasang PHP, Anda bisa menggunakan server builtin.

php -S 0:8080
pengguna1461607
sumber
0

Namun node lain berdasarkan server baris perintah sederhana

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

Ditulis sebagian sebagai tanggapan terhadap http-server mengalami masalah, terutama di windows.

instalasi

Instal node.js kemudian

npm install -g servez

pemakaian

servez [options] [path]

Tanpa jalur, ia melayani folder saat ini.

Secara default ini berfungsi index.htmluntuk jalur folder jika ada. Ini melayani daftar direktori untuk folder sebaliknya. Ini juga melayani header CORS. Anda bisa mengaktifkan otentikasi dasar dengan --username=somename --password=somepassdan Anda dapat melayani https.

gman
sumber