Strapi 作为一个强大的开源无头 CMS,在本地开发时体验极佳,但将其部署到生产环境时,许多开发者都会遇到权限错乱、内存溢出、进程崩溃等问题。
本文将结合实战经验,为你提供一份保姆级的 Strapi 生产环境部署指南。我们将从系统用户隔离、文件权限修复、内存优化,一路讲到 PM2 进程守护与 Nginx 反向代理,帮你彻底避坑。
一、 安全基石:创建专用系统用户
出于安全考虑,绝对不要使用 root 用户运行 Strapi。一旦服务被攻破,攻击者将直接获取服务器最高权限。
1. 创建并切换用户
创建一个专用的 strapi 用户组及用户,并允许其登录:
sudo groupadd strapi
sudo useradd -m -g strapi -s /bin/bash strapi
su - strapi
2. 配置 SSH 拉取代码
在 strapi 用户下生成 SSH 密钥,并将公钥添加到 GitHub,实现免密拉取代码:
ssh-keygen -t ed25519 -C "your_email@example.com"
cat ~/.ssh/id_ed25519.pub
3. 自定义 npm 缓存与全局路径
为了避免全局安装包时遇到 EACCES: permission denied 错误,我们将 npm 目录重定向到用户主目录:
mkdir -p ~/.npm-global ~/.npm-cache
npm config set prefix '~/.npm-global'
npm config set cache '~/.npm-cache'
编辑 ~/.bashrc,在末尾添加 export PATH=~/.npm-global/bin:$PATH,然后执行 source ~/.bashrc 生效。
二、 权限修复:告别 755 与 700 的误区
在宝塔等面板中,如果误将项目目录权限全部改为 755,或者为了修复 node_modules 报错而盲目赋予 700 权限,都会带来严重的安全隐患或运行异常。
1. 精准重置项目权限
正确的做法是区分“目录”和“文件”。首先确保项目属主为 strapi 用户:
sudo chown -R strapi:strapi /www/wwwroot/strapi/api.mohaishibei.com2/strapi-bookreview
接着,使用 find 命令精准赋权:
# 目录设为 755(允许读取、写入和执行/进入)
find /www/wwwroot/strapi/api.mohaishibei.com2/strapi-bookreview -type d -exec chmod 755 {} \;
# 普通文件设为 644(仅所有者读写,其他人只读,移除执行权限)
find /www/wwwroot/strapi/api.mohaishibei.com2/strapi-bookreview -type f -exec chmod 644 {} \;
2. 为 Strapi 核心目录单独授权
Strapi 运行需要写入缓存、上传文件和日志,这些目录需要赋予 775 权限:
chmod -R 775 /www/wwwroot/strapi/api.mohaishibei.com2/strapi-bookreview/public/uploads
chmod -R 775 /www/wwwroot/strapi/api.mohaishibei.com2/strapi-bookreview/.cache
chmod -R 775 /www/wwwroot/strapi/api.mohaishibei.com2/strapi-bookreview/logs
3. 修复 node_modules 执行权限
如果 npm run start 报错提示缺少执行权限,切勿对整个 node_modules 执行 chmod 700。真正需要执行权限的仅仅是 .bin 目录下的可执行脚本(如 strapi, cross-env):
chmod +x /www/wwwroot/strapi/api.mohaishibei.com2/strapi-bookreview/node_modules/.bin/*
若依然报错,最稳妥的方案是清理缓存并重装:npm cache clean --force && rm -rf node_modules && npm install。
4. 保护敏感配置
收紧包含数据库密码、API 密钥的 .env 文件权限:
chmod 600 /www/wwwroot/strapi/api.mohaishibei.com2/strapi-bookreview/.env
三、 内存优化:解决构建 OOM 问题
Strapi 在构建管理后台时,Node.js 默认的内存限制(约 1.4GB)极易导致 JavaScript heap out of memory 错误。
- 安装跨平台环境变量工具:
npm install cross-env --save-dev - 修改
package.json中的build命令,将内存上限提升至 3GB:
"scripts": {
"build": "cross-env NODE_OPTIONS=\"--max-old-space-size=3072\" strapi build"
}
- 执行构建:
npm run build
四、 进程守护:使用 PM2 保持后台运行
在生产环境中,我们强烈推荐使用命令行 PM2 配合配置文件来管理进程,这比宝塔面板的图形化界面更灵活、可追溯。
在项目根目录创建 ecosystem.config.js(或直接在命令行启动):
cd /www/wwwroot/strapi/api.mohaishibei.com2/strapi-bookreview
pm2 start npm --name "strapi-app" -- start
pm2 save
pm2 startup
注意:Strapi 4/5 在生产模式下必须先
npm run build生成dist目录。如果是通过自定义server.js启动,需确保代码中指定了distDir: './dist'。
五、 域名访问:Nginx 反向代理与 SSL
Strapi 默认运行在 1337 端口,我们需要通过 Nginx 进行反向代理并配置 HTTPS。
1. 配置反向代理
在宝塔面板添加站点后,进入反向代理设置:
- 目标 URL:
http://127.0.0.1:1337 - 发送域名:
$host(确保 Strapi 接收到正确的域名信息,避免后台链接错乱)
2. 开启 WebSocket 支持
Strapi 的实时功能依赖 WebSocket。需在 Nginx 配置中手动添加以下 Header,否则后台可能会频繁断开连接:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
3. 申请 SSL 并强制跳转
在宝塔面板申请 Let’s Encrypt 免费证书,并开启**“强制 HTTPS”**。这不仅能保障数据安全,还能避免浏览器因混合内容(HTTP/HTTPS 混用)拦截 Strapi 的后台请求。
结语: 遵循以上步骤,你的 Strapi 项目将拥有独立的用户隔离、安全的文件权限、充足的内存分配以及稳定的进程守护。如果在部署过程中遇到任何报错,欢迎在评论区留言交流!
💬 评论
加载中...