期末大作业 · 把学过的,搭成你自己的网站

最后两次课做两件事:先教你让网站 7×24 活在公网上(关终端也不掉线、想关就关、乱了能归零),再讲清大作业怎么做、怎么评分

🎯 目标:交一个能打开、能登录、首页有你名字的网站

先治一个要命的毛病:为什么关掉终端,网站就打不开了?

你在云服务器上敲一行命令(比如 python manage.py runserver 0.0.0.0:8000),浏览器一访问,网站出来了,很开心。然后你关掉 SSH 窗口、或者笔记本合盖断网——再访问,网站就 502、打不开了。

💬 人话翻译:终端是程序的「家长」
你在终端里启动的程序,是这个终端窗口的「孩子」。窗口(或这次 SSH 连接)就是它的「家长」。你一关窗口、一断开连接,系统会给这些孩子发一个「挂断」信号,孩子们就跟着一起退出了。所以网站才会停——不是它坏了,是被一起带走了。

前半节课就教三招治这个病,后半节课讲大作业:

  • ① 后台运行:让网站脱离终端,关窗口、断 SSH 都不停。
  • ② 查看 & 关闭:想知道现在跑着哪些网站、想关哪个就精准关哪个。
  • ③ 一键归零:万一起了一堆东西、自己都不知道开了啥,一条命令重来。
PART 1 让网站一直活着
1 后台运行

nohup:关掉终端也不掉线

你现在的启动命令,是「前台运行」——程序占着这个窗口,窗口一关它就走。要让它留下来,给命令加上 nohup& 两件「装备」。

先认清你平时的启动命令

你用的框架平时(前台)启动命令
Flaskpython app.py
Djangopython manage.py runserver 0.0.0.0:8000
Tornadopython server.py
FastAPIuvicorn main:app --host 0.0.0.0 --port 8000

套上「不掉线」公式

nohup 你平时的启动命令 > web.log 2>&1 &
nohup「no hang up」=忽略那个「挂断」信号,关窗口也不退出。
&把程序丢到后台跑,让你的终端能继续敲别的命令。
> web.log 2>&1把程序的所有输出(正常的 + 报错的)都写进 web.log 文件,方便以后查问题。

四个框架照着抄

框架后台启动命令(关终端也不停)
Flasknohup python app.py > web.log 2>&1 &
Djangonohup python manage.py runserver 0.0.0.0:8000 > web.log 2>&1 &
Tornadonohup python server.py > web.log 2>&1 &
FastAPInohup uvicorn main:app --host 0.0.0.0 --port 8000 > web.log 2>&1 &
SHELL
# 以 Django 为例,其他框架换成上表对应那行即可
$ nohup python manage.py runserver 0.0.0.0:8000 > web.log 2>&1 &
[1] 12345   ← 12345 就是这个网站的进程号(PID),先记一下

$ # 现在可以放心关掉 SSH 窗口了,网站还在跑

验证一下:它真活着吗?

SHELL
$ tail -f web.log         # 实时看网站日志,启动成功 / 报错都在这里(Ctrl+C 退出查看)
Starting development server at http://0.0.0.0:8000/

$ # 然后浏览器打开  http://你的公网IP:8000  能看到网站,就成了
⚠️ 最容易踩的坑:改了代码,网页却没变
后台跑的是启动那一刻的代码。你改完代码,不会自动生效。正确习惯是:先把旧进程关掉(看下一节),再重新 nohup 启动一次。否则你访问到的永远是老版本。
2 查看 & 关闭

想关哪个,就精准关哪个

第一步:看看现在跑着什么

SHELL
$ 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 端口现在是谁在用」:
SHELL
$ lsof -i:8000
COMMAND   PID  USER   ...   NAME
python  12345  root   ...   *:8000 (LISTEN)   ← 8000 端口被 PID 12345 占着

$ # 没装 lsof?用这条也行:
$ netstat -tlnp | grep 8000

第二步:关掉它

SHELL
$ 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 单个更省心。
3 一键归零

reboot:乱成一团时,重启重来

调试到后面,你可能起了一堆东西:网站起了好几遍、端口被占、自己也记不清开了啥。这时与其一个个排查,不如重启服务器——所有你手动起的程序,统统清零,干干净净从头来。

SHELL
$ sudo reboot          # 重启整台服务器
Connection to xxx.xxx.xxx.xxx closed.   ← SSH 会断开,正常现象

$ # 等 30 秒 ~ 1 分钟,再重新 SSH 连上去
🔁 重启后,谁会回来、谁不会
  • 会自动回来:MySQL 数据库这类「系统服务」,开机自动启动,不用管。
  • 不会自动回来:你用 nohup 起的网站。重启后是关着的,要再 nohup 启动一遍。这正是「归零」的意义——只留你想留的。
