1. 为什么需要将PM2安装为Windows服务如果你在Windows服务器上跑Node.js应用可能会遇到一个头疼的问题每次远程桌面断开连接或者服务器重启后PM2管理的应用就全挂了。这是因为Windows的会话机制导致的——当用户注销时所有用户进程都会被终止包括你用PM2启动的那些Node.js应用。我刚开始用PM2管理生产环境时也踩过这个坑。明明本地开发环境跑得好好的一部署到服务器就各种不稳定。后来发现根本原因是PM2默认以用户进程运行而不是系统服务。这就好比你把重要文件放在临时文件夹里电脑一重启就全没了。把PM2安装为系统服务后它就能像MySQL、Nginx这些服务一样在后台默默运行不受用户登录状态影响。实测下来稳定性提升非常明显服务器重启后应用能自动恢复再也不用半夜爬起来手动重启服务了。2. 环境准备与PM2安装2.1 安装Node.js环境在开始之前确保你的Windows服务器已经安装了Node.js。我推荐使用LTS版本稳定性更有保障。可以通过以下命令检查是否安装成功node -v npm -v如果还没安装去Node.js官网下载Windows安装包就行。安装时记得勾选Automatically install the necessary tools选项这样会自动安装构建工具链。2.2 安装PM2全局包接下来安装PM2这里有个小技巧使用淘宝镜像源能大幅提升安装速度。在cmd或PowerShell中执行npm i pm2 -g --registryhttps://registry.npmmirror.com安装完成后用下面命令验证是否成功pm2 -v如果返回版本号就说明安装正确。我建议至少使用PM2 5.x以上版本老版本在Windows上可能会有兼容性问题。3. 配置PM2环境变量3.1 设置PM2_HOME环境变量PM2默认会把应用日志、进程列表这些数据存在当前用户目录下。但作为系统服务运行时我们需要指定一个固定位置。创建一个专门目录比如C:\pm2_home然后设置系统环境变量右键此电脑 → 属性 → 高级系统设置点击环境变量按钮在系统变量部分点击新建变量名填PM2_HOME变量值填C:\pm2_home一路确定保存这个步骤很关键我遇到过因为没设置这个变量导致PM2无法保存进程列表的情况。设置好后新开一个命令行窗口验证echo %PM2_HOME%应该能正确输出你设置的路径。3.2 配置PM2日志路径可选如果你想自定义日志存放位置可以修改PM2的配置文件。先初始化配置pm2 init然后编辑生成的ecosystem.config.js文件添加自定义日志路径module.exports { apps: [{ name: app, script: ./app.js, out_file: C:/logs/app.out.log, error_file: C:/logs/app.err.log, }] }4. 安装PM2 Windows服务4.1 安装pm2-windows-service这是最关键的一步我们需要一个专门的包来把PM2转为系统服务npm i -g pm2-windows-service --registryhttps://registry.npmmirror.com安装过程中可能会提示缺少Python或C编译工具按提示安装即可。我在几台不同版本的Windows Server上测试过2016和2019版都比较顺利2022版可能需要手动安装构建工具。4.2 注册系统服务以管理员身份打开命令行执行pm2-service-install这个命令会做三件事创建系统服务PM2设置服务自动启动配置服务使用之前设置的PM2_HOME路径安装完成后打开服务管理器运行services.msc应该能看到一个名为PM2的服务状态为正在运行。5. 管理Node.js应用5.1 启动并保存应用现在可以用PM2正常管理你的Node.js应用了。比如启动一个应用pm2 start app.js -n myapp但重点来了必须执行保存命令否则重启后应用不会自动恢复pm2 save这个命令会把当前PM2管理的所有应用列表保存到PM2_HOME目录下的dump文件中。我建议每次增减应用后都执行一次保存。5.2 验证服务自启为了确保万无一失最好手动重启服务器测试一下。重启后检查PM2服务是否自动启动services.msc中查看执行pm2 list看之前管理的应用是否都恢复了检查应用日志是否有异常如果发现应用没恢复可能是权限问题。可以尝试确保PM2_HOME目录对SYSTEM账户有完全控制权限重新执行pm2 save检查服务登录身份是否为本地系统账户6. 常见问题排查6.1 服务启动失败如果PM2服务无法启动首先检查事件查看器eventvwr.msc中的系统日志。常见错误包括路径不存在检查PM2_HOME是否设置正确权限不足给PM2_HOME目录添加SYSTEM账户的完全控制权限端口冲突PM2默认使用43554端口如果被占用可以修改6.2 应用未自动恢复如果服务器重启后应用没恢复尝试以下步骤手动执行pm2 resurrect命令检查%PM2_HOME%/dump.pm2文件是否存在确认服务启动账户有足够权限6.3 性能优化建议在Windows上跑Node.js服务我有几个实测有效的优化技巧在PM2配置中设置instances: max充分利用多核CPU使用--max-memory-restart参数防止内存泄漏定期用pm2 flush清理旧日志禁用不必要的Windows服务释放资源7. 进阶配置技巧7.1 多环境配置管理对于需要区分开发、测试、生产环境的情况可以用PM2的生态系统文件// ecosystem.config.js module.exports { apps: [{ name: app-prod, script: ./app.js, env: { NODE_ENV: production, PORT: 3000 }, env_dev: { NODE_ENV: development, PORT: 3001 } }] }然后通过--env参数指定环境启动pm2 start ecosystem.config.js --env dev7.2 日志轮转配置生产环境一定要配置日志轮转防止日志文件撑爆磁盘pm2 install pm2-logrotate pm2 set pm2-logrotate:max_size 10M pm2 set pm2-logrotate:retain 30这样设置后当日志超过10MB时会自动轮转最多保留30个日志文件。7.3 监控与告警PM2自带的监控功能很实用pm2 monit如果需要更专业的监控可以集成Keymetrics或PM2 Plus。不过对于大多数项目自带的监控加上日志分析已经够用了。
Windows服务器下将PM2安装为系统服务的完整指南
1. 为什么需要将PM2安装为Windows服务如果你在Windows服务器上跑Node.js应用可能会遇到一个头疼的问题每次远程桌面断开连接或者服务器重启后PM2管理的应用就全挂了。这是因为Windows的会话机制导致的——当用户注销时所有用户进程都会被终止包括你用PM2启动的那些Node.js应用。我刚开始用PM2管理生产环境时也踩过这个坑。明明本地开发环境跑得好好的一部署到服务器就各种不稳定。后来发现根本原因是PM2默认以用户进程运行而不是系统服务。这就好比你把重要文件放在临时文件夹里电脑一重启就全没了。把PM2安装为系统服务后它就能像MySQL、Nginx这些服务一样在后台默默运行不受用户登录状态影响。实测下来稳定性提升非常明显服务器重启后应用能自动恢复再也不用半夜爬起来手动重启服务了。2. 环境准备与PM2安装2.1 安装Node.js环境在开始之前确保你的Windows服务器已经安装了Node.js。我推荐使用LTS版本稳定性更有保障。可以通过以下命令检查是否安装成功node -v npm -v如果还没安装去Node.js官网下载Windows安装包就行。安装时记得勾选Automatically install the necessary tools选项这样会自动安装构建工具链。2.2 安装PM2全局包接下来安装PM2这里有个小技巧使用淘宝镜像源能大幅提升安装速度。在cmd或PowerShell中执行npm i pm2 -g --registryhttps://registry.npmmirror.com安装完成后用下面命令验证是否成功pm2 -v如果返回版本号就说明安装正确。我建议至少使用PM2 5.x以上版本老版本在Windows上可能会有兼容性问题。3. 配置PM2环境变量3.1 设置PM2_HOME环境变量PM2默认会把应用日志、进程列表这些数据存在当前用户目录下。但作为系统服务运行时我们需要指定一个固定位置。创建一个专门目录比如C:\pm2_home然后设置系统环境变量右键此电脑 → 属性 → 高级系统设置点击环境变量按钮在系统变量部分点击新建变量名填PM2_HOME变量值填C:\pm2_home一路确定保存这个步骤很关键我遇到过因为没设置这个变量导致PM2无法保存进程列表的情况。设置好后新开一个命令行窗口验证echo %PM2_HOME%应该能正确输出你设置的路径。3.2 配置PM2日志路径可选如果你想自定义日志存放位置可以修改PM2的配置文件。先初始化配置pm2 init然后编辑生成的ecosystem.config.js文件添加自定义日志路径module.exports { apps: [{ name: app, script: ./app.js, out_file: C:/logs/app.out.log, error_file: C:/logs/app.err.log, }] }4. 安装PM2 Windows服务4.1 安装pm2-windows-service这是最关键的一步我们需要一个专门的包来把PM2转为系统服务npm i -g pm2-windows-service --registryhttps://registry.npmmirror.com安装过程中可能会提示缺少Python或C编译工具按提示安装即可。我在几台不同版本的Windows Server上测试过2016和2019版都比较顺利2022版可能需要手动安装构建工具。4.2 注册系统服务以管理员身份打开命令行执行pm2-service-install这个命令会做三件事创建系统服务PM2设置服务自动启动配置服务使用之前设置的PM2_HOME路径安装完成后打开服务管理器运行services.msc应该能看到一个名为PM2的服务状态为正在运行。5. 管理Node.js应用5.1 启动并保存应用现在可以用PM2正常管理你的Node.js应用了。比如启动一个应用pm2 start app.js -n myapp但重点来了必须执行保存命令否则重启后应用不会自动恢复pm2 save这个命令会把当前PM2管理的所有应用列表保存到PM2_HOME目录下的dump文件中。我建议每次增减应用后都执行一次保存。5.2 验证服务自启为了确保万无一失最好手动重启服务器测试一下。重启后检查PM2服务是否自动启动services.msc中查看执行pm2 list看之前管理的应用是否都恢复了检查应用日志是否有异常如果发现应用没恢复可能是权限问题。可以尝试确保PM2_HOME目录对SYSTEM账户有完全控制权限重新执行pm2 save检查服务登录身份是否为本地系统账户6. 常见问题排查6.1 服务启动失败如果PM2服务无法启动首先检查事件查看器eventvwr.msc中的系统日志。常见错误包括路径不存在检查PM2_HOME是否设置正确权限不足给PM2_HOME目录添加SYSTEM账户的完全控制权限端口冲突PM2默认使用43554端口如果被占用可以修改6.2 应用未自动恢复如果服务器重启后应用没恢复尝试以下步骤手动执行pm2 resurrect命令检查%PM2_HOME%/dump.pm2文件是否存在确认服务启动账户有足够权限6.3 性能优化建议在Windows上跑Node.js服务我有几个实测有效的优化技巧在PM2配置中设置instances: max充分利用多核CPU使用--max-memory-restart参数防止内存泄漏定期用pm2 flush清理旧日志禁用不必要的Windows服务释放资源7. 进阶配置技巧7.1 多环境配置管理对于需要区分开发、测试、生产环境的情况可以用PM2的生态系统文件// ecosystem.config.js module.exports { apps: [{ name: app-prod, script: ./app.js, env: { NODE_ENV: production, PORT: 3000 }, env_dev: { NODE_ENV: development, PORT: 3001 } }] }然后通过--env参数指定环境启动pm2 start ecosystem.config.js --env dev7.2 日志轮转配置生产环境一定要配置日志轮转防止日志文件撑爆磁盘pm2 install pm2-logrotate pm2 set pm2-logrotate:max_size 10M pm2 set pm2-logrotate:retain 30这样设置后当日志超过10MB时会自动轮转最多保留30个日志文件。7.3 监控与告警PM2自带的监控功能很实用pm2 monit如果需要更专业的监控可以集成Keymetrics或PM2 Plus。不过对于大多数项目自带的监控加上日志分析已经够用了。