什么是 Python 的 http.server(或 SimpleHTTPServer)更快的替代方案?

Posted

技术标签:

【中文标题】什么是 Python 的 http.server(或 SimpleHTTPServer)更快的替代方案?【英文标题】:What is a faster alternative to Python's http.server (or SimpleHTTPServer)? 【发布时间】:2012-10-06 00:08:00 【问题描述】:

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

python -m http.server

但是,就网络服务器而言,它非常缓慢......

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

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

【问题讨论】:

这个帖子刚刚恢复了我的理智。我一直在使用 SimpleHTTPServer 并遇到 RequireJS 的随机错误,这让我抓狂! node 的 http-server 的工作就像一个魅力。谢谢! @ChrisF,我已经根据this guideline 编辑了这个问题,以更语法地反映这个实际上是一个可以回答的问题。我已经解释了我面临的问题(即超时和浪费的时间),但我无法列出我为解决该问题所做的工作,因为我不知道任何替代方案。我认为这个问题不符合“你最喜欢的___”形状,因为标准已经明确定义。不同的访问者可能会发现不同的答案更有用,而答案可能不符合给定的标准。 喜欢 SO 有关闭人们最喜欢的问题的习惯…… 这个问题不仅有用,而且与关闭它的描述不符。至少研究已经完成了…… 另一个选项,如果你想提供一个 git repo,是git instaweb 【参考方案1】:

http-server for node.js 非常方便,比 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显示目录索引页[True] -s--silent 静默模式不会登录到控制台 -h--help 显示帮助信息并退出

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

http-server -p 8000

【讨论】:

这太棒了!!谢谢你指出。它非常适合测试流式音频/视频,这是 python 服务器似乎根本无法处理的事情。 @Salmonface,您确定使用了-g 选项,并且您确定在安装过程中没有打印错误吗?该错误仅表示安装后无法找到它,如果一切顺利,这似乎不太可能。你在哪个平台?在驱动器上运行查找命令以查找名称为 http-server 的文件。我已经在几个不同的 Linux 发行版和 Windows 版本上成功使用了它。 我只是想确认使用此解决方案将我的页面加载时间从 20 秒缩短到 2 秒! 嗯,起初它是对 python SimpleHTTPServer 的改进,直到我内存不足。 http-server 为大文件消耗大量内存。 myserver.go 提案很快,在开始交换之前只消耗大约 2 MB 而不是 5 GB 内存,并且变得非常慢。 因此,截至 2019 年 11 月,Windows 用户的 http-server 似乎已经损坏了几个月。它的许多依赖项已经过时了。其中之一,欣喜若狂,现在已被放弃,因此尚不清楚何时或是否会修复。我考虑修复自己,但也不清楚开发人员是否会接受 PR。所以,我写了自己的replacement。【参考方案2】:

如果您使用 Mercurial,则可以使用内置的 HTTP 服务器。在您希望提供的文件夹中:

hg serve

来自the docs:

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

【讨论】:

【参考方案3】:

试试 polpetta ...

npm install -g polpetta

那么你就可以了

polpetta ~/文件夹

你准备好了:-)

【讨论】:

你能详细说明一下为什么我们应该试试polpetta吗?【参考方案4】:

go 1.0 包含 http server 和 util for serving files 以及几行代码。

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 解决方案运行得更快。 :) 有什么办法可以在下载中添加用户名和密码?【参考方案5】:

我推荐:Twisted (http://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

【讨论】:

除非您已经设置了 node.js,否则我发现这是最方便的。感谢分享! 在 Ubuntu 上,你必须先sudo apt-get install python-twisted-web。 (感谢这个回答,很方便!) 双绞线服务器的一个特殊优势,它支持可恢复下载(支持字节范围),这是您下载大文件时必须具备的功能。 使用 node 没有为我正确地流式传输视频/音频,但使用 twistd 效果很好! 您可以使用twistd --helptwistd web --help 配置端口并获取其他选项。我花了一段时间才弄明白。【参考方案6】:

试试webfs,它很小,不依赖于安装node.js或python之类的平台。

【讨论】:

看起来你必须编译它?没有看到任何可供下载的二进制文件。 是的,除非你的发行版有它。 Debian 和 Ubuntu 都有:apt-get install webfs 我在我的 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 的替代品,很高兴知道。 比其他解决方案好得多。它非常小、非常快,并作为操作系统包提供。它还支持 SSL,可以作为系统守护进程运行。【参考方案7】:

还可以考虑devd 一个用 Go 编写的小型 Web 服务器。许多平台的二进制文件可用here。

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

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

【讨论】:

【参考方案8】:

我发现 python -m http.server 不可靠——有些响应需要几秒钟的时间。

现在我使用名为 Ran https://github.com/m3ng9i/ran 的服务器

Ran:一个用 Go 编写的简单静态 Web 服务器

【讨论】:

【参考方案9】:

Here's another. It's a Chrome Extension

安装后,您可以通过在 Chrome 中创建一个新选项卡并单击左上角附近的 应用程序 按钮来运行它

它有一个简单的 gui。点击选择文件夹,然后点击http://127.0.0.1:8887链接

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

【讨论】:

【参考方案10】:

使用 Servez 作为服务器

    下载Servez 安装,运行 选择要投放的文件夹 选择“开始” 转到http://localhost:8080 或选择“启动浏览器”

注意:我把它放在一起是因为 Chrome 的 Web 服务器自 Chrome is removing support for apps 起就消失了,而且因为我支持对命令行零经验的艺术学生

【讨论】:

我投票赞成运行 WebGL 示例【参考方案11】:

我喜欢live-server。它速度快,并且具有很好的实时重载功能,在开发过程中非常方便。

用法很简单:

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'

【讨论】:

【参考方案12】:

又一个基于节点的简单命令行服务器

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

部分是为了响应 http-server 的问题,尤其是在 windows 上。

安装

Install node.js 然后

npm install -g servez

用法

servez [options] [path]

没有路径,它服务于当前文件夹。

默认情况下,它为文件夹路径提供index.html(如果存在)。否则,它会为文件夹提供目录列表。它还提供 CORS 标头。您可以选择使用--username=somename --password=somepass 启用基本身份验证,并且可以提供 https。

【讨论】:

【参考方案13】:

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

php -S 0:8080

【讨论】:

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

以上是关于什么是 Python 的 http.server(或 SimpleHTTPServer)更快的替代方案?的主要内容,如果未能解决你的问题,请参考以下文章

Python命令开启http.server服务器

Python命令开启http.server服务器

Python一行代码创建HTTP Server

Python一行代码创建HTTP Server

命令行运行python -m http.server报错

什么是HTTP SERVER