什么是Node.js SSR以及为什么需要它
SSR(Server-Side Rendering)即服务端渲染,是一种在服务器端生成完整HTML页面再返回给浏览器的技术。与传统的客户端渲染(CSR)不同,SSR在服务端完成页面内容的渲染,搜索引擎爬虫可以直接获取到包含完整内容的DOM结构,极大提升了页面收录率与关键词排名权重。
Node.js凭借其异步非阻塞I/O特性和JavaScript全栈生态,成为实施服务端渲染的理想选择。无论是React生态的Next.js,还是Vue生态的Nuxt.js,都提供了成熟的SSR解决方案,让前端代码可以在Node.js环境中直接运行,无需重写后端模板逻辑。
SSR的核心优势包括:
- SEO友好:爬虫直接获取完整HTML内容,提升搜索引擎收录效果
- 首屏加载快:服务器直接返回渲染后的页面,减少白屏时间
- 社交媒体分享优化:分享链接时能正确显示页面标题和描述
- 兼容性好:对不支持JavaScript的环境也能正常展示内容
轻量云主机部署SSR的前期准备
在开始部署之前,需要完成以下准备工作:
1. 购买轻量云主机
根据SSR应用的资源需求选择合适的配置。Node.js SSR应用对CPU和内存的消耗远高于静态站点,因为每次请求都需要实时编译和渲染HTML。推荐配置如下:
- 个人博客或小型项目:2核2G起步,适合访问量不大的场景
- 生产环境SSR应用:2核4G为合理起点,能稳定支撑中等并发
- 包含数据库的全栈项目:建议4核8G,避免内存不足导致服务崩溃
2. 准备域名与备案
如果使用域名访问,需要提前完成域名购买和ICP备案。国内云主机要求域名必须备案后才能正常使用80/443端口。
3. 开放必要端口
在云主机控制台的防火墙设置中,开放以下端口:
- 22端口:SSH远程连接
- 3000端口:Node.js应用默认监听端口(根据实际配置调整)
- 80端口:HTTP访问
- 443端口:HTTPS访问
安装Node.js运行环境
推荐使用nvm(Node Version Manager)管理Node.js版本,可以灵活切换不同版本:
# 安装nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
# 加载nvm到当前shell
source ~/.bashrc
# 安装Node.js 20 LTS版本
nvm install 20
# 使用Node.js 20
nvm use 20
# 验证安装
node -v
npm -v
安装完成后,建议配置npm国内镜像源,加速依赖包的下载:
npm config set registry https://registry.npmmirror.com
部署Nuxt.js SSR应用实战
以Nuxt.js为例,演示完整的SSR应用部署流程:
第一步:上传项目代码
将本地构建好的项目上传到服务器:
# 通过Git克隆项目
git clone 你的项目仓库地址
cd 项目目录
# 安装项目依赖
npm install
# 构建生产环境代码
npm run build
第二步:安装并配置PM2
PM2是Node.js应用的生产过程管理器,可以确保应用在后台稳定运行,支持自动重启、日志管理和负载均衡:
# 全局安装PM2
npm install pm2 -g
# 启动Nuxt.js SSR应用
pm2 start .output/server/index.mjs --name "my-ssr-app"
# 设置开机自启
pm2 startup
# 保存当前进程列表
pm2 save
# 查看应用状态
pm2 status
# 查看实时日志
pm2 logs my-ssr-app
第三步:配置PM2集群模式
对于多核CPU的服务器,启用集群模式可以充分利用所有核心:
# 创建PM2配置文件 ecosystem.config.js
pm2 ecosystem
# 编辑配置文件,设置集群模式和实例数
PM2配置文件示例:
module.exports = {
apps: [{
name: 'my-ssr-app',
script: '.output/server/index.mjs',
instances: 'max', // 使用所有CPU核心
exec_mode: 'cluster', // 集群模式
max_memory_restart: '300M', // 内存超过300M自动重启
env: {
NODE_ENV: 'production',
PORT: 3000
}
}]
};
配置Nginx反向代理
Nginx作为前置服务器,可以处理静态资源请求、SSL证书和流量转发,比直接暴露Node.js端口更安全:
安装Nginx:
# CentOS/RHEL系统
yum install nginx -y
# Ubuntu/Debian系统
apt install nginx -y
配置反向代理:
创建Nginx配置文件:
server {
listen 80;
server_name 你的域名;
# 开启GZIP压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml;
# 静态资源缓存
location /_nuxt/ {
proxy_pass http://127.0.0.1:3000;
proxy_cache_valid 200 1d;
expires 7d;
add_header Cache-Control "public, immutable";
}
# 反向代理到Node.js
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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;
proxy_cache_bypass $http_upgrade;
}
}
启动Nginx并设置开机自启:
systemctl start nginx
systemctl enable nginx
配置HTTPS安全访问
使用Let's Encrypt免费SSL证书启用HTTPS:
# 安装certbot
yum install certbot python2-certbot-nginx -y
# 自动申请并配置证书
certbot --nginx -d 你的域名
# 设置自动续期
echo "0 0,12 * * * root certbot renew --quiet" | crontab -
性能优化与监控
1. 启用Nginx缓存
对于不经常变化的SSR页面,可以配置Nginx缓存减少服务器渲染压力:
# 在server块中添加
location / {
proxy_cache my_cache;
proxy_cache_valid 200 10m;
proxy_cache_use_stale error timeout updating;
proxy_pass http://127.0.0.1:3000;
}
2. 配置PM2日志轮转
避免日志文件过大占用磁盘空间:
# 安装PM2日志轮转插件
pm2 install pm2-logrotate
# 配置日志大小限制
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
3. 监控应用状态
定期检查应用运行状态和服务器资源使用情况:
# 查看PM2进程状态
pm2 monit
# 查看服务器资源
htop
# 查看Node.js进程内存占用
ps aux | grep node
常见问题与解决方案
Q:SSR应用部署后内存持续增长怎么办?
A:SSR应用的内存消耗较高,建议配置PM2的max_memory_restart参数,当内存超过阈值时自动重启进程。同时检查代码中是否存在内存泄漏,特别是未清理的事件监听器和全局变量。
Q:如何选择Nuxt.js和Next.js?
A:Nuxt.js基于Vue生态,适合Vue技术栈的团队;Next.js基于React生态,适合React技术栈的团队。两者都提供了成熟的SSR解决方案,选择时主要考虑团队的技术栈偏好。
Q:SSR应用的服务器配置怎么选?
A:建议2核4G起步,如果同时运行数据库需要4核8G。SSR对CPU计算能力要求较高,多核CPU配合PM2集群模式可以显著提升并发处理能力。开启CDN缓存后,可以减少服务器直接渲染的频率,进一步降低资源消耗。
Q:如何避免SSR应用被攻击?
A:建议使用Nginx作为前置代理,不要直接暴露Node.js端口。配置WAF防火墙、启用HTTPS、定期更新依赖包、限制SSH登录方式(使用密钥而非密码),这些措施能有效提升应用安全性。