อะไรคือทางเลือกที่เร็วกว่าสำหรับ http.server ของ Python (หรือ SimpleHTTPServer)


300

http.serverของ Python (หรือ SimpleHTTPServer สำหรับ Python 2) เป็นวิธีที่ยอดเยี่ยมในการให้บริการเนื้อหาของไดเรกทอรีปัจจุบันจากบรรทัดคำสั่ง:

python -m http.server

อย่างไรก็ตามเท่าที่เว็บเซิร์ฟเวอร์ดำเนินไปมันเป็นเรื่องตลกมาก ...

มันทำงานราวกับว่ามันเป็นเธรดเดียวและบางครั้งทำให้เกิดข้อผิดพลาดการหมดเวลาเมื่อโหลดโมดูล JavaScript AMD โดยใช้ RequireJS อาจใช้เวลาห้าถึงสิบวินาทีในการโหลดหน้าง่าย ๆ โดยไม่มีภาพ

ทางเลือกที่เร็วกว่าที่สะดวกกว่านี้คืออะไร?


17
หัวข้อนี้เพิ่งคืนสติของฉัน ฉันใช้ SimpleHTTPServer และรับข้อผิดพลาดแบบสุ่มกับ RequireJS ที่ทำให้ฉันบ้า! http-server ของโหนดทำงานเหมือนมีเสน่ห์ ขอบคุณ!
Dave Cadwallader

4
@ChrisF ฉันได้แก้ไขคำถามตามแนวทางนี้เพื่อให้สะท้อนถึงความจริงทางไวยากรณ์ที่ว่านี่เป็นคำถามที่ตอบได้จริง ฉันได้อธิบายปัญหาที่ฉันเผชิญ (กล่าวคือหมดเวลาและเสียเวลา) และฉันไม่สามารถระบุสิ่งที่ฉันได้ทำไปเพื่อแก้ไขปัญหาได้เนื่องจากฉันไม่ทราบทางเลือกอื่น ฉันไม่คิดว่าคำถามนี้เหมาะกับรูปร่าง "สิ่งที่คุณชื่นชอบ ___" เนื่องจากมีการกำหนดเกณฑ์อย่างชัดเจน ผู้เข้าชมที่ต่างกันอาจพบคำตอบที่ต่างกันมีประโยชน์มากกว่าและคำตอบอาจไม่ตรงกับเกณฑ์ที่กำหนด
Drew Noakes

26
รักว่า SO นั้นมีนิสัยในการปิดคำถามที่ชื่นชอบของผู้คน…
isomorphismes

4
คำถามนี้ไม่เพียงมีประโยชน์ แต่ยังไม่ตรงกับคำอธิบายที่กำลังปิดอยู่ อย่างน้อยการวิจัยได้ทำไปแล้ว ...
ไบรอัน Larson

3
อีกตัวเลือกหนึ่งถ้าคุณต้องการที่จะให้บริการได้ repo git instawebคอมไพล์เป็น
Drew Noakes

คำตอบ:


394

http-serverสำหรับ node.js สะดวกมากและเร็วกว่า Python's SimpleHTTPServer มาก นี่เป็นหลักเนื่องจากจะใช้ IO แบบอะซิงโครนัสสำหรับการจัดการการร้องขอพร้อมกันแทนการร้องขออนุกรม

การติดตั้ง

ติดตั้ง node.js หากคุณยังไม่ได้ติดตั้ง จากนั้นใช้ node package manager ( npm) เพื่อติดตั้งแพ็กเกจโดยใช้-gตัวเลือกในการติดตั้งแบบรวม หากคุณใช้ Windows คุณจะต้องมีพรอมต์พร้อมสิทธิ์ผู้ดูแลระบบและบน Linux / OSX คุณจะต้องsudoใช้คำสั่ง:

npm install http-server -g

นี้จะดาวน์โหลดอ้างอิงใด ๆ http-serverที่จำเป็นและติดตั้ง

ใช้

ตอนนี้จากไดเรกทอรีใด ๆ คุณสามารถพิมพ์:

http-server [path] [options]

เส้นทางเป็นตัวเลือกผิดนัดถ้ามันมีอยู่แล้วเป็นอย่างอื่น./public./

