如何在一个Ubuntu VPS上用PM2来设置一个Node.js生产环境?
发布于 10 年前 作者 yingjie0904 7194 次浏览 最后一次编辑是 8 年前

关键字: node.js,Ubuntu, MISCELLANEOUS <br> ###介绍 这篇教程旨在于帮助大家设置一个Ubuntu服务器来运行基于Express,Greddy或Sails上的Node.js应用程序,通过学习这篇教程,可以避免一些安全问题,一定会受益匪浅,例如:

• 不要作为根用户运行你的app,这样,app会更安全。 • 你需要使用80端口运行app,只有根用户可以进入。(你需要用一个自定义URl来运行app,例如http://mysite.com –但不用指定端口) • 如果你的app崩溃,会重新启动,并会记录未处理的异常情况。 • 当服务器启动时,app也会重启-就是说,它会作为一即服务运行。 这个教程的前提是:读者有Linux基础知识,你可能会跳过不需要的步骤,但跟着教程一步步走会很有益处。

<br> ###创建一个安全账户来运行你的代码 当你刚创建好DigitalOcean droplet后,会收到使用根账户登录的指令: <pre>To login to your droplet, you will need to open a terminal window and copy and paste the following string: ssh root@192.241.xxx.xxx</pre>

请注意:‘192.241.xxx.xxx’会有些不同之处。当你的虚拟服务器设置好并用ssh登录后,只管跟着执行DigitalOcean给出的指令就可以。正如我们大多数理解的那样,如果你使用根账户运行代码,而不怀好意的人泄露了代码,他就可以完全控制你的VPS。为避免事情发生,要设置一个安全账户,即使我们提供了合适的密码,账户仍然可以执行根操作。在本教程中,我们就给安全账户起名叫做“safeuser”-你也可以随便命名。现在,作为根用户登陆,并执行这些步骤:

在 /home/safeuser/里用一个文件夹创建用户: <pre>useradd -s /bin/bash -m -d /home/safeuser -c “safe user” safeuser</pre>

给safeuser设置密码—输入以下命令后,你需要输入两遍: <pre>passwd safeuser</pre>

给安全用户使用根级别命令的权限: <pre>usermod -aG sudo <username></pre>

<br> ###作为安全用户登陆 按ctrl+D退出你的DigitalOcean根会话。

请注意作为安全用户登录的命令是你之前使用的同样命令,但用户名变了。而作为安全用户登陆时,每次你想运行一个具有根特权的命令时,需要在命令前加一个词:sudo。自己机器上的命令行使用命令登陆会显示下面的信息。 <pre>sh safeuser@192.241.xxx.xxx</pre>

<br> ###安装GIT 登陆后,安装GIT(我们会用GIT安装Node.js.)。如果出于一些原因,你不熟悉GIT的话,你会爱上这个漂亮的工具一辈子。如果您想知道更多,可以阅读GIT book。在Ubuntu上安装很容易: <pre>sudo apt-get install git</pre>

Sudo表明你想作为根用户运行这一命令,你会看到密码提示,就是安全用户密码。当提供密码后,命令开始运行。

<br> ###安装最新的Node.JS 请注意在写本教程时,v0.10.24是Node最新版本,如果出现更新版本,请使用更新版本。 输入以下命令,一次一行,观察你的droplet下载、编译以及安装Node.js时的不可思议的变化。 <pre>sudo apt-get install build-essential sudo apt-get install curl openssl libssl-dev git clone https://github.com/joyent/node.git cd node git checkout v0.10.24 ./configure make sudo make install</pre>

当你输入sudo make,会发生很多事,耐心点。 当make install进程完毕后,为确保一切顺利,输入: <pre>node -v</pre>

如果一切顺利,你会看到: <pre>v0.10.24.</pre>

<br> ###授予安全用户使用80端口的权限 记住,我们不想作为根用户运行你的应用程序,但有个限制:你的安全用户没有权限使用默认的HTTP 端口(80)。你的目标是发布一个网站,在网站上访问者可以通过导航轻松地使用像http://mysite.com这样的URL。

不走运的是,除非作为根用户登陆,一般情况下,你都需要使用像http://mysite.com:3000这样的一个URL—注意端口号。 很多人在这儿卡住,其实解决方法很简单,有几种方法,但有一个我比较偏爱。输入下面的命令: <pre>sudo apt-get install libcap2-bin sudo setcap cap_net_bind_service=+ep /usr/local/bin/node</pre>

现在,当你告诉一个Node应用程序你希望它在80端口运行,它会任劳任怨。

<br> ###使用NPM安装一个名为PM2的包 NPM是一个包管理器,要用它来安装框架和库,和你的Node.js应用程序一起使用。NPM是和Node.js一起安装的。PM2是个贴心的小工具,它会为你解决两个问题:

1. 如果它崩溃了,会通过重启应用程序让你的站点保持正常。 这些崩溃是不该发生的,但了解PM2能挽救你还是很好的。(一些人可能知道Forever.js,这是另外一个工具,可以让node基础站点保持运行—不过我觉得你会发现PM2能提供更多帮助)

**2.每次你重启服务器时,你的node应用程序会作为一项服务重启,这样会帮助到你。**一些用户知道其他的方法,但pm2更加简单,而且它添加了一些灵活性。

在命令行输入下列命令安装PM2: <pre>sudo npm install pm2 -g</pre>

<br> ###创建一个简单的Node App 在这儿你可以测试环境,以确保一切工作顺利进行。在这个例子中,我会使用IP地址,但目标应该是用一个域名。点击查看这些指令:如何用DigitalOcean创建一个主机名

首先,测试前创建一个简单的node app,在命令行输入: <pre>nano app.js</pre>

然后,在nano编辑器输入下面的代码: <pre>var http = require(‘http’);

var server = http.createServer(function (request, response) {

response.writeHead(200, {“Content-Type”: “text/plain”});

response.end(“Hello World\n”);

});

server.listen(80);

console.log(“Server running at http://127.0.0.1:80/”);</pre>

<br> 使用Ctrl-X退出,如果nano询问你是否保存,回答yes。

现在你有了一个基于node的名为app.js的应用程序,可以用它测试环境。 可以在命令行输入下列内容运行app.js: <pre>node app.js</pre>

完成后,通过浏览器,并输入IP地址作为URL,你应该可以看到你的hello world文本了。可以按Crtl+C中断执行。我们不想这样运行应用程序,这儿有一个要好得多的方法,我们用PM2来运行,不直接用Node。

<br> ###使用Pm2运行你的app,并保证你的服务器重启时,node.js应用自动启动 如果你用pm2运行你的应用程序,会有很大益处。现在不要像上面那样运行app,用下面的命令: <pre>pm2 start app.js</pre>

你应该能看到这个内容: The Ghost Logo

<br> 用这种方式运行你的应用程序,有什么优势呢? • 如果应用程序崩溃,PM2会自动将其重启。 • PM2会记录你未处理的异常情况—如果出现这种情况,会在/home/safeuser/.pm2/logs/app-err.log.目录的一个文件里。 • 当服务器重启时,一个命令,PM2就可以保证任何它管理的应用程序重启。基本上,你的node应用程序会作为一项服务开启。

运行这条命令,将应用程序作为一项服务运行: <pre>sudo env PATH=$PATH:/usr/local/bin pm2 startup -u safeuser</pre>

请注意,你可能不会把用户名设置为安全用户—使用和你的设置相对应的名字。你应该会看到下面内容: <pre>Adding system startup for /etc/init.d/pm2-init.sh …

/etc/rc0.d/K20pm2-init.sh -> …/init.d/pm2-init.sh

/etc/rc1.d/K20pm2-init.sh -> …/init.d/pm2-init.sh

/etc/rc6.d/K20pm2-init.sh -> …/init.d/pm2-init.sh

/etc/rc2.d/S20pm2-init.sh -> …/init.d/pm2-init.sh

/etc/rc3.d/S20pm2-init.sh -> …/init.d/pm2-init.sh

/etc/rc4.d/S20pm2-init.sh -> …/init.d/pm2-init.sh

/etc/rc5.d/S20pm2-init.sh -> …/init.d/pm2-init.sh</pre>

<br> 现在我们的目标已经完成了! • 你并未作为根用户运行;因此,你的app更安全。 • 你是在用80端口,一般只有根用户使用。 • 如果你的应用程序崩溃,它会重启,而且会保持未处理异常情况的记录。 • 服务器开启时,你的应用程序会重启。

玩的开心吧!这个开始阶段的设置相当强大了吧。

<br> 读后感:你可能注意到在safeuser目录里,有一个名为node的文件夹。它是在安装时使用的,但你已经不再需要了,可以删掉,输入:

关于node还有很多要学,但这个教程会带你走在正确的轨道上。要学习更多关于pm2的东西,可以访问pm2 repo。

重要说明:有一个启动脚本可以启动你的Node应用程序,但如果你知道它怎样工作的话,可以避免很多混淆,脚本叫做‘pm2-init.sh.’,在 'etc/init.d/'目录里,但它不会启动app.js。相反,服务器最后一次关机时,它会启动运行在PM2下的程序。 这很重要。当你输入pm2 list,如果你的node应用程序没有出现在list,你的app在服务器重启时将不会重启。使用pm2开启你的apps,以保证它们会重启: <pre>pm2 start app.js</pre>

<br> By Jim Cassidy

From: https://www.digitalocean.com/community/articles/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps

1 回复

楼主把代码格式化的语法改一下吧, 不要用 <pre> code </pre>, 应该是 ```lang\n code \n```

回到顶部