🚫 什么时候千万别 reboot
有人正在访问你的网站时、老师正在批改时,别重启。重启 = 网站短暂打不开。改完代码想生效,优先用第 ② 节的 kill + 重新 nohup,没必要动整台服务器。
💡 进阶 · 选修(不强制)
想让网站像 MySQL 那样「开机自动启动」、再也不用手动 nohup?了解一下 systemd:给网站写一个 .service 文件,再 systemctl enable 一下就行。这超出本课要求,感兴趣可以课后自己查,做出来是加分项。
PART 2 期末大作业

🏁 大作业:做一个属于你们自己的网站

前面第 12–15 章那四个项目(博客 / 学生管理 / BBS / 小程序后台),只是给你看路怎么走,不是要你一字不差照抄。这次大作业,我希望你们做出一个真正属于自己的东西。

📌 一句话要求
用本学期学过的任意一个框架(Flask / Django / Tornado / FastAPI),做一个网站,部署到公网上,让任何人点开网址就能用。不限内容、不限主题、不限框架。

三条路线,任选其一

路线 A

照着改

拿课上的项目当骨架,换成你自己的主题,再加一两个新功能。最稳妥,适合想先及格的同学。

路线 B

全新做

自己想一个点子,从零搭起来。最推荐,原创度高,分数有惊喜。

路线 C

升级别人的

在网上找个好玩的开源小项目,读懂它、改造它、部署上线。有挑战,也很练真本事。

没思路?随便挑一个当起点

📝个人博客 / 作品集 🖼️班级相册 / 社团报名 💬表白墙 / 树洞留言板 🗳️投票 / 打卡 / 选课工具 📚书影音清单管理 🌤️天气 / 查询类 API 🎮答题 / 猜成语小游戏后台 🛒二手交易 / 失物招领

几人一组、做大做小都行,但记得把网站用 nohup 跑在后台——交作业那几天,我会随时点开你们的网址,必须能打开。

⭐ 考核标准:先记住这条铁律

首页没有名字 = 没有分数
网站首页(或页脚显眼处)必须写上:小组名称 + 每位成员的姓名和学号。这是证明「这个网站是你们组做的」的唯一方式。放页脚、放首页角落都行,能让我一眼看到就算数。

除了这条硬性要求,评分大致看这几个方面,心里有数即可:

看什么说明
能不能打开我点开网址,网站正常运行(这就是为什么前面要学 nohup)。
功能完整度该有的功能跑得通,不是只有一个空壳首页。
原创与用心不是原封不动照抄课件;有自己的主题、设计、想法。
部署稳定交作业期间一直在线,不是给我看一眼就关。
💬 名字学号放哪里?给个最简单的做法
在你网站每个页面底部的页脚里写一行就行,例如:
© 2026 第3组 · 张三 2025010301 · 李四 2025010302 · 动态网站设计期末作品

📋 实验报告:必须包含这四样

除了网站本身,还要交一份实验报告。报告不用长,但下面四样东西缺一不可

必含内容说明
① 网站网址公网能打开的那个 http://...,确认手机用流量也能访问。
② 首页截图截图里要能看到你们的名字和学号
③ 网站介绍这是个做什么的网站、用了哪个框架、有哪些功能。
④ 账号密码如果前台 / 后台需要登录,把账号密码写进报告,让我能登进去看。
⚠️ 关于账号密码
只要你的网站有任何「需要登录才能看」的地方(比如后台管理、用户中心),就一定要在报告里写清楚账号密码。否则我登不进去,看不到的功能=没做,会影响分数。

实验报告模板(点「复制」直接用)

实验报告 · 模板
========== 动态网站设计 · 期末大作业实验报告 ==========

一、小组信息
    小组名称:
    成员(姓名 + 学号):
        张三   2025xxxxxx
        李四   2025xxxxxx

二、网站信息
    网站名称:
    网站网址:http://            (确认电脑、手机都能打开)
    使用框架:Flask / Django / Tornado / FastAPI(选一个)
    项目简介:
        (这是一个做什么的网站?有哪些功能?)

三、登录账号(如果网站需要登录就填,没有就写"无需登录")
    前台:账号                密码
    后台:账号                密码

四、首页截图
    (在这里插入截图,截图里要能看到小组名字和学号)

五、一句话总结
    (这学期我学会了……)

✅ 交之前,对着勾一遍(点一下打勾)

网站已用 nohup 跑在后台,关掉 SSH 后、用手机流量也能打开
首页或页脚能看到 小组名称 + 全部成员姓名和学号
如果要登录,账号密码已经写进实验报告
实验报告里有 网址、截图、网站介绍
截图里 能看到名字和学号
网址我直接点开就能访问,不用你在旁边帮忙开机

🎉 让你的网站,长长久久地活在公网上

这门课从一行 HTML 开始,到现在——你能让一个网站 7×24 跑在公网上,还能自己运维它。

把它做成你真正想做的样子,写进简历也不丢人。期待看到你们的作品。