ตัวเลือกคือ [ค่าเริ่มต้น]:

  • -p หมายเลขพอร์ตที่จะฟังใน [8080]
  • -a ที่อยู่โฮสต์ที่จะผูกกับ [localhost]
  • -i แสดงหน้าไดเรกทอรีดัชนี [จริง]
  • -sหรือ--silentโหมดเงียบจะไม่เข้าสู่คอนโซล
  • -hหรือ--helpแสดงข้อความช่วยเหลือและออก

ดังนั้นเพื่อให้บริการไดเรกทอรีปัจจุบันบนพอร์ต 8000 ให้พิมพ์:

http-server -p 8000

12
นี่มันเจ๋งมาก!! ขอบคุณสำหรับการชี้ให้เห็น มันยอดเยี่ยมสำหรับการทดสอบการสตรีมเสียง / วิดีโอซึ่งเป็นสิ่งที่เซิร์ฟเวอร์งูหลามดูเหมือนจะไม่สามารถใช้งานได้ดี
gman

1
@Salmonface คุณใช้-gตัวเลือกอย่างแน่นอนและคุณแน่ใจหรือไม่ว่าไม่มีข้อผิดพลาดเกิดขึ้นระหว่างการติดตั้ง ข้อผิดพลาดนั้นหมายความว่าไม่พบหลังจากการติดตั้งซึ่งไม่น่าเป็นไปได้ถ้าสิ่งต่าง ๆ ดีขึ้น คุณอยู่บนแพลตฟอร์มใด http-serverเรียกใช้คำสั่งค้นหาทั่วไดรฟ์ของคุณเพื่อหาไฟล์ที่มีชื่อ ฉันใช้สิ่งนี้ได้สำเร็จบน Linux distros และ Windows หลายเวอร์ชัน
Drew Noakes

2
ฉันแค่ต้องการยืนยันว่าการใช้โซลูชันนี้ปรับปรุงเวลาโหลดหน้าเว็บของฉันจาก 20 วินาทีเป็น 2 วินาที!
0leg

1
ตอนแรกมันเป็นการปรับปรุง python SimpleHTTPServer จนกระทั่งฉันมีหน่วยความจำไม่เพียงพอ http-server ใช้หน่วยความจำจำนวนมากสำหรับไฟล์ขนาดใหญ่ ข้อเสนอ myserver.go นั้นสิ้นเปลืองความเร็วเพียงประมาณ 2 MB แทนที่จะเป็นหน่วยความจำ 5 GB ก่อนที่จะเริ่มสลับและทำให้ช้าลงจริงๆ
daniel

2
ดังนั้น ณ เดือน พ.ย. 2562 ดูเหมือนว่าเซิร์ฟเวอร์ http ได้ถูกทำลายสำหรับผู้ใช้ windows เป็นเวลาหลายเดือน การพึ่งพาจำนวนมากนั้นล้าสมัย หนึ่งในนั้นคือความสุขที่ถูกทิ้งร้างในขณะนี้ดังนั้นจึงไม่ชัดเจนว่าจะถูกแก้ไขหรือไม่เมื่อใด ฉันมองไปที่การซ่อมตัวเอง แต่ก็ไม่ชัดเจนว่า devs นั้นจะใช้ PRs หรือไม่ ดังนั้นฉันจึงเขียนของตัวเองทดแทน
gman

105

