先治一个要命的毛病:为什么关掉终端,网站就打不开了?
你在云服务器上敲一行命令(比如 python manage.py runserver 0.0.0.0:8000),浏览器一访问,网站出来了,很开心。然后你关掉 SSH 窗口、或者笔记本合盖断网——再访问,网站就 502、打不开了。
前半节课就教三招治这个病,后半节课讲大作业:
- ① 后台运行:让网站脱离终端,关窗口、断 SSH 都不停。
- ② 查看 & 关闭:想知道现在跑着哪些网站、想关哪个就精准关哪个。
- ③ 一键归零:万一起了一堆东西、自己都不知道开了啥,一条命令重来。
nohup:关掉终端也不掉线
你现在的启动命令,是「前台运行」——程序占着这个窗口,窗口一关它就走。要让它留下来,给命令加上 nohup 和 & 两件「装备」。
先认清你平时的启动命令
| 你用的框架 | 平时(前台)启动命令 |
|---|---|
| Flask | python app.py |
| Django | python manage.py runserver 0.0.0.0:8000 |
| Tornado | python server.py |
| FastAPI | uvicorn main:app --host 0.0.0.0 --port 8000 |
套上「不掉线」公式
四个框架照着抄
| 框架 | 后台启动命令(关终端也不停) |
|---|---|
| Flask | nohup python app.py > web.log 2>&1 & |
| Django | nohup python manage.py runserver 0.0.0.0:8000 > web.log 2>&1 & |
| Tornado | nohup python server.py > web.log 2>&1 & |
| FastAPI | nohup uvicorn main:app --host 0.0.0.0 --port 8000 > web.log 2>&1 & |
# 以 Django 为例,其他框架换成上表对应那行即可
$ nohup python manage.py runserver 0.0.0.0:8000 > web.log 2>&1 &
[1] 12345 ← 12345 就是这个网站的进程号(PID),先记一下
$ # 现在可以放心关掉 SSH 窗口了,网站还在跑
验证一下:它真活着吗?
$ tail -f web.log # 实时看网站日志,启动成功 / 报错都在这里(Ctrl+C 退出查看)
Starting development server at http://0.0.0.0:8000/
$ # 然后浏览器打开 http://你的公网IP:8000 能看到网站,就成了
nohup 启动一次。否则你访问到的永远是老版本。
想关哪个,就精准关哪个
第一步:看看现在跑着什么
$ ps aux | grep python # 列出所有 python 程序,找你的网站
root 12345 0.3 python manage.py runserver 0.0.0.0:8000 ← 你的网站,PID=12345
root 12999 0.0 grep python ← 这行是 grep 自己,忽略它
如果你用的是 FastAPI / uvicorn,把 python 换成 uvicorn 来查:ps aux | grep uvicorn。
Address already in use(端口被占用)。这时不用猜,直接问「8000 端口现在是谁在用」:
$ lsof -i:8000
COMMAND PID USER ... NAME
python 12345 root ... *:8000 (LISTEN) ← 8000 端口被 PID 12345 占着
$ # 没装 lsof?用这条也行:
$ netstat -tlnp | grep 8000
第二步:关掉它
$ kill 12345 # 知道 PID:礼貌地关掉它(推荐先用这个)
$ kill -9 12345 # 上面关不掉?加 -9 强制关
$ pkill -f manage.py # 懒人法:不用查 PID,按命令关键词一键全关
kill PID:标准做法,发个「请退出」信号,程序能干净收尾。kill -9 PID:发「立刻停」的强制信号,kill失效时才用。pkill -f 关键词:最省事。Django 的 runserver 其实会开两个进程,用pkill -f manage.py一次全清,比 kill 单个更省心。
reboot:乱成一团时,重启重来
调试到后面,你可能起了一堆东西:网站起了好几遍、端口被占、自己也记不清开了啥。这时与其一个个排查,不如重启服务器——所有你手动起的程序,统统清零,干干净净从头来。
$ sudo reboot # 重启整台服务器
Connection to xxx.xxx.xxx.xxx closed. ← SSH 会断开,正常现象
$ # 等 30 秒 ~ 1 分钟,再重新 SSH 连上去
- 会自动回来:MySQL 数据库这类「系统服务」,开机自动启动,不用管。
- 不会自动回来:你用
nohup起的网站。重启后是关着的,要再nohup启动一遍。这正是「归零」的意义——只留你想留的。
kill + 重新 nohup,没必要动整台服务器。
systemd:给网站写一个 .service 文件,再 systemctl enable 一下就行。这超出本课要求,感兴趣可以课后自己查,做出来是加分项。
🏁 大作业:做一个属于你们自己的网站
前面第 12–15 章那四个项目(博客 / 学生管理 / BBS / 小程序后台),只是给你看路怎么走,不是要你一字不差照抄。这次大作业,我希望你们做出一个真正属于自己的东西。
三条路线,任选其一
照着改
拿课上的项目当骨架,换成你自己的主题,再加一两个新功能。最稳妥,适合想先及格的同学。
全新做
自己想一个点子,从零搭起来。最推荐,原创度高,分数有惊喜。
升级别人的
在网上找个好玩的开源小项目,读懂它、改造它、部署上线。有挑战,也很练真本事。
没思路?随便挑一个当起点
几人一组、做大做小都行,但记得把网站用 nohup 跑在后台——交作业那几天,我会随时点开你们的网址,必须能打开。
⭐ 考核标准:先记住这条铁律
除了这条硬性要求,评分大致看这几个方面,心里有数即可:
| 看什么 | 说明 |
|---|---|
| 能不能打开 | 我点开网址,网站正常运行(这就是为什么前面要学 nohup)。 |
| 功能完整度 | 该有的功能跑得通,不是只有一个空壳首页。 |
| 原创与用心 | 不是原封不动照抄课件;有自己的主题、设计、想法。 |
| 部署稳定 | 交作业期间一直在线,不是给我看一眼就关。 |
© 2026 第3组 · 张三 2025010301 · 李四 2025010302 · 动态网站设计期末作品
📋 实验报告:必须包含这四样
除了网站本身,还要交一份实验报告。报告不用长,但下面四样东西缺一不可:
| 必含内容 | 说明 |
|---|---|
| ① 网站网址 | 公网能打开的那个 http://...,确认手机用流量也能访问。 |
| ② 首页截图 | 截图里要能看到你们的名字和学号。 |
| ③ 网站介绍 | 这是个做什么的网站、用了哪个框架、有哪些功能。 |
| ④ 账号密码 | 如果前台 / 后台需要登录,把账号密码写进报告,让我能登进去看。 |
实验报告模板(点「复制」直接用)
========== 动态网站设计 · 期末大作业实验报告 ==========
一、小组信息
小组名称:
成员(姓名 + 学号):
张三 2025xxxxxx
李四 2025xxxxxx
二、网站信息
网站名称:
网站网址:http:// (确认电脑、手机都能打开)
使用框架:Flask / Django / Tornado / FastAPI(选一个)
项目简介:
(这是一个做什么的网站?有哪些功能?)
三、登录账号(如果网站需要登录就填,没有就写"无需登录")
前台:账号 密码
后台:账号 密码
四、首页截图
(在这里插入截图,截图里要能看到小组名字和学号)
五、一句话总结
(这学期我学会了……)
✅ 交之前,对着勾一遍(点一下打勾)
🎉 让你的网站,长长久久地活在公网上
这门课从一行 HTML 开始,到现在——你能让一个网站 7×24 跑在公网上,还能自己运维它。
把它做成你真正想做的样子,写进简历也不丢人。期待看到你们的作品。