Що є більш швидкою альтернативою http.server Python (або SimpleHTTPServer)?


300

Http.server Python (або SimpleHTTPServer для Python 2) - це чудовий спосіб обслуговування вмісту поточного каталогу з командного рядка:

python -m http.server

Однак, що стосується веб-серверів, це дуже slooooow ...

Він поводиться так, ніби він є однопоточним і іноді викликає помилки в очікуванні під час завантаження модулів JavaScript AMD за допомогою RequireJS. Завантаження простої сторінки без зображень може зайняти п'ять-десять секунд.

Що більш швидка альтернатива, яка так само зручна?


17
Ця нитка просто відновила мою здоровість. Я використовував SimpleHTTPServer і отримував випадкові помилки з RequireJS, які мене ганяли! http-сервер вузла працює як шарм. Дякую!
Дейв Cadwallader

4
@ ChrisF, я редагував питання в відповідно до цим орієнтиром більш граматичний відображають той факт , що на насправді підзвітний питання. Я пояснив проблему, з якою я зіткнувся (а саме, очікування та витрачений час), і не зміг перерахувати, що я зробив для вирішення проблеми, оскільки не знав жодної альтернативи. Я не думаю, що це питання відповідає формі "Який твій улюблений ___", оскільки критерії чітко визначені. Різні відвідувачі можуть знайти різні відповіді кориснішими, і відповіді можуть не відповідати заданим критеріям.
Дрю Ноакс

26
Любіть, як SO має звичку закривати улюблені питання людей…
isomorphismes

4
Це питання не тільки корисне, воно також не відповідає опису, на який він закривається. Принаймні дослідження вже зроблено ...
Брайан Ларсон

3
Ще один варіант, якщо ви хочете подати gpo repo - це git instaweb.
Дрю Ноакс

Відповіді:


394

http-сервер для node.js дуже зручний і набагато швидший, ніж SimpleHTTPServer Python. Це перш за все тому, що він використовує асинхронний IO для одночасного оброблення запитів, а не послідовного запиту.

Установка

Встановіть node.js, якщо ви ще цього не зробили. Потім використовуйте диспетчер пакетів вузлів ( npm) для встановлення пакету, використовуючи -gопцію для установки глобально. Якщо ви працюєте в Windows, вам знадобиться підказка з правами адміністратора, а в Linux / OSX ви хочете виконати sudoкоманду:

npm install http-server -g

Це завантажить усі необхідні залежності та встановить http-server.

Використовуйте

Тепер із будь-якого каталогу можна ввести:

http-server [path] [options]

Шлях необов’язковий, дефолт, ./publicякщо він існує, в іншому випадку ./.

Параметри [за замовчуванням]:

  • -p Номер порту для прослуховування [8080]
  • -a Адреса хоста для прив’язки до [localhost]
  • -i Відображення покажчикових сторінок каталогів [True]
  • -sабо --silentТихий режим не входитиме до консолі
  • -hабо --helpВідображає довідкове повідомлення та виходить

Отже, для обслуговування поточного каталогу на порту 8000 введіть:

http-server -p 8000

12
Це круто!! Дякую, що вказали на це. Він чудово підходить для тестування потокового аудіо / відео, що, по всій видимості, не допомагає серверу python.
gman

1
@Salmonface, чи точно ви користувались цією -gопцією, і чи переконалися ви, що під час встановлення не було надруковано жодних помилок? Ця помилка просто означає, що її неможливо знайти після встановлення, що здається малоймовірним, якщо все піде добре. На якій платформі ви знаходитесь? Запустіть команду find на вашому диску, щоб знайти файл з ім'ям http-server. Я успішно використовував це в кількох різних дистрибутивах Linux та версіях Windows.
Дрю Ноакс

2
Я просто хочу підтвердити, що використання цього рішення покращило час завантаження моєї сторінки з 20-х до 2-х!
0лег

