Что является более быстрой альтернативой http.server Python (или SimpleHTTPServer)?

300

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

python -m http.server

Однако, что касается веб-серверов, это очень запутанно ...

Он ведет себя так, как будто он однопоточный, и иногда вызывает ошибки тайм-аута при загрузке JavaScript-модулей AMD с помощью RequireJS. Загрузка простой страницы без изображений может занять от пяти до десяти секунд.

Какая более быстрая альтернатива, которая так же удобна?

Дрю Ноакс
источник
17
Эта тема только что восстановила мое здравомыслие Я использовал SimpleHTTPServer и получал случайные ошибки с RequireJS, которые сводили меня с ума! http-сервер узла работает как шарм. Спасибо!
Дейв Кадвалладер,
4
@ ChrisF, я редактировал вопрос в соответствии с этим ориентиром более грамматический отражают тот факт , что на самом деле подотчетен вопрос. Я объяснил проблему, с которой столкнулся (а именно, тайм-ауты и потерянное время), и я не мог перечислить, что я сделал, чтобы решить проблему, потому что я не знал ни о каких альтернативах. Я не думаю, что этот вопрос соответствует форме «Какой твой любимый ___», поскольку критерии четко определены. Разные посетители могут найти разные ответы более полезными, и ответы могут не соответствовать заданным критериям.
Дрю Ноакс
26
Люблю, как ТАК имеет привычку закрывать любимые вопросы людей ...
isomorphismes
4
Этот вопрос не только полезен, но и не соответствует описанию, для которого он закрыт. По крайней мере, исследование уже сделано ...
Брайан Ларсон,
3
Другой вариант, если вы хотите использовать git-репо, это git instaweb.
Дрю Ноакс

Ответы:

394

http-сервер для node.js очень удобен и работает намного быстрее, чем SimpleHTTPServer в Python. Это происходит главным образом потому, что он использует асинхронный ввод-вывод для параллельной обработки запросов, а не сериализации запросов.

Монтаж

Установите 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-сервер, похоже, плохо обрабатывает.
Ган
1
@ Salmonface, вы определенно использовали эту -gопцию, и вы убедились, что во время установки не было напечатано никаких ошибок? Эта ошибка означает, что ее невозможно найти после установки, что маловероятно, если все пойдет хорошо. На какой ты платформе? Запустите команду find на вашем диске, чтобы найти файл с именем http-server. Я успешно использовал это на нескольких разных дистрибутивах Linux и версиях Windows.
Дрю Ноакс
2
Я просто хочу подтвердить, что использование этого решения увеличило время загрузки моей страницы с 20 до 2 секунд!
0
1
Ну, сначала это было улучшение по сравнению с питоном SimpleHTTPServer, пока у меня не закончилась память. http-сервер потребляет огромное количество памяти для больших файлов. Предложение myserver.go быстрое и потребляет около 2 МБ памяти вместо 5 ГБ, прежде чем начать обмен и получить очень медленно.
Даниэль
2
По состоянию на ноябрь 2019 года выглядит так, как будто http-сервер был сломан для пользователей Windows в течение нескольких месяцев. Многие из его зависимостей устарели. Один из них, восторженный, теперь заброшен, поэтому неясно, когда или будет ли он исправлен. Я смотрел на исправление себя, но также не ясно, будут ли разработчики принимать PR. Итак, я написал свою замену .
Человек
106

Я рекомендую: 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. Он также принимает параметры командной строки (после команды "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. Мне понадобилось время, чтобы понять это.
Эхтеш Чоудхури
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

pd40
источник
Отличный ответ. Это работает быстрее, чем решение SimpleHTTPServer и nodejs. :) Есть ли способ добавить имя пользователя и пароль для загрузки?
Аякс
21

Попробуйте webfs , он крошечный и не зависит от наличия платформы, такой как node.js или python.

Hudon
источник
1
Похоже, вы должны скомпилировать? Не видел бинарных файлов для скачивания.
BrainSlugs83
2
да, если у вашего дистрибутива нет У 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.
'18
Гораздо лучше, чем другие решения. Он очень маленький, очень быстрый и поставляется в виде пакета ОС. Он также поддерживает 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
Дрю Ноакс
источник
11

Вот еще один Это расширение Chrome

После установки вы можете запустить его, создав новую вкладку в Chrome и нажав кнопку приложений в левом верхнем углу.

У него простой графический интерфейс. Нажмите выбрать папку, затем нажмите http://127.0.0.1:8887ссылку

введите описание изображения здесь

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

GMan
источник
8

Также рассмотрим devd небольшой веб-сервер, написанный на go. Двоичные файлы для многих платформ доступны здесь .

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

Он небольшой, быстрый и предоставляет некоторые интересные дополнительные функции, такие как повторная загрузка в реальном времени при изменении файлов.

GMan
источник
7

Я нашел python -m http.serverненадежным - некоторые ответы займет несколько секунд.

Теперь я использую сервер с именем Ran https://github.com/m3ng9i/ran

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

Полковник паника
источник
5

попробуй полпетту ...

npm install -g polpetta

тогда ты можешь

polpetta ~ / папка

и ты готов к работе :-)

Андреа Джаммарчи
источник
1
Не могли бы вы рассказать, почему мы должны попробовать Полпетту ?
Дан Даскалеску
3

Использование Servez в качестве сервера

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

servez

Примечание. Я создал это вместе, потому что веб-сервер для Chrome исчезает, поскольку Chrome удаляет поддержку приложений, а также потому, что я поддерживаю студентов, которые не имеют опыта работы с командной строкой.

GMan
источник
Я
Фелипе Гутьеррес
2

Мне нравится live-сервер . Он быстрый и имеет приятную функцию перезагрузки в реальном времени, что очень удобно во время разработки.

Использование очень просто:

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'
Nico
источник
1

Если у вас установлен PHP, вы можете использовать встроенный сервер.

php -S 0:8080
user1461607
источник
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.

GMan
источник