Node.js是一个开源的Javascript运行时环境,用于轻松构建服务器端和网络应用程序。该平台在Linux,OS X,FreeBSD和Windows上运行,其应用程序是用JavaScript编写的。Node.js应用程序可以在命令行运行,但我们会教你如何将它们作为服务运行,因此它们会在重启或失败时自动重启,因此您可以在生产环境中使用它们。
在本教程中,我们将介绍如何设置一个生产就绪的Node.js环境,该环境由两个CentOS 7服务器组成; 一台服务器将运行由PM2管理的Node.js应用程序,而另一台服务器将通过Nginx反向代理向用户提供对应用程序的访问权限。
要完成本教程,您需要具备两台已经设置好可以使用sudo
命令的非root账号的CentOS服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。
本教程使用两台带有专用网络的 CentOS 7服务器(在同一数据中心内)。我们将通过以下名称来引用它们:
本教程可以使用单个服务器,但您必须在此过程中进行一些更改。只需使用localhost IP地址,即127.0.0.1
,在这可以使用应用服务器的私有IP地址。
以下是按照本教程后的设置示意图:
在开始本教程之前,您应该有一个在两台服务器上都配置了sudo
权限的常规非root用户- 这是您应该登录到服务器的用户。
如果您希望能够通过域名而不是公共IP地址访问您的Web服务器,请先注册域名。
让我们开始在应用服务器上安装Node.js运行时。
我们将在应用服务器上安装最新的Node.js LTS版本。
在应用服务器上,让我们使用yum
安装git
包,这是npm
的依赖项:
sudo yum install git
转到Node.js下载页面,找到Linux Binaries(.tar.gz)下载链接。右键单击它,并将其链接地址复制到剪贴板。在撰写本文时,最新的LTS版本是4.2.3。如果您希望安装最新的稳定版Node.js,请转到相应页面并复制该链接。
切换到您的主目录并下载Node.js源代码wget
。粘贴下载链接代替突出显示的部分:
cd ~
wget https://nodejs.org/dist/v4.2.3/node-v4.2.3-linux-x64.tar.gz
现在使用以下命令将刚刚下载的tar存档解压缩到node
目录中:
mkdir node
tar xvf node-v*.tar.gz --strip-components=1 -C ./node
如果要删除已下载的Node.js存档,因为我们不再需要它,请切换到您的主目录并使用rm
命令:
cd ~
rm -rf node-v*
接下来,我们将配置npm
的全局prefix
,在这里npm
将创建符号链接到安装节点包,到某处,它在你的默认路径。我们将使用此命令将其设置为/usr/local
:
mkdir node/etc
echo 'prefix=/usr/local' > node/etc/npmrc
现在,我们已经准备好移动node
和npm
二进制文件的安装位置。我们将使用此命令将其移至/opt/node
:
sudo mv node /opt/
此时,您可能想要创建root
文件的所有者:
sudo chown -R root: /opt/node
最后,让我们在默认路径中创建node
和npm
二进制文件的符号链接。我们用这些命令将链接放入/usr/local/bin
:
sudo ln -s /opt/node/bin/node /usr/local/bin/node
sudo ln -s /opt/node/bin/npm /usr/local/bin/npm
请注意,默认情况下,在使用sudo
时将/usr/local/bin
从PATH
排除。要更改它,请打开sudoers
文件:
sudo visudo
找到指定Defaults secure_path
并添加:/usr/local/bin
到其末尾的行。当你完成时它应该是这样的:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
保存并退出。
通过使用以下命令检查其版本来验证是否已安装Node:
node -v
Node.js运行时现已安装,并准备运行应用程序!我们来编写一个Node.js应用程序。
现在我们将创建一个Hello World应用程序,它只是向任何HTTP请求返回“Hello World”。这是一个示例应用程序,它将帮助您设置Node.js,您可以将其替换为您自己的应用程序 - 只需确保修改应用程序以侦听相应的IP地址和端口。
因为我们希望我们的Node.js应用程序能够处理来自我们的反向代理服务器web的请求,所以我们将利用我们的应用服务器的专用网络接口进行服务器间通信。查找您的应用服务器的专用网络地址。
如果您使用DigitalOcean Droplet作为服务器,则可以通过Metadata服务查找服务器的专用IP地址。在应用服务器上,使用curl
命令立即检索IP地址:
curl -w "\n" http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address
您将需要复制输出(专用IP地址),因为它将用于配置我们的Node.js应用程序。
接下来,创建并打开Node.js应用程序以进行编辑。在本教程中,我们将使用vi
编辑一个名为hello.js
的示例应用程序:
vi hello.js
将以下代码插入到文件中,并确保将应用服务器的专用IP地址替换为两个突出显示的APP_PRIVATE_IP_ADDRESS
项目。如果您愿意,也可以在两个位置替换突出显示的端口8080
(确保使用非管理端口,即1024或更高):
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(8080, 'APP_PRIVATE_IP_ADDRESS');
console.log('Server running at http://APP_PRIVATE_IP_ADDRESS:8080/');
现在保存并退出。
此Node.js应用程序只是侦听指定的IP地址和端口,并返回带有200
HTTP成功代码的“Hello World” 。这意味着只能从同一专用网络上的服务器访问应用程序,例如我们的Web服务器。
如果要测试应用程序是否有效,请在应用服务器上运行此node
命令:
node hello.js
注意:以这种方式运行Node.js应用程序将阻止其他命令,直到通过按下CTRL+C
终止应用程序。
要测试应用程序,请打开另一个终端会话并连接到您的Web服务器。由于Web服务器位于同一专用网络上,因此应该能够使用curl
使该服务器访问应用服务器的专用IP地址。请务必在AppServer的私有IP地址中替换APP_PRIVATE_IP_ADDRESS
,如果更改了端口,则替换为端口:
curl http://APP_PRIVATE_IP_ADDRESS:8080
如果您看到以下输出,则应用程序正常工作并侦听正确的IP地址和端口:
Hello World
如果看不到正确的输出,请确保Node.js应用程序正在运行,并配置为侦听正确的IP地址和端口。
在应用服务器上,请务必按下CTRL+C
以终止应用程序(如果您还没有的话)。
现在我们将安装PM2,它是Node.js应用程序的进程管理器。PM2提供了一种管理和守护应用程序的简便方法(将它们作为服务运行)。
我们将使用Node Packaged Modules(NPM),它基本上是与Node.js一起安装的Node模块的包管理器,用于在我们的app服务器上安装PM2 。使用此命令安装PM2:
sudo npm install pm2@latest -g
PM2简单易用。我们将介绍PM2的一些基本用途。
您要做的第一件事是使用该pm2 start
命令在后台运行您的应用程序hello.js
:
pm2 start hello.js
这也将您的应用程序添加到PM2的进程列表中,每次启动应用程序时都会输出该列表:
┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │
├──────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ hello │ 0 │ fork │ 30099 │ online │ 0 │ 0s │ 14.227 MB │ disabled │
└──────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────────────┴──────────┘
如您所见,PM2自动分配应用程序名称(基于文件名,没有.js
扩展名)和PM2 ID。PM2还维护其他信息,例如进程的PID,其当前状态和内存使用情况。
如果应用程序崩溃或被杀死,则在PM2下运行的应用程序将自动重新启动,但需要执行额外步骤以使应用程序在系统启动(启动或重新启动)时启动。幸运的是,PM2提供了一种简单的方法,即startup
子命令。
startup
子命令生成并配置启动脚本启动PM2和管理流程上的服务器引导。您还必须指定正在运行的init系统systemd
,在我们的示例中:
sudo pm2 startup systemd
您应该看到如下所示的输出,表示已安装pm2服务。
[PM2] Generating system init script in /etc/systemd/system/pm2.service
[PM2] Making script booting at startup...
[PM2] -systemd- Using the command:
su root -c "pm2 dump && pm2 kill" && su root -c "systemctl daemon-reload && systemctl enable pm2 && systemctl start pm2"
[PM2] Dumping processes
[PM2] Stopping PM2...
[PM2] All processes have been stopped and deleted
[PM2] PM2 stopped
[PM2] Done.
现在,您的pm2托管应用程序应该在启动时自动启动。
PM2提供了许多子命令,允许您管理或查找有关应用程序的信息。请注意,不带任何参数的pm2
的运行将显示一个帮助页面,包括示例用法,它比本教程的这一部分更详细地介绍了PM2的使用。
使用此命令停止应用程序(指定PM2 App name
或id
):
pm2 stop example
使用此命令重新启动应用程序(指定PM2 App name
或id
):
pm2 restart example
也可以使用list
子命令查找当前由PM2管理的应用程序列表:
pm2 list
可以使用info
子命令(指定PM2 应用程序名称或ID)找到有关特定应用程序的更多信息::
pm2 info example
可以使用monit
子命令提取PM2过程监视器。这将显示应用程序状态,CPU和内存使用情况:
pm2 monit
现在您的Node.js应用程序正在运行,并由PM2管理,让我们设置反向代理。
既然您的应用程序正在运行,并且正在侦听私有IP地址,那么您需要为用户设置一种访问它的方法。为此,我们将设置一个Nginx Web服务器作为反向代理。本教程将从头开始设置Nginx服务器。如果您已经安装了Nginx服务器,则可以将location
块复制到您选择的服务器块中(确保该位置不会与您的任何Web服务器的现有内容冲突)。
在Web服务器上,让我们使用yum 安装epel-release
包:
sudo yum install epel-release
然后安装Nginx:
sudo yum install nginx
现在打开Nginx配置文件进行编辑:
sudo vi /etc/nginx/nginx.conf
在默认服务器块中查找定义的行location /
。它应该看起来像这样:
location / {
}
将其替换为以下代码块,并确保使用您自己的域名替换该server_name
指令(如果您没有设置域,则使用IP地址),以及APP_PRIVATE_IP_ADDRESS
的应用服务器专用IP地址。此外,如果您的应用程序设置为侦听其他端口,请更改端口(8080
):
location / {
proxy_pass http://APP_PRIVATE_IP_ADDRESS:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
这会将Web服务器配置为响应其根目录下的请求。假设我们的服务器在example.com
可用,通过Web浏览器访问http://example.com/
会将请求发送到端口8080
上的应用程序服务器的私有IP地址,Node.js应用程序将接收并回复该请求。
您可以将其他location
块添加到同一服务器块,以提供对同一Web服务器上的其他应用程序的访问。例如,如果您还在端口8081
上的应用服务器上运行另一个Node.js应用程序,则可以添加此位置块以允许通过http://example.com/app2
访问它:
location /app2 {
proxy_pass http://APP_PRIVATE_IP_ADDRESS:8081;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
完成为应用程序添加位置块后,保存并退出。
在Web服务器上,重新启动Nginx并使其在启动时启动:
sudo systemctl restart nginx
sudo systemctl enable nginx
假设您的Node.js应用程序正在运行,并且您的应用程序和Nginx配置正确,您应该能够通过Web服务器的反向代理访问您的应用程序。通过访问您的Web服务器的URL(其公共IP地址或域名)来试用它。
恭喜!您现在在Nginx反向代理后面运行Node.js应用程序。此反向代理设置足够灵活,可让您的用户访问您要共享的其他应用程序或静态Web内容。祝你的Node.js发展顺利!
想要了解更多关于设置Node.js生产应用程序的相关教程,请前往腾讯云+社区学习更多知识。
参考文献:《How To Set Up a Node.js Application for Production on CentOS 7》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。