有什么比Python的http.server(或SimpleHTTPServer)更快的替代方法?


300

Python的http.server(或适用于Python 2的SimpleHTTPServer)是一种从命令行提供当前目录内容的好方法:

python -m http.server

但是,就Web服务器而言,它是非常简单的...

它的行为就像是单线程的一样,并且在使用RequireJS加载JavaScript AMD模块时偶尔会导致超时错误。加载没有图像的简单页面可能需要五到十秒钟。

有什么方便的更快替代方法?


17
这个线程恢复了我的理智。我一直在使用SimpleHTTPServer并在RequireJS中遇到随机错误,这让我发疯了!节点的http服务器正在运行,就像一个超级按钮。谢谢!
Dave Cadwallader

4
@ChrisF,我已按照此指南编辑了该问题,以便从语法上更实际地反映这实际上一个可以回答的问题。我已经解释了我所遇到的问题(即超时和浪费时间),并且由于我不知道其他选择,因此无法列出解决该问题的方法。我认为此问题不适合“您最喜欢的___”形状,因为标准已明确定义。不同的访问者可能会发现不同的答案更有用,并且答案可能不符合给出的标准。
Drew Noakes

26
喜欢SO如何习惯于解决人们最喜欢的问题的习惯……
同构现象2014年

4
这个问题不仅有用,而且与要关闭的描述不匹配。至少研究已经完成了……
布莱恩·拉尔森

3
如果您要提供git repo,另一种选择是git instaweb
Drew Noakes,2015年

Answers:


394

用于node.js的http服务器非常方便,并且比Python的SimpleHTTPServer快得多。这主要是因为它使用异步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 显示目录索引页[是]
  • -s或“ --silent静音”模式将无法登录到控制台
  • -h--help显示帮助消息并退出

因此,要在端口8000上提供当前目录,请键入:

http-server -p 8000

12
这太棒了!!感谢您指出。它非常适合测试流音频/视频,这是python服务器似乎无法很好处理的事情。
gman 2012年

1
@Salmonface,您是否确实使用了该-g选项,并且确保在安装过程中未打印任何错误?该错误仅表示在安装后无法找到它,如果一切顺利,这似乎不太可能。您在什么平台上?在驱动器上运行find命令以查找名为name的文件http-server。我已经在几个不同的Linux发行版和Windows版本上成功使用了此功能。
Drew Noakes 2013年

2
我只想确认使用此解决方案可以将页面加载时间从20秒缩短到2秒!
2015年

1
好吧,起初它是对Python SimpleHTTPServer的改进,直到内存不足。http服务器占用大文件的大量内存。myserver.go提议是快速的,仅消耗约2 MB的内存,而不是5 GB的内存,然后才开始交换并变得非常慢。
丹尼尔(Daniel)2016年

2
因此,截至2019年11月,看来Windows用户的HTTP服务器已经中断了几个月。它的许多依赖关系已经过时了。其中一个,欣喜若狂,现在被废弃了,因此尚不清楚何时或是否将其修复。我研究过修复自己的问题,但尚不清楚开发人员是否会接受PR。因此,我写了我自己的替代书
gman

105

我建议:Twistedhttp://twistedmatrix.com

一个事件驱动的网络引擎,该引擎使用Python编写,并已获得MIT开源许可。

它是跨平台的,已预先安装在OS X 10.5至10.12上。除其他外,您可以使用以下命令在当前目录中启动一个简单的Web服务器:

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服务器的命令。它还接受命令行选项(在“ 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

视窗

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,否则我发现这是最方便的。感谢分享!
克里斯J

3
在Ubuntu上,您必须sudo apt-get install python-twisted-web首先。(感谢您的回答,非常方便!)
nkorth

2
双绞线服务器的一个特殊优势是,它支持可恢复的下载(支持字节范围),并且在下载大文件时必须具备此功能。
Pankaj

7
使用node不能为我正确地传输视频/音频,但是使用twisted效果很好!
dizy

2
您可以使用twistd --help和配置端口并获取其他选项twistd web --help。花了我一段时间才能弄清楚。
Ehtesh Choudhury 2013年

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解决方案的运行速度更快。:)有什么方法可以添加用户名和密码?
阿贾克斯

21

尝试使用webfs,它很小,并且不依赖于安装诸如node.js或python之类的平台。


1
看起来您必须进行编译?没有看到任何要下载的二进制文件。
BrainSlugs83 2014年

2
是的,除非您的发行版有它。Debian和Ubuntu拥有它:apt-get install webfs
Hudon 2014年

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/。它有点罗word,所以记住起来并不明显,但是作为twisted或SimpleHTTPServer的替代者很高兴知道。
onetom 2014年

比其他解决方案好得多。它非常小,非常快,并且作为OS软件包提供。它还支持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

还可以考虑使用devd用go编写的小型Web服务器。这里提供了许多平台的二进制文件。

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

它小巧,快速,并提供了一些有趣的可选功能,例如在文件更改时实时重新加载。





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/

如果需要查看本地网络中其他计算机上的Web服务器,则可以检查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'

1

如果安装了PHP,则可以使用内置服务器。

php -S 0:8080

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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.