1
Ну, спочатку це було вдосконаленням над пітоном SimpleHTTPServer, поки у мене не вичерпалося пам'яті. http-сервер споживає величезну кількість пам'яті для великих файлів. Пропозиція myserver.go швидко споживає близько 2 Мб замість 5 ГБ пам'яті, перш ніж почати обмінюватися та отримувати дійсно повільно.
Даніель

2
Тож станом на листопад 2019 року схоже, що http-сервер був зламаний для користувачів Windows протягом декількох місяців. Багато її залежностей застаріли. Один із них, екстатичний, зараз покинутий, тому не ясно, коли або чи буде це зафіксовано. Я розглядав, як виправити себе, але також не ясно, чи розберуть розробників. Отже, я написав власну заміну .
gman

105

Рекомендую: Twisted ( http://twistedmatrix.com )

мережевий движок, керований подіями, написаний на Python та ліцензований під ліцензією MIT з відкритим кодом.

Він є кросплатформенним і був попередньо встановлений на 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. Він також приймає параметри командного рядка (після команди "web" - див. 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

Установка

Ubuntu

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, я вважаю це найзручнішим. Дякую, що поділились!
Кріс Дж

3
На Ubuntu вам потрібно sudo apt-get install python-twisted-webспершу. (Дякую за цю відповідь, це дуже зручно!)
nkorth

2
Однією з особливих переваг крученого однорядного сервера є підтримка поновлюваних завантажень (підтримка діапазону байтів), і це обов'язково функція під час завантаження великих файлів.
Панкай

7
використання вузла не передало відео / аудіо належним чином для мене, хоча використання twistd чудово працює!
запаморочення

2
Ви можете налаштувати порти та отримувати інші параметри за допомогою twistd --helpі twistd web --help. Зайняв мене час, щоб зрозуміти це.
Ehtesh Choudhury

30

1.0 включає сервер http та утиліту для обслуговування файлів з кількома рядками коду.

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. :) Чи можна додати ім’я користувача та пароль до завантаження?
Аякс

21

Спробуйте webfs , він крихітний і не залежить від встановлення такої платформи, як node.js або python.


1
схоже, вам доведеться його скласти? Не бачили жодних бінарних файлів для завантаження.
BrainSlugs83

2
так, якщо ваш дистрибутив не має цього. У Debian та Ubuntu є:apt-get install webfs
Хадон,

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 і може працювати як системний демон.
Федеріко

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


8

Також розгляньте devv невеликий веб-сервер, написаний на ходу. Бінарні файли для багатьох платформ доступні тут .

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

Він невеликий, швидкий і надає деякі цікаві додаткові функції, такі як перезавантаження в реальному часі, коли ваші файли змінюються.


7

Я виявив python -m http.serverнедостовірність - на деякі відповіді знадобиться кілька секунд.

Зараз я використовую сервер під назвою Ran https://github.com/m3ng9i/ran

Ran: простий статичний веб-сервер, написаний на Go



3

Використання Servez як сервера

  1. Завантажити Сервеза
  2. Встановіть, запустіть
  3. Виберіть папку для показу
  4. Виберіть "Почати"
  5. Перейдіть http://localhost:8080або виберіть "Запустити браузер"

servez

Примітка. Я поєднав це, тому що веб-сервер для Chrome відходить, оскільки Chrome видаляє підтримку програм і тому, що я підтримую студентів мистецтва, які не мають досвіду роботи з командним рядком


Я голосую за те, щоб запустити приклади WebGL
Феліпе Гутьєррес

2

Мені подобається live-сервер . Це швидко і має приємну функцію перезарядження в реальному часі, що дуже зручно під час розвитку.

Використання дуже просте:

cd ~/Sites/
live-server

За замовчуванням він створює сервер з IP 127.0.0.1 та портом 8080.

http://127.0.0.1:8080/

Якщо порт 8080 не вільний, він використовує інший порт:

http://127.0.0.1what2749/

http://127.0.0.1what2858/

Якщо вам потрібно побачити веб-сервер на інших машинах у вашій локальній мережі, ви можете перевірити, який ваш 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.