个人项目只跑在localhost?从0到1部署上线全流程(服务器+域名+Nginx+HTTPS)

0 阅读6分钟

一、为什么你的项目需要一个公网地址

面试的时候被问"你项目部署在哪",回答"我本地跑的"——这基本等于告诉面试官:你没碰过真实环境。

本地跑和线上跑,差的不是一个公网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地址能访问,但没人会记一串数字。买个域名,做一条解析:

  1. 去域名注册商买一个(.top/.xyz 域名一年十几块)
  2. 添加一条 A记录:@ → 你的公网IP
  3. 再加一条 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.1Nginx配置加三行header
域名没备案国内服务器域名打不开备案或用IP临时访问
证书过期浏览器红色警告certbot自动续期

九、写在最后

整个流程走下来,你会发现"部署上线"本身不难,难的是把每一步的坑都踩明白。这套流程跑通一次,以后任何项目上线都是同一个套路:服务器→环境→守护→域名→反代→HTTPS。

如果你还没有一台带公网IP的服务器来练手,可以先在芯飞云1元开通一台试用机,把这套流程完整跑一遍。从SSH连接到HTTPS小锁亮起来,全程不到一小时,但简历上"熟悉项目部署"这句话就真的立得住了。