什么是 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 --help
和twistd 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)更快的替代方案?的主要内容,如果未能解决你的问题,请参考以下文章