ฉันแนะนำ: Twisted ( http://twistedmatrix.com )

เอ็นจิ้นเครือข่ายที่ขับเคลื่อนด้วยเหตุการณ์ที่เขียนใน Python และได้รับลิขสิทธิ์ภายใต้ใบอนุญาต MIT โอเพ่นซอร์ส

เป็น cross-platform และติดตั้งไว้แล้วใน OS X 10.5 ถึง 10.12 ท่ามกลางสิ่งอื่น ๆ คุณสามารถเริ่มต้นเว็บเซิร์ฟเวอร์แบบง่าย ๆ ในไดเรกทอรีปัจจุบันด้วย:

twistd -no web --path=.

รายละเอียด

คำอธิบายของตัวเลือก (ดูtwistd --helpเพิ่มเติม):

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

"web" เป็นคำสั่งที่ใช้งานเว็บเซิร์ฟเวอร์อย่างง่าย ๆ บนเอ็นจิ้น Twisted async นอกจากนี้ยังยอมรับตัวเลือกบรรทัดคำสั่ง (หลังจากคำสั่ง "เว็บ" - ดูtwistd web --helpเพิ่มเติม):

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

นอกจากนี้ยังมีคำสั่งอื่น ๆ อีกมากมายเช่น:

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

การติดตั้ง

อูบุนตู

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

Mac OS-X (ติดตั้งล่วงหน้าใน 10.5 - 10.12 หรือมีให้ใน MacPorts และผ่าน Pip)

sudo port install py-twisted

ของ windows

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

HTTPS

Twisted ยังสามารถใช้ใบรับรองความปลอดภัยเพื่อเข้ารหัสการเชื่อมต่อ ใช้สิ่งนี้กับตัวเลือกที่มีอยู่--pathและ--port(สำหรับ HTTP ธรรมดา) ของคุณ

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

5
นอกจากว่าคุณได้ตั้งค่า node.js แล้วฉันพบว่าสิ่งนี้สะดวกที่สุด ขอบคุณสำหรับการแบ่งปัน!
Chris J

3
บน Ubuntu คุณต้องsudo apt-get install python-twisted-webก่อน (ขอบคุณสำหรับคำตอบนี้สะดวกมาก!)
nkorth

2
ข้อได้เปรียบพิเศษอย่างหนึ่งของ twisted one line server สนับสนุนการดาวน์โหลดต่อ (สนับสนุนช่วงไบต์) และนั่นเป็นคุณสมบัติที่ต้องมีเมื่อคุณดาวน์โหลดไฟล์ขนาดใหญ่
Pankaj

7
การใช้โหนดไม่สตรีมวิดีโอ / เสียงอย่างถูกต้องสำหรับฉันการใช้ twistd ใช้งานได้ดีมาก!
dizy

2
คุณสามารถกำหนดค่าพอร์ตและได้รับเลือกอื่น ๆ ที่ใช้และtwistd --help twistd web --helpเอาฉันไปคิดดูสิ
Ehtesh Choudhury

30

1.0 รวมถึงเซิร์ฟเวอร์ http & util สำหรับให้บริการไฟล์ที่มีโค้ดไม่กี่บรรทัด

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.goหรือเพื่อสร้างปฏิบัติการgo build myserver.go


คำตอบที่ดี สิ่งนี้รันเร็วกว่า SimpleHTTPServer และโซลูชัน nodejs :) มีวิธีใดบ้างที่ฉันสามารถเพิ่มชื่อผู้ใช้และรหัสผ่านลงในการดาวน์โหลดได้
Ajax

21

ลองwebfsมันเล็กและไม่ได้ขึ้นอยู่กับการติดตั้งแพลตฟอร์มอย่าง node.js หรือ python


1
ดูเหมือนว่าคุณจะต้องรวบรวมมัน? ไม่เห็นไบนารีใด ๆ สำหรับการดาวน์โหลด
BrainSlugs83

2
ใช่เว้นแต่ distro ของคุณมี Debian และ Ubuntu มี:apt-get install webfs
Hudon

4
ผมbrew install webfsของฉัน Mac 🍺 /usr/local/Cellar/webfs/1.21: 5 files, 96K, built in 15 secondsซึ่งมีผลใน หลังจากนั้นฉันก็อาจจะบอกว่าเพื่อให้บรรลุเดียวกับwebfsd -F -p 3003 -r resources/public/ -f index.html twistd -no web -p 3003 --path=resources/public/มันค่อนข้างใช้คำพูดไม่ชัดเจน แต่จำได้ดีว่าเป็นทางเลือกแทน Twistd หรือ SimpleHTTPServer
onetom

ดีกว่าโซลูชันอื่น ๆ มาก มันมีขนาดเล็กมากเร็วมากและจัดให้เป็นแพ็คเกจระบบปฏิบัติการ นอกจากนี้ยังรองรับ SSL และสามารถเรียกใช้เป็น daemon ของระบบ
Federico

14

หากคุณใช้ Mercurial คุณสามารถใช้เซิร์ฟเวอร์ HTTP ในตัว ในโฟลเดอร์ที่คุณต้องการแสดง:

hg serve

จากเอกสาร :

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

11

นี่คืออีกหนึ่ง มันเป็นส่วนขยายของ Chrome

เมื่อติดตั้งแล้วคุณสามารถเปิดใช้งานได้โดยสร้างแท็บใหม่ใน Chrome และคลิกที่ปุ่มแอพใกล้ด้านบนซ้าย

มันมีกุยง่าย ๆ คลิกเลือกโฟลเดอร์จากนั้นคลิกhttp://127.0.0.1:8887ลิงก์

ป้อนคำอธิบายรูปภาพที่นี่

https://www.youtube.com/watch?v=AK6swHiPtew


