【问题标题】:Watch logs from NodeJS on EC2在 EC2 上查看来自 NodeJS 的日志
【发布时间】:2022-03-03 22:53:28
【问题描述】:
我在 AWS 上有一个 EC2 实例,使用 NodeJS 运行 HTTPS 服务器。
我从 /etc/rc.local 启动我的 NodeJS 服务器,所以它会在每次启动时自动启动。
我有两个问题:
有没有更好的方法可以在不使用sudo path/to/node myScript.js 的情况下启动在端口 443 上侦听的 https 服务器?如果我以 root 身份运行此进程会有什么风险?
在哪里可以看到我的日志?从 shell 运行脚本时,我看到了进程的日志,但现在从 rc.local 运行时,我如何访问服务器的输出?
谢谢!
【问题讨论】:
标签:
node.js
logging
amazon-ec2
【解决方案1】:
使用 sudo 启动应用程序肯定不是一个好习惯。您不应使用 root 凭据运行可公开访问的服务。如果您的应用程序存在缺陷并且有人发现了这一点,那么访问机器中的更多服务就有危险。
您的应用程序应该从非特权端口(例如 5000)开始,然后将 nginx 或 apache 作为反向代理,将内部流量转发到在端口 5000 上运行的应用程序。pm2 建议类似这样好吧:http://pm2.keymetrics.io/docs/tutorials/pm2-nginx-production-setup。在线搜索您将能够找到有关如何配置 nginx 以在 https 上运行以及如何将所有流量从 http 转发到 https 的教程。您的应用程序不应该知道 ssl 证书等。请记住,pm2 模块应该安装在您的项目中本地,并且您必须利用 package.json。在那里,您可以定义一个任务,该任务将使用本地 pm2 模块在生产环境中启动您的应用程序。好处是不用全局安装 pm2 模块,也不会再被权限和超级用户搞砸了。
我认为日志不会保存在某个地方,除非您告诉它发生在 rc.local 脚本中。你如何在那里产生这个过程?类似的东西应该将标准输出重定向到一个文件:
node path/to/node myScript.js 2> /var/log/my-app.rc.local.log # send stderr from rc.local to a log file`
您不是在您的应用程序中使用记录器吗?我建议选择一个(有很多可用的,比如 bunyan、winston 等),然后用记录器替换你所有的 console.logs。然后,您可以在应用程序中明确定义将保存日志的位置,通常可以有不同的日志级别和更多功能。
【解决方案2】:
不是直接回答,更多的是这里的经验小回报。
我们在 AWS 上使用非 Docker 设置(目前 ;))大量使用 nodejs 应用程序。
我们有一个专门运行节点应用程序的用户,我猜如果你用 root 启动你的节点进程,它就有 root 访问权限,这样做并不安全。
为了运行我们使用pm2 作为进程管理器的应用程序,它允许在节点进程失败时(并且会)重新启动节点进程,并扩展工作线程的数量以匹配您的 EC2 实例的核心数量.您还可以使用./path/to/node ./node_modules/.bin/pm2 logs 访问所有工作人员的日志,并且可以将其发送到您想要的任何位置(从 ELK 到 slack)。
My2cents。