如何将一个 pnpm 项目(例如 monorepo 结构,有 apps/web-ele 子项目)打包后部署到阿里云服务器并运行
本地服务器# 写好配置访问打开http://<服务器IP>或者绑定域名访问。
·
本地有一个 Monorepo 项目(用 pnpm 管理),例如结构大致如下:
askein/ # 根目录
apps/
web-ele/ # 要部署的前端应用
packages/
@askein-core/design # 项目的一个包(组件库)
pnpm-workspace.yaml
package.json
1. 确认你的环境
本地
- Node.js 已安装(推荐 LTS 版本,比如 18.x)
- pnpm 已安装(
npm install -g pnpm)
服务器(阿里云 ECS)
- 系统:常见的 CentOS / Ubuntu
- 要有 SSH 登陆权限(最好绑定了 SSH key)
- 能访问公网
- Node.js + npm/pnpm(可选:也可以本地打包再传上去)
2. 本地打包
你的 monorepo 项目使用 pnpm,要打包一个子应用(比如 apps/web-ele),可以这样:
# 进入项目根目录
cd askein
# 安装依赖
pnpm install
# 构建项目(只构建 web-ele 及其依赖)
pnpm build --filter ./apps/web-ele
或者如果 @askein-core/design 是依赖:
pnpm build --filter @askein-core/design
pnpm build --filter ./apps/web-ele
注意
- 有些 monorepo 项目会同时构建依赖包,所以建议先构建依赖包再构建应用。
- 构建结果通常会在
apps/web-ele/dist或build目录,具体看你的框架(React/Vite/Next.js)。
3. 部署到阿里云的方式(推荐两种)
方法一:本地打包 + 上传产物(推荐静态网站)
适合前端 SPA 或 SSR 编译产物
① 打包本地前端代码
pnpm build --filter ./apps/web-ele
假设生成的目录是:
apps/web-ele/dist
② 上传到阿里云服务器(用 scp)
# username 改成你的云服务器用户名,server-ip 改成你的公网 IP
scp -r apps/web-ele/dist username@server-ip:/home/username/web-ele
1. 确认系统版本
先看看你服务器的系统类型:
cat /etc/os-release
如果看到类似 Alibaba Cloud Linux 或 CentOS,那确实是基于 yum/dnf 的系统。
2. 安装 nano(可选)
默认 nano 没有,你可以装一下:
sudo yum install nano -y
如果你习惯 vi,可以直接用:
vi 文件路径
3. 安装 Nginx
sudo yum install nginx -y
4. 上传前端打包产物
在你本地项目中:
# 安装依赖
pnpm install
# 构建依赖包(如果有的话)
pnpm build --filter @askein-core/design
# 构建 web-ele 应用
pnpm build --filter ./apps/web-ele
构建产物通常会在:
apps/web-ele/dist
上传到服务器:
scp -r apps/web-ele/dist admin@你的IP:/home/admin/web-ele
(admin 是服务器 SSH 用户名)
5. 配置 Nginx
在阿里云 Linux / CentOS 中,推荐把站点配置放到:
/etc/nginx/conf.d/web-ele.conf
用 vi 编辑:
sudo vi /etc/nginx/conf.d/web-ele.conf
写入:
server {
listen 80;
server_name _;
root /home/admin/web-ele;
index index.html;
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;
location / {
try_files $uri /index.html;
}
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# API 代理(如果需要)
location /api/ {
proxy_pass http://localhost:8080/api/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# WebSocket 代理
location /ws/ {
proxy_pass http://localhost:8080/ws/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location = /ws {
proxy_pass http://localhost:8080/ws;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
}
保存退出:
- 按
i→ 输入内容 - 按
Esc→ 输入:wq→ 回车
6. 启动 Nginx
sudo systemctl enable nginx # 开机自启
sudo systemctl start nginx # 启动
sudo systemctl restart nginx # 重启
7. 阿里云安全组放行 80 端口
登录 阿里云控制台,在 ECS 实例 安全组规则 中添加入方向规则:
- 端口范围:
80/80 - 授权对象:
0.0.0.0/0
8. 测试访问
在浏览器访问:
http://你的公网IP
如果绑定了域名并解析到 IP,就可以直接用域名访问。
更多推荐
所有评论(0)