在现代前端项目中,React 是非常流行的技术栈之一。但写完前端代码之后,很多人会卡在“怎样把 React 应用部署到 Linux 服务器上”这一步。本文将从头到尾讲清楚这一过程,包括准备、构建、部署、服务器配置、HTTPS 安全、自动化部署、运维与优化等环节,让你能在 Linux 上稳定、高效地运行 React 网站。
前期准备
选择服务器 & 操作系统:常用选择包括 Ubuntu、Debian、CentOS、Rocky Linux 等。本文后续示例以 Ubuntu 为主,但其他发行版思路一致。
获取服务器访问权限 & SSH 登录:使用非 root 用户并具备 sudo 权限
配置 SSH key 登录,禁用密码登录,提高安全性:若使用防火墙(如 UFW、firewalld),确保开放 HTTP(80)与 HTTPS(443)端口
本地环境准备:在本地机器安装 Node.js 和 npm / yarn
确保 React 应用在本地可正常运行、构建:若使用 React Router 或前端路由,要注意服务器如何处理页面刷新、404 路径等问题
生成生产构建(Build)
在本地 React 项目根目录执行:
npm run build
# 或者
yarn build
这个命令会将你的 React 应用打包成静态资源,输出到项目目录下的 build 或 dist 文件夹。这个产物是部署在服务器上的内容。
提示:如果你的 React 应用用了前端路由(例如 React Router 的 BrowserRouter 模式),建议在 package.json 添加 homepage 字段,或调整打包后的路径基础(publicPath / basename)以确保资源路径正确加载。
将构建产物上传到服务器
你可以使用以下方式将构建好的静态文件上传到服务器:
- scp(安全复制,例如 scp -r build/ user@server:/var/www/myapp)
- rsync(增量同步更快、更灵活)
- Git + CI/CD(服务器自动拉取构建产物)
- FTP / SFTP(不推荐用于生产环境)
将构建目录的内容(通常是 index.html、static/、CSS、JS 文件等)上传到服务器某个目录,比如 /var/www/myapp。
选择 Web 服务器 & 反向代理方案
静态文件可以直接用 Web 服务器(如 Nginx、Apache)来托管。对于更复杂的场景(带后台 API、SSR、反向代理等),可以用 Nginx 做反向代理或负载均衡。下面是两种典型方案:
1. 使用 Nginx 来托管静态 React 应用
在服务器上安装 Nginx:
sudo apt update
sudo apt install nginx
然后配置一个 Nginx “服务器块”(server block 或 virtual host),示例:
server {
listen 80;
server_name your-domain.com www.your-domain.com;
# React 构建目录
root /var/www/myapp;
index index.html;
location / {
# 如果请求的资源存在就直接返回,否则都指向 index.html
try_files $uri $uri/ /index.html;
}
# 可选:针对静态资源设置缓存策略
location ~* \.(js|css|png|jpg|jpeg|svg|gif|ico)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
然后启用该站点:
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
这个配置能保证当用户访问诸如 /about、/users/123 等前端路由地址时,服务器返回 index.html,由前端路由处理页面渲染。
2. 使用 Apache(可选方案)
如果你偏好 Apache,也可以用 Apache 来托管 React 应用。你需要:
- 将构建产物部署到 Apache 可访问目录(如 /var/www/html/myapp)
- 在 Apache 的虚拟主机配置中,使用 RewriteRule 对路径进行重写,让所有非资源请求指向 index.html
- 保证 .htaccess 或 vhost 中加入类似 FallbackResource /index.html 或者 mod_rewrite 重写规则
不过相比 Nginx,Apache 在处理静态文件方面可能不如 Nginx 高效。
配置 HTTPS / SSL(强烈建议)
在公网环境下,使用 HTTPS 协议几乎是必须的。以下是获取和部署 Let’s Encrypt 免费 SSL 证书的基本步骤:
安装 Certbot(Let’s Encrypt 客户端)以及 Nginx 插件
sudo apt install certbot python3-certbot-nginx
申请 SSL 证书
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
Certbot 会自动修改对应 Nginx 配置,将 HTTP 重定向到 HTTPS、生成证书配置段等。
最后,确认证书自动续期:
sudo certbot renew --dry-run
这样,当用户访问 https://your-domain.com 时,就能使用加密连接,并且浏览器不会报 “不安全” 警告。
前端 + 后端整合 / 代理转发
很多现实项目并不仅仅是纯静态的 React 页面,还会有后台 API、WebSocket、上传接口等。这时通常采用以下方式整合:
将 API 请求路径由 React 应用发往某个前端路径(如 /api),然后在 Nginx 中配置反向代理,将 /api 请求转发到后台服务(如 Node.js、Express、Go、Python 等)
前后端分离时,可以在 Nginx 中为 React 静态文件和 API 请求分别配置不同的 location
若后台服务运行在内网端口(如 3000),Nginx 转发到 http://127.0.0.1:3000
在构建 React 应用时,注意 API 地址的环境切换(开发环境 / 生产环境)
示例 Nginx 配置:
server {
listen 80;
server_name your-domain.com;
root /var/www/myapp;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location /api/ {
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;
}
}
这样,访问 https://your-domain.com/api/users 会被转发到后台服务,而访问 https://your-domain.com/about 等页面则被 React 前端处理。
后台服务与进程管理
如果你的 React 应用中还包含服务器端渲染 (SSR) 或有一个 Node.js 后端在同一台机器上运行,你需要使用进程管理工具保持后台服务长期运行、自动重启、日志管理等。
常见工具:
- PM2:Node.js 应用常用进程管理工具
- systemd:Linux 原生服务管理,用于把服务作为系统服务启动
- Forever、Nodemon(开发环境用)
以 PM2 为例:
npm install -g pm2
# 启动后台服务,例如 API 服务
pm2 start server.js --name myapi
# 启动 React SSR 服务(如果有的话)
pm2 start ssr.js --name myapp-ssr
# 查看状态
pm2 list
# 设置开机自启动
pm2 startup
pm2 save
若只是前端静态资产(无 SSR 或 Node 服务),则不需要对 React 部分用 PM2;只需让 Nginx 或 Apache 提供静态服务即可。
自动化部署 / CI-CD
手动上传构建产物适合小型项目或首次部署,但对于持续迭代的前端项目,更推荐采用自动化部署流程。核心思路:
- 代码推送到 Git 仓库(如 GitHub、GitLab、Bitbucket)
- 在 CI 中定义构建脚本(例如 npm run build)
- 构建完成后,将构建产物通过 SSH、rsync、FTP 或者使用一些部署工具(如 Ansible、Capistrano、GitHub Actions、GitLab CI/CD)发送到服务器
- 在服务器端,自动执行 Nginx 重载、缓存清理、版本回滚等操作
- 这种方式可以让你每次提交代码后自动部署,减少人工错误与运维负担。
性能优化与缓存策略
在生产环境中,要尽量让 React 网站运行得更快、更稳定。以下是一些常见优化策略:
- 开启 gzip / brotli 压缩:在 Nginx 中启用压缩响应,减小静态资源体积
- 缓存头设置:对静态资源设置较长的 Cache-Control、ETag、Last-Modified 等
- 资源指纹 / 哈希包名:构建产物文件名带哈希值(如 main.abcdef.js),用户旧资源不被重复缓存
- CDN 加速:对于静态资源,可以用 CDN 分发,提高全球访问速度
- 懒加载 / 代码拆分 (code splitting):减少首屏加载资源,按需加载
- 图片 / 静态资源压缩 / 优化:对图片、SVG、字体文件做压缩和优化处理
- 开启 HTTP/2 或 HTTP/3(如果支持):多个并行请求性能更好
监控、日志与安全
为了确保服务平稳运行,还应考虑以下运维层面的内容:
- 访问日志与错误日志:配置 Nginx 或 Apache 的日志,结合 ELK、Prometheus、Grafana 等工具做监控
- 异常监控:对于 React 前端错误,可以接入 Sentry 或类似的前端错误捕获平台
- SSL 证书监控与自动续期
- 强制 HTTPS、HSTS:在 HTTP 响应头强制启用 HSTS,避免中间人攻击
- 防火墙策略:使用 UFW / iptables / firewalld 限制不必要的端口访问
- 定期备份:代码、配置、证书、日志等要有备份策略
- 升级与安全补丁:定期更新系统、Web 服务器、依赖包
在 Linux 上部署 React 网站虽然涉及多个环节(构建、传输、服务器配置、HTTPS、反向代理、自动化、运维等),但每一步都是相对清晰的流程。掌握这个流程后,你就可以将 React 项目稳定地部署上线,并具备在生产环境中运行与维护的能力。