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

332

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

python -m http.server

然而,就 Web 服务器而言,它非常慢......

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

有什么更快的替代方案,而且同样方便吗?


18
这个帖子让我恢复了理智。我一直在使用SimpleHTTPServer,在使用RequireJS时遇到了随机错误,让我非常抓狂!node的http-server运行得非常好。谢谢! - Dave Cadwallader
4
@ChrisF,根据这个指南,我编辑了问题以更准确地反映这确实是一个可以回答的问题。我解释了我遇到的问题(即超时和浪费时间),但由于我不知道有什么替代方案,所以我无法列出我所做的事情来解决这个问题。我认为这个问题不适合“你最喜欢的___”的形式,因为标准已经明确定义。不同的访问者可能会发现不同的答案更有用,而且答案可能不符合给定的标准。 - Drew Noakes
27
SO(Stack Overflow)有一个习惯,就是关闭人们最喜欢的问题…… - isomorphismes
4
这个问题不仅有用,而且不符合被关闭的描述。至少已经进行了研究... - Bryan Larson
3
如果你想提供一个git仓库,另一个选择是git instaweb - Drew Noakes
显示剩余4条评论
15个回答

421

Node.jshttp-server非常方便,并且比Python的SimpleHTTPServer快得多。这主要是因为它使用异步IO来并发处理请求,而不是串行化请求。

安装

如果您还没有安装node.js,请先安装node.js。然后使用node包管理器(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选项,并且在安装过程中没有打印任何错误信息吗?那个错误只是意味着在安装后无法找到它,如果一切正常,则似乎不太可能发生。你使用的平台是什么?在整个驱动器上运行一个查找命令以查找名为http-server的文件。我已经在几个不同的Linux发行版和Windows版本上成功使用过这个程序。 - Drew Noakes
2
我只想确认使用这个解决方案将我的页面加载时间从20秒缩短到了2秒! - 0leg
1
在运行服务器一段时间后,我遇到了无法提供媒体文件的问题。 - PabloRosales
2
截至2019年11月,看起来http-server在几个月内一直无法为Windows用户提供服务。它的许多依赖项已经过时。其中一个叫做ecstatic的依赖项现在已经被放弃,因此不清楚何时或是否会修复。我尝试着自己修复,但也不确定开发人员是否会接受PR。因此,我编写了自己的替代品servez-cli - gman
显示剩余15条评论

117
我推荐: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

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

6
除非您已经安装了node.js,否则我发现这是最方便的。谢谢分享! - Chris J
4
在Ubuntu上,您首先需要执行sudo apt-get install python-twisted-web命令。(谢谢这个答案,非常方便!) - nkorth
2
Twisted 一行服务器的一个特殊优点是,它支持可恢复下载(字节范围支持),这是在您下载大文件时必须拥有的功能。 - Pankaj
8
我用Node时无法正常流式传输视频/音频,但使用Twisted则非常好! - dizy
2
你可以使用 twistd --helptwistd web --help 来配置端口和获取其他选项。我花了一段时间才弄明白这个。 - Ehtesh Choudhury
显示剩余9条评论

35

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解决方案运行得更快。 :) 我能否添加用户名和密码以进行下载? - Ajax

22
尝试使用webfs,它很小,不需要像node.js或python这样的平台。

1
看起来你需要编译它?没有看到任何可下载的二进制文件。 - BrainSlugs83
3
可以,除非你的发行版已经安装了它。Debian和Ubuntu都有:apt-get install webfs - Hudon
4
我在我的 Mac 上执行了 brew install webfs 命令,结果是 /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并且可以作为系统守护程序运行。 - Federico

15

如果您使用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

12

10
我发现python -m http.server不可靠——有些响应需要几秒钟。
现在我使用一个名为Ran的服务器,链接在https://github.com/m3ng9i/ran

Ran: 一个简单的Go语言静态Web服务器。


9

还可以考虑使用devd,这是一个用Go语言编写的小型Web服务器。您可以在这里下载适用于许多平台的二进制文件。

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

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


5
如果您安装了 PHP,您可以使用内置服务器。
php -S 0:8080

比 Python/Node 更好的解决方案。 - desertSniper87
对我来说,php -S localhost:8080 - ggorlen

4

给Polpetta尝试一下...

npm install -g polpetta

那么您可以:

然后您可以

polpetta ~/folder

然后,你就可以开始了 :-)


4
你能详细说明为什么我们应该尝试使用polpetta吗? - Dan Dascalescu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接