项目部署步骤详解:从本地到上线的实用流程

项目部署前的准备工作

在把项目推到服务器之前,先把本地环境理清楚。比如你写了个基于 Node.js 的博客系统,开发时用 localhost:3000 跑得好好的,但线上能不能访问,取决于配置是否到位。先确认项目依赖都写进了 package.json,避免上线后因为少装一个包直接报错。

还有就是环境变量的问题。开发时数据库地址可能是本地的 127.0.0.1,但生产环境得换成远程数据库或 Docker 容器地址。把这些配置抽出来放在 .env 文件里,别硬编码在代码中,方便切换。

打包与构建

前端项目尤其需要注意这一步。React、Vue 这类框架开发时用的是热重载服务器,但上线必须走构建流程。执行 npm run build 后会生成一个 distbuild 目录,里面是压缩后的静态文件。

npm run build
# 输出结果一般类似:
# Compiled successfully!
# File sizes after gzip:
#   45.2 KB  build/static/js/main.1a2b3c.js

后端项目如果是 Go 或 Java,可能需要编译成可执行文件。Go 可以直接打包成二进制:

GOOS=linux GOARCH=amd64 go build -o server main.go

这样生成的 server 文件才能在 Linux 服务器上运行。

选择部署方式

小项目可以直接扔到 Nginx 静态目录下。比如你做的个人简历页,扔进 /var/www/html,重启 Nginx 就能访问。配置文件长这样:

server {
    listen 80;
    server_name example.com;
    root /var/www/html/dist;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

如果是前后端分离,前端仍由 Nginx 托管,后端 API 则用 PM2 或 systemd 管着。PM2 适合 Node.js 项目,启动后能自动监听崩溃并重启。

pm2 start app.js --name "my-api"

Java 项目常用 jar 包部署,配合 nohup 后台运行:

nohup java -jar myapp.jar --spring.profiles.active=prod > app.log 2>&1 &

域名与反向代理

买好域名后,在 DNS 服务商那把 A 记录指向你的服务器 IP。然后在服务器上配 Nginx 反向代理,把请求转发给后端服务。

比如你的 API 跑在 3001 端口,但不想让用户访问 example.com:3001,就可以用 Nginx 拦下来:

location /api {
    proxy_pass http://localhost:3001;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

这样用户访问 example.com/api/login,实际请求会打到本地 3001 端口的服务上。

HTTPS 加密不能少

现在浏览器对非 HTTPS 站点标“不安全”,影响体验。可以用 Let's Encrypt 免费申请证书,配合 Certbot 自动配置。

sudo certbot --nginx -d example.com

运行完之后,Nginx 会自动加上 SSL 配置,HTTP 请求也会被重定向到 HTTPS。证书每 90 天要续一次,可以加个定时任务自动处理:

0 0 */5 * * /usr/bin/certbot renew --quiet

日志与监控

项目跑起来不代表万事大吉。某天突然打不开,得知道哪里出问题。Nginx 的访问日志和错误日志默认在 /var/log/nginx/ 下,查 502 错误基本靠它。

后端服务如果用了 PM2,可以通过命令查看实时输出:

pm2 logs my-api

也可以把日志接入 ELK 或简单点用 tee 写入文件,方便排查。

偶尔跑个健康检查脚本,比如用 curl 请求关键接口,状态码不对就发邮件提醒,比等用户反馈快得多。