8

ยังพิจารณาdevdเว็บเซิร์ฟเวอร์ขนาดเล็กที่เขียนในไป ไบนารีสำหรับหลายแพลตฟอร์มที่มีอยู่ที่นี่

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

มันมีขนาดเล็กรวดเร็วและมีคุณสมบัติเสริมที่น่าสนใจเช่นการโหลดซ้ำเมื่อไฟล์ของคุณเปลี่ยน


7

ฉันพบว่าpython -m http.serverไม่น่าเชื่อถือ - การตอบสนองบางอย่างใช้เวลาไม่กี่วินาที

ตอนนี้ฉันใช้เซิร์ฟเวอร์ชื่อ Ran https://github.com/m3ng9i/ran

Ran: เว็บเซิร์ฟเวอร์แบบคงที่เรียบง่ายที่เขียนใน Go


5

ลอง polpetta ...

npm install -g polpetta

จากนั้นคุณสามารถ

polpetta ~ / โฟลเดอร์

และคุณพร้อมที่จะไป :-)


1
คุณช่วยอธิบายได้ไหมว่าทำไมเราถึงควรลองpolpetta
Dan Dascalescu

3

ใช้ Servez เป็นเซิร์ฟเวอร์

  1. ดาวน์โหลดServez
  2. ติดตั้งเรียกใช้
  3. เลือกโฟลเดอร์ที่จะให้บริการ
  4. เลือก "เริ่มต้น"
  5. ไปที่http://localhost:8080หรือเลือก "เปิดเบราว์เซอร์"

servez

หมายเหตุ: ฉันรวมมันเข้าด้วยกันเพราะเว็บเซิร์ฟเวอร์สำหรับ Chrome กำลังจะหายไปเนื่องจากChrome กำลังลบการสนับสนุนแอปและเพราะฉันสนับสนุนนักเรียนศิลปะที่ไม่มีประสบการณ์ด้วยบรรทัดคำสั่ง


ฉันลงคะแนนเพื่อใช้งาน WebGL ตัวอย่าง
Felipe Gutierrez

2

ผมชอบสดเซิร์ฟเวอร์ มันรวดเร็วและมีคุณสมบัติโหลดสดที่ดีซึ่งสะดวกมากในระหว่างการพัฒนา

การใช้งานง่ายมาก:

cd ~/Sites/
live-server

โดยค่าเริ่มต้นจะสร้างเซิร์ฟเวอร์ที่มี IP 127.0.0.1 และพอร์ต 8080

http://127.0.0.1:8080/

หากพอร์ต 8080 ไม่ว่างจะใช้พอร์ตอื่น:

http://127.0.0.1:52749/

http://127.0.0.1:52858/

หากคุณต้องการเห็นเว็บเซิร์ฟเวอร์ในเครื่องอื่น ๆ ในเครือข่ายท้องถิ่นของคุณคุณสามารถตรวจสอบ IP ของคุณและใช้งานอะไร:

live-server --host=192.168.1.121

และนี่คือสคริปต์ที่ดึงที่อยู่ IP ของอินเทอร์เฟซเริ่มต้นโดยอัตโนมัติ มันทำงานบน MacOS เท่านั้น

หากคุณวางไว้ใน.bash_profileที่live-serverคำสั่งจะเปิดโดยอัตโนมัติเซิร์ฟเวอร์ที่มี 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'


0

อีกโหนดหนึ่งที่ใช้เซิร์ฟเวอร์บรรทัดคำสั่งธรรมดา

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

เขียนบางส่วนเพื่อตอบสนองต่อ http- เซิร์ฟเวอร์ที่มีปัญหาโดยเฉพาะอย่างยิ่งใน windows

การติดตั้ง

ติดตั้ง node.jsจากนั้น

npm install -g servez

การใช้

servez [options] [path]

ไม่มีเส้นทางจะทำหน้าที่โฟลเดอร์ปัจจุบัน

โดยค่าเริ่มต้นจะทำหน้าที่index.htmlเป็นเส้นทางโฟลเดอร์หากมีอยู่ มันทำหน้าที่รายการไดเรกทอรีสำหรับโฟลเดอร์เป็นอย่างอื่น นอกจากนี้ยังให้บริการส่วนหัว CORS คุณสามารถเลือกเปิดการรับรองความถูกต้องเบื้องต้นด้วย--username=somename --password=somepassและคุณสามารถให้บริการ https

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.