静态网站(纯 HTML/CSS/JS,无需服务端语言执行)是最容易在 VPS 上部署的网站类型:不依赖数据库、不需要运行时,只要把文件放到正确目录、让 Nginx 托管即可。本文从文件上传到 SSL 与缓存配置,完整演示在搬瓦工 VPS 上部署静态网站的全流程。
本文要点
- 三种把文件上传到 VPS 的方式(scp、rsync、Git)
- Nginx 静态托管配置的核心指令
- 一键签发 SSL 证书并启用 HTTPS
- 静态文件缓存策略配置
- 常见部署问题排查
准备工作
- 搬瓦工 VPS 已安装 Nginx 并可正常访问
- 域名 A 记录已解析到 VPS IP
- 本地已构建好静态网站文件(如运行过
npm run build等)
三种上传方式
方式一:scp(简单直接)
# 上传本地 dist/ 目录到 VPS(注意替换 IP 和路径)
scp -r ./dist/* root@123.45.67.89:/var/www/mysite/
# 非默认端口(如 KiwiVM 分配的端口)
scp -P 12345 -r ./dist/* root@123.45.67.89:/var/www/mysite/方式二:rsync(增量同步,推荐)
# rsync 只传变化的文件,大网站更新快
rsync -avz --delete ./dist/ root@123.45.67.89:/var/www/mysite/
# 非默认 SSH 端口
rsync -avz --delete -e 'ssh -p 12345' ./dist/ root@123.45.67.89:/var/www/mysite/方式三:Git(适合持续部署)
# 在 VPS 上克隆仓库(适合有构建产物仓库的项目)
cd /var/www
git clone https://github.com/yourname/yoursite.git mysite
# 后续更新
cd /var/www/mysite && git pull推荐使用 rsync
rsync 有增量传输能力,只传改动的文件,对文件数多的网站更快。结合
--delete 参数,还能自动删除 VPS 上已不存在的旧文件,保持目录同步。Nginx 静态托管配置
创建 /etc/nginx/sites-available/mysite.conf:
server {
listen 80;
listen [::]:80;
server_name mysite.com www.mysite.com;
root /var/www/mysite;
index index.html;
# SPA(单页应用)路由支持:未匹配路径回落到 index.html
location / {
try_files $uri $uri/ /index.html;
}
# 静态资源缓存
location ~* \.(css|js|png|jpg|jpeg|gif|webp|ico|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
access_log off;
}
access_log /var/log/nginx/mysite.access.log;
error_log /var/log/nginx/mysite.error.log;
}# 启用配置
ln -s /etc/nginx/sites-available/mysite.conf /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginxSPA 与普通静态站的区别
React、Vue、Angular 等框架构建的 SPA 需要把所有路径都回落到
index.html,用 try_files $uri $uri/ /index.html;。普通多页静态站用 try_files $uri $uri/ =404; 即可。申请 SSL 证书
certbot --nginx -d mysite.com -d www.mysite.com
# Certbot 自动修改配置并 reload设置目录权限
# 网站目录属主设为 www-data(Nginx 运行用户)
chown -R www-data:www-data /var/www/mysite
chmod -R 755 /var/www/mysite常见问题对照表
| 问题 | 原因 | 解决 |
|---|---|---|
| 403 Forbidden | 目录权限不对或缺少 index 文件 | chmod 755;确认 index.html 存在 |
| 404 Not Found(SPA) | 路由未回落到 index.html | try_files $uri $uri/ /index.html |
| 资源加载 404 | 构建产物路径与 root 不符 | 确认上传目录与 root 指向一致 |
| HTTPS 访问报证书错误 | 域名解析未生效时提前签发 | 等待解析生效后再运行 certbot |
自动化部署思路
可以在本地写一个简单的部署脚本,每次构建后一条命令完成上传与热更新:
#!/bin/bash
set -e
npm run build
rsync -avz --delete -e 'ssh -p 12345' ./dist/ root@123.45.67.89:/var/www/mysite/
echo 'Deploy complete!'小结
- rsync 增量同步是最佳上传方式,
--delete保持目录清洁 - SPA 用
try_files ... /index.html;普通多页站用=404 - 上传后设好目录权限,再用 certbot 签发 SSL
- 写部署脚本,一键完成构建+上传
常见问题
Vue/React 打包后部署显示 404 怎么解决?
SPA 框架使用前端路由,所有路径都应由 index.html 处理。在 Nginx location / 块中使用 try_files $uri $uri/ /index.html; 即可解决刷新 404 问题。
每次部署都要手动 reload Nginx 吗?
不需要。只要是静态文件替换,Nginx 读取的是磁盘文件,替换后刷新浏览器即可看到新内容。只有修改了 Nginx 配置文件才需要 reload。
能用 GitHub Actions 自动部署吗?
可以。在 Actions 里配置 secrets(SSH 私钥),步骤:checkout → build → rsync 到 VPS,实现 push 代码后自动部署。