
毕设和课程设计往往需要一个能公网访问的地址,用于答辩演示、导师查看或作品展示。本文完成一个学生项目从本地到公网的部署,涵盖配置选择与成本控制、环境准备、常见技术栈(Java、Python、Node.js、前端)的部署方式、数据库配置、域名与 HTTPS、答辩前的稳定性检查,以及演示当天的应急预案。
先明确要部署什么
不同类型的项目部署方式差别很大:
项目类型 | 部署内容 | 说明 |
|---|---|---|
纯前端作品集 | 静态文件 | 最简单,只需 Web 服务器 |
前后端分离 | 前端静态文件 + 后端服务 | 需要处理跨域和接口地址 |
传统单体应用 | 应用服务 + 数据库 | 常见的毕设形态 |
带算法模型 | 应用服务 + 模型推理 | 资源需求较高 |
配置怎么选
学生项目的访问量通常很小,主要是自己测试、导师查看和答辩演示,几个人同时访问就是峰值。不需要高配置。
项目类型 | 建议配置 |
|---|---|
静态站点、作品集 | 2 核 2 GB |
前后端分离、单体应用 | 2 核 2 GB~2 核 4 GB |
带数据库和缓存 | 2 核 4 GB |
需要跑模型推理 | 按模型显存需求选择 GPU 规格 |
成本控制的几个实用建议
学生项目通常预算有限,有几点值得注意:
关于地域和备案,这一点影响项目排期
如果要用域名访问且服务器在中国内地,必须先完成 ICP 备案,备案通过后网站才能正常访问。备案需要域名已实名认证、服务器为包年包月且剩余时长满足要求,审核也需要时间。
对时间紧张的毕设项目,有两个务实选择:
不要在答辩前一周才开始考虑备案,时间上很可能来不及。
操作系统建议 Ubuntu 22.04 或 24.04,社区资料多,遇到问题容易搜到解决方案。
需要放通的端口:
端口 | 协议 | 用途 |
|---|---|---|
22 | TCP | SSH 登录(默认已放通) |
80 | TCP | HTTP 访问 |
443 | TCP | HTTPS 访问 |
应用端口 | TCP | 如 8080,直接用 IP 访问时需要 |
轻量应用服务器在实例详情页的「防火墙」页签点击「添加规则」,协议选 TCP、填入端口、策略选允许;云服务器 CVM 在安全组的「入站规则」中添加。
这里有个新手最常踩的坑:应用在服务器上跑起来了,本机 curl 也能访问,但从自己电脑的浏览器打不开。原因几乎都是端口没在控制台放通。系统内的防火墙和控制台的防火墙是两层,都要通。
登录服务器:
ssh root@服务器公网IP首次登录后建议先更新系统:
sudo apt update && sudo apt upgrade -y方式一:用容器部署(推荐)
如果项目已经有 Dockerfile,或者你愿意写一个,容器方式最省事——环境依赖都打包在镜像里,不会出现本地能跑服务器跑不起来的情况。
先安装 Docker:
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
newgrp docker以一个包含应用和数据库的项目为例,编写 compose.yaml:
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: 替换为强密码
MYSQL_DATABASE: myproject
MYSQL_USER: appuser
MYSQL_PASSWORD: 替换为强密码
volumes:
- db-data:/var/lib/mysql
restart: unless-stopped
app:
build: .
ports:
- "8080:8080"
environment:
DB_HOST: db
DB_NAME: myproject
DB_USER: appuser
DB_PASSWORD: 与上面保持一致
depends_on:
- db
restart: unless-stopped
volumes:
db-data:注意 DB_HOST: db 用的是容器服务名。填 localhost 一定连不上,因为在容器内这个地址指向容器自身,不是数据库容器。这是容器化部署最高频的错误。
启动:
docker compose up -d
docker compose ps
docker compose logs -f app方式二:直接在系统上部署
Java 项目(Spring Boot)
sudo apt install -y openjdk-17-jdk
java -version把打包好的 jar 文件上传到服务器:
scp target/myapp.jar root@服务器IP:/opt/myapp/配置为系统服务,这样断开 SSH 后程序仍在运行:
sudo tee /etc/systemd/system/myapp.service > /dev/null <<'UNIT'
[Unit]
Description=My Project
After=network.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -Xmx512m -jar /opt/myapp/myapp.jar
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
UNIT
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
sudo systemctl status myapp --no-pager-Xmx512m 限制 Java 堆内存。2 GB 内存的机器上不加限制,Java 可能占用过多内存导致系统卡死。
Python 项目(Django / Flask)
sudo apt install -y python3-pip python3-venv
cd /opt/myapp
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
pip install gunicorn不要用开发服务器跑正式演示。 Django 的 runserver 和 Flask 的内置服务器都是开发工具,性能和稳定性都不适合对外提供服务。用 Gunicorn 这类生产级服务器:
gunicorn -w 2 -b 127.0.0.1:8000 myproject.wsgi:application同样配置为系统服务,ExecStart 指向虚拟环境中的 gunicorn。
Node.js 项目
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
node -v安装依赖并构建:
cd /opt/myapp
npm ci --omit=dev
npm run build用进程管理工具保持运行:
sudo npm install -g pm2
pm2 start npm --name myapp -- start
pm2 startup
pm2 savepm2 startup 和 pm2 save 让应用在服务器重启后自动恢复。
纯前端项目
构建后把静态文件交给 Web 服务器:
sudo apt install -y nginx
sudo cp -r dist/* /var/www/html/前端路由使用 history 模式时,需要配置将未匹配的路径回退到入口文件,否则刷新子页面会 404:
location / {
try_files $uri $uri/ /index.html;
}如果不是容器化部署,需要单独装数据库:
sudo apt install -y mysql-server
sudo mysql_secure_installation安全向导中建议:启用密码强度校验、设置 root 密码、移除匿名用户、禁止 root 远程登录、删除测试库。
为项目创建独立的库和账号:
CREATE DATABASE myproject CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'appuser'@'localhost' IDENTIFIED BY '强密码';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX ON myproject.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;字符集必须用 utf8mb4。 MySQL 中的 utf8 只支持三字节字符,存不了 emoji 和部分生僻字。毕设项目里如果有用户输入内容,用错字符集会在演示时出现乱码或写入报错。
不要用 root 账号连数据库。 除了安全考虑,用受限账号还能避免代码里的误操作删掉整个库。
导入本地的数据结构和测试数据:
mysql -u appuser -p myproject < schema.sql
mysql -u appuser -p myproject < data.sql数据库端口不要对公网放通。 应用和数据库在同一台机器时,数据库只监听本机是最安全的。3306 端口对公网开放会立刻遭到扫描和爆破尝试。
直接暴露应用端口(如 8080)能用,但有几个问题:地址要带端口不好记、没有 HTTPS、多个服务无法共用 80 端口。用反向代理解决。
用 Nginx
sudo nano /etc/nginx/sites-available/myappserver {
listen 80;
server_name myproject.example.com;
client_max_body_size 50M;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}启用并重载:
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxnginx -t 先检查语法,避免配置错误导致服务起不来。
如果项目有文件上传功能,client_max_body_size 必须设够大。默认值很小,上传稍大的文件就会失败并返回 413,这在演示时很尴尬。
配置 HTTPS
有域名的话申请免费证书:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d myproject.example.com答辩演示强烈建议配 HTTPS。 浏览器会对 HTTP 页面标记"不安全",如果项目有登录功能,还会在密码框旁提示警告,演示时观感很差。
只用 IP 访问时无法申请受信任的证书,这种情况可以接受 HTTP,但要向老师说明这是演示环境的限制。
这一节是这篇文章最实用的部分。很多项目本身没问题,却在答辩当天出状况。
功能验证
稳定性验证
sudo reboot
# 等待重启后重新登录
sudo systemctl status myapp nginx mysql --no-pagerfree -h
sudo systemctl status myapp --no-pager数据准备
创建快照
答辩前给实例创建一份快照,这是最有效的保险。轻量应用服务器在实例详情页的「快照」页签点击「创建快照」,通常 5 分钟内完成且无需关机。
如果演示前项目出了问题,可以回滚到已知正常的状态。需要注意回滚会把整块系统盘恢复到快照时间点,之后的数据变更会被清除,运行中的实例会自动关机。使用存储型套餐的实例不支持创建快照。
准备应急预案
这一点很多人不做,但确实有用:
答辩现场的网络环境往往不受你控制,有备份方案会让你从容很多。
本机能访问,外网打不开
按顺序检查:控制台防火墙或安全组是否放通对应端口;应用监听地址是否为 0.0.0.0 而非仅 127.0.0.1(如果没用反向代理);系统内防火墙是否放通。
查看监听情况:
sudo ss -lntpSSH 断开后程序就停了
程序是在前台运行的。必须配置为系统服务或用进程管理工具托管,不要用 nohup 加 & 这种临时方式跑正式演示。
服务启动失败
查看日志定位:
sudo journalctl -u myapp -n 50 --no-pager
# 或容器部署
docker compose logs app --tail 50常见原因:端口被占用、配置文件路径错误、数据库连不上、依赖缺失、内存不足。
数据库连接失败
检查数据库服务是否运行、用户名密码是否正确、连接地址是否正确。容器化部署时地址应填容器服务名。
中文显示为乱码或问号
字符集问题。确认数据库、表、字段和应用连接配置都使用 utf8mb4。
页面样式丢失或接口请求失败
前后端分离项目中,前端配置的接口地址可能还指向本地的 localhost。检查前端构建时的接口地址配置,改为实际的公网地址或相对路径。
内存不足导致服务被终止
free -h
dmesg | grep -i "killed process"2 GB 内存的机器上跑 Java 应用加数据库会比较紧张。处理方式:限制 Java 堆内存、调小数据库缓冲池、或升级配置。
上传文件失败
检查反向代理的请求体大小限制和应用自身的上传配置,两处都要放宽。
如果项目要长期保留
如果项目答辩后不再需要
几条容易忽略的安全事项
学生项目常常在安全上比较随意,但它是公网可访问的,需要注意:
admin/123456 这类组合。关于数据合规
项目部署上线后,如果需要为它建立更完善的备份机制,或后续想把它作为长期作品维护,可以作为下一步方向。
学生项目和小型应用部署,轻量应用服务器的套餐式规格和可视化控制台比较适合上手,配合快照能在答辩前留一份保险;需要跑模型推理的项目可以考虑高性能应用服务 HAI 的 GPU 环境,备份归档可使用对象存储 COS。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。