一、为什么你的项目需要一个公网地址
面试的时候被问"你项目部署在哪",回答"我本地跑的"——这基本等于告诉面试官:你没碰过真实环境。
本地跑和线上跑,差的不是一个公网IP,而是一整套工程能力:进程守护、反向代理、域名解析、HTTPS证书、防火墙策略。这些东西在本地localhost永远学不到,但又是每个后端开发的必修课。
这篇文章就把个人项目从0到1部署上线的完整流程走一遍。我用一个 Node.js + MySQL 的个人项目做演示,但流程对 Python、Java、Go 项目完全通用——换掉启动命令就行。
先说整体路径,一共六步:
准备服务器 → 环境搭建 → 代码上传启动 → 域名解析 → Nginx反代 → HTTPS证书
每一步都有坑,我把踩过的都标出来了。
二、第一步:准备一台带公网IP的服务器
部署的前提是有一台公网可访问的服务器。没有公网IP,一切免谈。
我在芯飞云开了一台试用机做演示,选的 Ubuntu 22.04 系统。这里有个细节要注意:买服务器一定要确认带公网IP。有些厂商的低价机型不带公网IP,买了才发现外部根本访问不了,还得额外买弹性IP,算下来更贵。芯飞云的机器是自带公网IP的,省了这一步。
拿到服务器后第一件事不是装环境,而是做基础安全配置:
# 更新系统
apt update && apt upgrade -y
# 创建部署用户,别直接用root跑应用
adduser deploy
usermod -aG sudo deploy
# 配置SSH密钥登录(比密码安全得多)
# 在本地执行:
ssh-copy-id deploy@你的公网IP
# 然后禁用密码登录
vim /etc/ssh/sshd_config
# PasswordAuthentication no
systemctl restart sshd
避坑:云厂商的安全组默认可能只开了22端口。部署Web应用前,记得去控制台把80和443端口放行,不然Nginx配得再对也访问不了。
三、第二步:搭建运行环境
以 Node.js 项目为例,装 Node 和 MySQL:
# 安装Node.js(用nvm管理版本,别用apt装的老版本)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
nvm install 18
# 安装MySQL
apt install mysql-server -y
mysql_secure_installation # 设置root密码,按提示走
# 创建项目数据库
mysql -u root -p
CREATE DATABASE myapp CHARACTER SET utf8mb4;
CREATE USER 'appuser'@'localhost' IDENTIFIED BY '你的密码';
GRANT ALL ON myapp.* TO 'appuser'@'localhost';
Python 项目同理:装 Python + venv + pip install。Java 项目:装 JDK + Maven。核心思路一样——运行时版本用官方推荐方式装,别用系统源里的老版本。
四、第三步:上传代码并让它在后台跑起来
代码上传最简单的方式是 git:
su - deploy
git clone https://github.com/你的用户名/你的项目.git
cd 你的项目
npm install
然后是关键一步:让进程在后台持续运行。很多人用 npm start & 或者 nohup,但进程崩了不会自动拉起。生产环境应该用进程管理工具:
# 安装pm2(Node项目专用进程守护)
npm install -g pm2
# 启动应用
pm2 start app.js --name myapp
# 设置开机自启
pm2 save
pm2 startup
Python 项目用 systemd 或 supervisor,效果一样:进程挂了自动重启、服务器重启后自动拉起。
验证一下本地能不能通:
curl http://localhost:3000
# 有响应说明应用跑起来了
但这时候外网还访问不到——因为3000端口没开,也不应该开。真正的入口交给Nginx。
五、第四步:域名解析
IP地址能访问,但没人会记一串数字。买个域名,做一条解析:
- 去域名注册商买一个(.top/.xyz 域名一年十几块)
- 添加一条 A记录:
@ → 你的公网IP - 再加一条 CNAME记录:
www → @(让www前缀也能访问)
解析生效一般几分钟到半小时。用 ping 你的域名 验证,返回你的公网IP就说明生效了。
避坑:域名解析生效前别急着配Nginx,否则排查半天发现是DNS没生效,白折腾。国内服务器用域名还需要备案,如果不想备案,可以用海外节点或者暂时用IP+端口访问。
六、第五步:Nginx反向代理
Nginx是整个部署的核心:接收80端口的HTTP请求,转发给本地的应用进程。
apt install nginx -y
配置文件放在 /etc/nginx/sites-available/myapp:
server {
listen 80;
server_name 你的域名.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
启用配置:
ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
nginx -t # 测试配置语法
systemctl reload nginx
这时候浏览器访问 http://你的域名.com,应该就能看到项目了。
避坑:
proxy_set_header这三行别省。不加的话,你的应用拿到的客户端IP永远是127.0.0.1,做限流、日志统计全废。
七、第六步:HTTPS证书(免费)
HTTP在浏览器里会标"不安全",上HTTPS是最后一步。用 Let's Encrypt 的免费证书,certbot一键搞定:
apt install certbot python3-certbot-nginx -y
# 自动申请证书并修改Nginx配置
certbot --nginx -d 你的域名.com -d www.你的域名.com
certbot会自动帮你把Nginx的80端口重定向到443,并配上证书路径。装完之后访问 https://你的域名.com,浏览器地址栏就是小锁了。
证书有效期90天,certbot装完会自动加定时续期任务,不用操心:
# 验证自动续期
certbot renew --dry-run
八、全流程避坑清单
把踩过的坑汇总一下,对照检查:
| 坑 | 现象 | 解决 |
|---|---|---|
| 安全组没开端口 | 浏览器一直转圈 | 控制台放行80/443 |
| 用root跑应用 | 被入侵后全盘沦陷 | 建deploy用户+密钥登录 |
| 进程没守护 | SSH断开应用就停 | pm2/systemd守护 |
| 忘加proxy_set_header | 应用拿到的IP全是127.0.0.1 | Nginx配置加三行header |
| 域名没备案 | 国内服务器域名打不开 | 备案或用IP临时访问 |
| 证书过期 | 浏览器红色警告 | certbot自动续期 |
九、写在最后
整个流程走下来,你会发现"部署上线"本身不难,难的是把每一步的坑都踩明白。这套流程跑通一次,以后任何项目上线都是同一个套路:服务器→环境→守护→域名→反代→HTTPS。
如果你还没有一台带公网IP的服务器来练手,可以先在芯飞云1元开通一台试用机,把这套流程完整跑一遍。从SSH连接到HTTPS小锁亮起来,全程不到一小时,但简历上"熟悉项目部署"这句话就真的立得住了。