这个问题其实可以拆成两个核心部分:怎么传上去 和 怎么访问。
很多刚入行的前端同学容易陷入一个误区:觉得只要把 dist 文件夹里的文件丢到服务器里,浏览器就能直接打开 HTML。这是不对的。静态资源部署的核心在于Web 服务器(Nginx/Apache)的配置,而不是简单的文件传输。
下面我按最主流、最稳妥的方案——Linux 云服务器 + Nginx 来拆解流程。如果你用的是 Windows Server 或者宝塔面板,逻辑是一样的,只是操作界面不同。
第一步:本地打包
确保你的构建工具(Webpack/Vite/CRA)已经正确配置了 publicPath 或 base。
- Vite: 检查
vite.config.js中的base: '/'(相对路径) 或base: '/your-app/'(绝对路径)。 - Webpack: 检查
output.publicPath。 - CRA: 默认通常是
/,如果需要子目录部署,需要修改package.json中的homepage字段。
执行 npm run build,生成 dist 文件夹。里面的结构通常长这样:
dist/
├── index.html
├── assets/
│ ├── js/
│ └── css/
└── ...
第二步:上传到服务器
你有几种方式可以把文件弄到服务器上,推荐前两种:
-
SFTP/SCP 客户端(推荐新手):
- 使用 WinSCP (Windows) 或 FileZilla / Cyberduck。
- 连接你的云服务器 IP,用 SSH 密钥或密码登录。
- 找到
/var/www/html或者你自己创建的目录(比如/opt/myapp),把dist文件夹里的内容拖进去。 - 注意:不要直接把整个
dist文件夹作为一个子目录扔进去,最好解压后把里面的文件放到目标目录下。
-
命令行 SCP/SFTP:
# 在本地终端执行 scp -r dist/* root@你的服务器IP:/opt/myapp/ -
CI/CD 自动化(进阶):
- 如果团队规模大了,建议用 GitHub Actions、GitLab CI 或者 Jenkins。代码 push 后自动触发构建并部署到服务器,避免手动上传出错。
第三步:安装并配置 Nginx(关键步骤)
这是大多数人卡住的地方。你直接把文件丢进 Apache 的 htdocs 也能跑,但生产环境几乎都用 Nginx,因为它性能好且配置灵活。
1. 安装 Nginx
以 CentOS/Alibaba Cloud Linux 为例:
yum install nginx -y
systemctl start nginx
systemctl enable nginx
2. 配置 Nginx
编辑配置文件,通常在 /etc/nginx/conf.d/default.conf 或者 /etc/nginx/nginx.conf。
场景 A:单页应用(SPA,如 Vue/React Router)
如果你的路由是 history 模式,必须配置 try_files,否则刷新页面会 404。
server {
listen 80;
server_name your_domain.com; # 或者填你的服务器IP
root /opt/myapp; # 指向你上传文件的目录
index index.html;
location / {
try_files $uri $uri/ /index.html; # 核心配置:所有找不到的文件都重定向到 index.html
}
# 可选:开启 gzip 压缩,提升加载速度
gzip on;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/json image/png image/jpeg;
}
场景 B:多页应用或多资源服务
如果只是纯静态展示,没有复杂的路由跳转:
server {
listen 80;
server_name your_domain.com;
root /opt/myapp;
index index.html;
location / {
autoindex on; # 可选:如果没写 index.html,会显示目录列表(生产环境建议关掉)
}
}
3. 重载配置
nginx -t # 检查配置是否有语法错误
nginx -s reload # 平滑重启
第四步:防火墙与安全组设置
这一步经常被忽略,导致你明明配好了,外面还是访问不了。
- 云厂商控制台:去阿里云/腾讯云/华为云的后台,找到“安全组”规则。确保 TCP 80 端口(HTTP)和 443 端口(HTTPS)是放行的。
- 系统防火墙:如果在服务器上自己开了
firewalld或ufw,也要放行 80 端口。# firewalld 示例 firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --reload
第五步:访问测试
打开浏览器,输入 http://你的服务器IP 或者绑定的域名。
- 如果看到你的网页,恭喜你,成功了。
- 如果出现 403 Forbidden:检查文件权限。Nginx 用户(通常是
nginx或www-data)需要有读取权限。chmod -R 755 /opt/myapp chown -R nginx:nginx /opt/myapp # CentOS 下可能是 www-data - 如果出现 空白页或 JS 报错:回到第一步,检查
publicPath是否正确。如果图片不显示,检查路径是否带了多余的斜杠。
常见问题排查 Tips
-
CSS/JS 加载失败(404):
- 90% 是因为打包时的
publicPath配置问题。如果是根路径部署,确保不是/./assets/...这种奇怪的路径。 - 检查 Nginx 的
root路径是否真的指向了你上传文件的父级目录。
- 90% 是因为打包时的
-
刷新页面 404:
- 确认你是否加了
try_files $uri $uri/ /index.html;。这是 SPA 应用的标配。
- 确认你是否加了
-
HTTPS 证书:
- 现在浏览器对 HTTP 有标记,建议申请免费 SSL 证书(Let’s Encrypt 或云厂商提供的)。
- 在 Nginx 中配置
listen 443 ssl;并指向证书文件即可。
-
缓存问题:
- 上线后更新代码,用户可能看不到新版本。建议在 Vite/Webpack 配置中开启文件名哈希(hash),这样每次构建生成的文件名都会变,浏览器会自动拉取新文件。
总结
流程就是:本地 Build -> SFTP 上传 -> Nginx 配置 root 和 try_files -> 开防火墙 -> 访问。
别把问题想得太复杂,核心就两点:文件得放对地方,Nginx 得告诉它怎么解析请求。尤其是 Vue/React 这类单页应用,try_files 那行配置是灵魂。
云技术博客