python3 -m http.server 是 Python 自带的零依赖 HTTP 文件服务器,在当前目录起一个服务,局域网内别人用浏览器或 wget 就能下载文件。临时传个文件特别方便 ------ 不用装 nginx,不用配 FTP,一行命令搞定。
但很多人都遇到过同一个坑:服务跑着跑着,过一段时间另一台电脑就访问不了了。 这篇就讲清楚它的基本用法,以及"断开"背后到底发生了什么。
基本用法
bash
# 当前目录,默认端口 8000,默认绑 0.0.0.0(局域网可访问)
python3 -m http.server
# 指定端口
python3 -m http.server 9000
# 指定目录,不用先 cd
python3 -m http.server -d /path/to/dir 8000
# 只允许本机访问
python3 -m http.server --bind 127.0.0.1
查自己的 IP 发给别人:hostname -I 或 ip -4 addr | grep inet。对方浏览器访问 http://<你的IP>:8000,或命令行 wget http://<你的IP>:8000/文件名。
⚠️ 它是明文 HTTP、无认证、可列目录,只适合在可信局域网内临时传文件,切勿暴露到公网。
为什么"跑一段时间就断,别人就访问不了"?
先纠正一个直觉:服务本身不会自己定时退出 。http.server 没有任何超时自杀逻辑,它会一直监听直到进程被杀。所以"断开"几乎都是外部原因导致的 ------ 要么进程被杀了,要么网络变了。按概率从高到低排查:
1. 终端 / SSH 会话断了(最常见)
如果是在 SSH 或某个终端窗口里前台 直接跑的,一旦那个会话断开 ------ 关窗口、SSH 空闲超时、笔记本合盖休眠 ------ 进程会收到 SIGHUP 信号被杀掉,对方瞬间就访问不了了。
这是绝大多数人踩的坑:命令明明还"开着"(其实终端已经没了),却怎么也连不上。
解法:让服务脱离终端运行。
bash
# 方式 A:nohup + 后台,关终端也不受影响
nohup python3 -m http.server 8000 >/tmp/httpd.log 2>&1 &
# 方式 B:tmux(推荐,随时能切回去看日志、看是否还活着)
tmux new -s httpd 'python3 -m http.server 8000'
tmux 方式尤其省心:服务在独立会话里跑,你可以随时 tmux attach -t httpd 回去查看请求日志,关掉当前终端也完全不影响它。
2. 电脑睡眠 / 网卡休眠
笔记本一段时间无操作后进入休眠,或网卡因省电策略断开 ------ 这时 IP 配置可能还在,但服务进程被挂起、网络栈停摆,对方自然连不上。台式机或常开的服务器一般没这个问题。
如果你用的是笔记本做临时服务器,记得先关掉自动休眠。
3. IP 变了(DHCP 续租)
你的机器 IP 是路由器通过 DHCP 动态分配的,租约到期后可能被重新分配成另一个地址。你这边服务好好的,但对方还在用旧 IP 访问,自然就连不上了。
用 hostname -I 确认一下当前 IP 是不是和当初发给别人的不一样。要彻底避免,可以在路由器里给这台机器绑定静态 IP。
4. 单线程被慢连接阻塞(表现为"卡"而非"断")
http.server 默认是单线程的,一个很慢的请求(比如对方网络差、在拉一个大文件)可能会堵住后面排队的请求。这种症状是"页面转圈/超时",而不是"彻底连不上",和前三种的"断开"不太一样,但在传大文件、多人同时下载时值得留意。
小结
| 现象 | 最可能原因 | 解法 |
|---|---|---|
| 关终端后立刻失联 | SIGHUP 杀进程 |
tmux 或 nohup 后台跑 |
| 闲置一会儿失联 | 电脑 / 网卡休眠 | 关闭自动休眠,或用常开机器 |
| 隔一段时间连不上 | DHCP 导致 IP 变了 | hostname -I 重新确认,或绑静态 IP |
| 能连但很慢 / 卡住 | 单线程被慢连接阻塞 | 避免并发拉大量大文件 |
九成情况是第 1 条。记住一句话就够了:别在前台终端里裸跑,丢进 tmux 里,关掉终端、断开 SSH 都不会断,这是最省心的做法。