ubuntu下安装node、node代码调试
https://www.iteblog.com/archives/1313.html
上面的链接对于新装的话确实不错!亲测有效,不过有个缺点就是安装的版本号还是太低了。
本该到v6.多的,还是那么低。
解决方法:
先照上面的安装,然后
如果你有安装过n模块,第一步骤也可以省略了!
sudo n // 用于切换本地已经下载的node版本
第二种安装方法,适合没有外网的服务器
https://www.jianshu.com/p/2cc020b170c0
下载的包可能为***.tar.xz (解压指令为 tar xvjf ***.tar.xz)
2.对于离线环境,如何全局安装node_modules
查看全局包位置:
npm root -g
可以看到实际的位置 (把文件拷贝过去就可以了)
修改全局包位置
npm config set prefix '目标目录'
查看修改结果
npm config get prefix
或者用npm root -g命令也可
使用pm2进行项目后台运行
npm install pm2 -g
: 全局安装。
① 在你的项目下安装 npm install pm2 --save
② 在根努力下创建pm2.json(可以自己命名)
1 { 2 "apps": [{ 3 "name": "liblog", 4 "script": "index.js", 5 "cwd": "/usr/local/node/gongwuyuan/lookWebsite", 6 "max_memory_restart": "1G", 7 "autorestart": true, 8 "node_args": [], 9 "args": [], 10 "env": { 11 12 } 13 }] 14 }
cwd : 指的是根目录,script: 指的是要运行的文件目录
各参数详解
{ "apps": { "name": "wuwu", // 项目名 "script": "./bin/www", // 执行文件 "cwd": "./", // 根目录 "args": "", // 传递给脚本的参数 "interpreter": "", // 指定的脚本解释器 "interpreter_args": "", // 传递给解释器的参数 "watch": true, // 是否监听文件变动然后重启 "ignore_watch": [ // 不用监听的文件 "node_modules", "logs" ], "exec_mode": "cluster_mode", // 应用启动模式,支持fork和cluster模式 "instances": 4, // 应用启动实例个数,仅在cluster模式有效 默认为fork;或者 max "max_memory_restart": 8, // 最大内存限制数,超出自动重启 "error_file": "./logs/app-err.log", // 错误日志文件 "out_file": "./logs/app-out.log", // 正常日志文件 "merge_logs": true, // 设置追加日志而不是新建日志 "log_date_format": "YYYY-MM-DD HH:mm:ss", // 指定日志文件的时间格式 "min_uptime": "60s", // 应用运行少于时间被认为是异常启动 "max_restarts": 30, // 最大异常重启次数,即小于min_uptime运行时间重启次数; "autorestart": true, // 默认为true, 发生异常的情况下自动重启 "cron_restart": "", // crontab时间格式重启应用,目前只支持cluster模式; "restart_delay": "60s" // 异常重启情况下,延时重启时间 "env": { "NODE_ENV": "production", // 环境参数,当前指定为生产环境 process.env.NODE_ENV "REMOTE_ADDR": "爱上大声地" // process.env.REMOTE_ADDR }, "env_dev": { "NODE_ENV": "development", // 环境参数,当前指定为开发环境 pm2 start app.js --env_dev "REMOTE_ADDR": "" }, "env_test": { // 环境参数,当前指定为测试环境 pm2 start app.js --env_test "NODE_ENV": "test", "REMOTE_ADDR": "" } } }
③ 通过 sudo pm2 start index 或者sudo pm2 start pm2.json都可以开启服务,不过两个命令在不同的端口下开启服务
最简单的办法可以通过sudo pm2 restart pm2.json
重启服务,但这种方式会导致服务临时性的中断(重启服务需要时间,重启过程中会导致无法处理用户的请求从而导致服务中断)。如果不想服务中断,那么可以通过发送信号的方式来重启方式,具体命令为:
sudo pm2 sendSignal SIGUSR2 pm2.json
通过发送 SIGUSR2
信号,pm2 会将这个信号派发给框架,框架主进程捕获到这个信号后,会 fork 一个新的子进程提供服务,然后逐渐将之前的子进程重启,从而达到不中断服务重启的目的。
##可以使用pm2 实现集群(cluster)
//-i max 根据有效CPU数目启动最大进程数目 pm2 start app.js -i max --name [项目名称]
//内存使用超过上限自动重启 可以加上--max-memory-restart参数
pm2 start app.js --max-memory-restart 20M
//如果需要设置定时重启,cluster模式有提供参数可以选择;
cron_restart
crontab时间格式重启应用
pm2 start app.js --cron "0 3 * * *" //表示 每天的 凌晨3点都重启任务
第一段应该定义的是:分钟,表示每个小时的第几分钟来执行。范围是从0-59
第二段应该定义的是:小时,表示从第几个小时来执行,范围是从0-23
第三段应该定义的是:日期,表示从每个月的第几天执行,范围从1-31
第四段应该定义的是:月,表示每年的第几个月来执行,范围从1-12
第五段应该定义的是:周,表示每周的第几天执行,范围从0-6,其中 0表示星期日
4⃣️ 指定用户活动
pm2启动时会指定一个PM2_HOME目录,作为存放日志文件、rpc.sock文件,默认情况下会PM2_HOME指向$HOME/.pm2文件夹,使用其他用户启动pm2时,除非另外指定,否则该环境变量仍然会指向当前用户的家目录下的文件夹,从而会出现Permission denied错误。可以在使用pm2命令前设定该变量:
PM2_HOME='/path/to/.pm2' pm2 start app.js
$HOME 指的是 cd ~(对应的pwd)
线上服务通常并不直接使用可登陆用户运行pm2,而是使用一个不具备登陆权限的用户来启动程序。假如要使用www作为服务的启动者,可以通过sudo -u + 用户名来实现:
sudo -u www pm2 PM2_HOME='/path/to/.pm2' start app.js
ubuntu 如何给文件夹root权限(chown -R 用户名 /文件夹名)
### linux 查看node的文件位置
which node
修改Linux环境变量
cd /etc vim ./profile 在最底部添加 export NODE_HOME= "这里要填的是which node 命令的结果,去掉最后的/node" export PATH=$NODE_HOME:$PATH 保存退出 刷新这个配置文件 source ./profile 检查是否成功 1. echo $PATH 2. export
node 代码调试
1. V8 Inspector 方式(http://www.ruanyifeng.com/blog/2018/03/node-debugger.html)
node --inspect app.js // 然后在浏览器打开对应的调试工具 //对于有一些一开始就执行的代码,一开始就设置段点 node --inspect-brk=9229 app.js
2.vscode (https://code.visualstudio.com/docs/editor/debugging#_launch-configurations)
https://github.com/nswbmw/node-in-debugging/blob/master/4.3%20Visual%20Studio%20Code.md
目前通过配置nodemon,避免每次修改后需重新启动项目,但是存在问题,会报端口被占用
"configurations": [ { "type": "node", "request": "launch", "name": "启动程序", "runtimeExecutable": "nodemon", "program": "${workspaceFolder}/app.js", // workspaceFolder是这个项目对应的根路径。也就是vs code打开了哪个文件夹 "restart": true, "console": "integratedTerminal", "internalConsoleOptions": "neverOpen", "skipFiles": [ //代表在设置断点的时候,点击下一步时,忽略这些文件 "${workspaceFolder}/node_modules/**/*.js", "<node_internals>/**/*.js" ] } ]