介绍
Node.js 是一个开源的 JavaScript 运行环境,可轻松构建服务器侧和网络应用程序. 该平台运行在 Linux、OS X、FreeBSD 和 Windows 上,其应用程序是用 JavaScript 编写的。
在本教程中,我们将涵盖构建一个生产准备的Node.js环境,该环境由两个Ubuntu 14.04服务器组成;一个服务器将运行由PM2管理的Node.js应用程序,而另一个服务器将通过Nginx反向代理向应用程序服务器提供用户访问该应用程序。
本教程的 CentOS 版本可在此(https://andsky.com/tech/tutorials/how-to-set-up-a-node-js-application-for-production-on-centos-7)找到。
前提条件
本指南使用两个Ubuntu 14.04服务器 具有私人网络(在同一个数据中心)。
- app:我们将安装 Node.js 运行时的服务器,您的 Node.js 应用程序和 PM2
- web:我们将安装 Nginx Web 服务器的服务器,该服务器将作为您的应用程序的反向代理。
您可以为本教程使用单个服务器,但您必须在途中进行一些更改. 只需使用 localhost IP 地址,即 127.0.0.1
,无论使用 app 服务器的私人 IP 地址。
以下是您在遵循本教程后设置的图表:
在您开始本指南之前,您应该有一个正常的非根用户,在您的两个服务器上都配置了sudo
权限 - 这是您应该登录您的服务器的用户。
如果您想通过域名访问您的 web服务器,而不是其公共IP地址,请购买域名,然后按照以下教程:
让我们通过在 app服务器上安装 Node.js 运行时间来开始。
安装 Node.js
我们将在 app服务器上安装最新版本的 Node.js LTS。
在 app服务器上,让我们用这个命令更新 apt-get 包列表:
1sudo apt-get update
然后使用apt-get
来安装git
包,其中npm
取决于:
1sudo apt-get install git
转到 Node.js 下载页面并找到 **Linux Binaries (.tar.xz)**下载链接. 右键单击它,并将其链接地址复制到您的剪辑板上。 在此写作时,最新的LTS版本是 4.2.3. 如果您更喜欢安装Node.js的最新稳定版本,请前往 适当的页面并复制该链接。
转到您的主目录并下载 Node.js 源代码wget
。贴上下载链接代替突出的部分:
1cd ~
2wget https://nodejs.org/dist/v4.2.3/node-v4.2.3-linux-x64.tar.gz
现在用这些命令将您刚刚下载的 tar 档案提取到节点
目录中:
1mkdir node
2tar xvf node-v*.tar.?z --strip-components=1 -C ./node
如果您想删除您下载的 Node.js 档案,因为我们不再需要它,请转到您的主目录并使用以下rm
命令:
1cd ~
2rm -rf node-v*
接下来,我们将配置npm
的全球前缀
,其中npm
将创建对已安装的 Node 包的象征链接,到它在默认路径中的某个地方。
1mkdir node/etc
2echo 'prefix=/usr/local' > node/etc/npmrc
现在我们已经准备好将节点
和npm
二进制移动到我们的安装位置,我们会用这个命令将其移动到/opt/node
:
1sudo mv node /opt/
在此时刻,您可能想要使文件的所有者根
:
1sudo chown -R root: /opt/node
最后,让我们在默认路径中创建节点
和npm
二进制的象征链接,我们将链接放在/usr/local/bin
中,使用这些命令:
1sudo ln -s /opt/node/bin/node /usr/local/bin/node
2sudo ln -s /opt/node/bin/npm /usr/local/bin/npm
要验证 Node 是否已安装,请使用此命令检查其版本:
1node -v
Node.js 运行时间已安装,并准备运行应用程序!让我们写一个 Node.js 应用程序。
创建 Node.js 应用
现在我们将创建一个 Hello World 应用程序,它只会返回任何 HTTP 请求的Hello World
。这是一种样本应用程序,可以帮助您设置 Node.js,您可以用自己的应用程序代替它,只需确保您修改您的应用程序以倾听适当的 IP 地址和端口。
由于我们希望我们的 Node.js 应用程序能够服务于来自我们的反向代理服务器 web的请求,我们将利用我们的 app服务器的私人网络接口进行服务器间的通信。
如果您正在使用 DigitalOcean 滴滴作为您的服务器,您可以通过 Metadata 服务搜索服务器的私人 IP 地址。
1curl -w "\n" http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address
您将希望复制输出(私人IP地址),因为它将用于配置我们的Node.js应用程序。
世界代码
接下来,创建并打开您的 Node.js 应用程序进行编辑. 对于本教程,我们将使用vi
来编辑名为hello.js
的样本应用程序:
1cd ~
2vi hello.js
将下列代码插入文件中,并确保将 app服务器的私有 IP 地址替换为两个突出标注的APP_PRIVATE_IP_ADDRESS
项目,如果您想要,您也可以在两个位置更换突出标注的端口,即8080
(请确保使用非管理员端口,即1024或更大):
1[label hello.js]
2var http = require('http');
3http.createServer(function (req, res) {
4 res.writeHead(200, {'Content-Type': 'text/plain'});
5 res.end('Hello World\n');
6}).listen(8080, 'APP_PRIVATE_IP_ADDRESS');
7console.log('Server running at http://APP_PRIVATE_IP_ADDRESS:8080/');
现在保存和退出。
这个 Node.js 应用程序只是在指定的 IP 地址和端口上收听,并以 200
HTTP 成功代码返回Hello World
,这意味着该应用程序只能从同一私人网络上的服务器访问,例如我们的 web 服务器。
测试应用程序(可选)
如果您想测试您的应用程序是否工作,请在 app服务器上运行此节点
命令:
1node hello.js
** 注意:** 以这种方式运行 Node.js 应用程序将阻止额外的命令,直到应用程序通过按CTRL+C
来杀死。
为了测试应用程序,请打开另一个终端会话并连接到您的 web服务器. 由于 Web 服务器位于相同的私人网络上,它应该能够使用curl
访问 app服务器的私人 IP 地址。
1curl http://APP_PRIVATE_IP_ADDRESS:8080
如果您看到以下输出,应用程序正在正常工作,并在正确的 IP 地址和端口上收听:
1[secondary_label Output:]
2Hello World
如果您看不到正确的输出,请确保您的 Node.js 应用程序正在运行,并配置为听取正确的 IP 地址和端口。
在 app服务器上,请确保通过按CTRL+C
来杀死应用程序(如果您还没有)。
安装 PM2
现在我们将安装 PM2,这是一种 Node.js 应用程序的流程管理器。
我们将使用 Node Packaged Modules (NPM),这基本上是与 Node.js 一起安装的 Node 模块的包管理器,在我们的 app 服务器上安装 PM2。
1sudo npm install pm2 -g
使用PM2管理应用程序
PM2 简单易用,我们将涵盖 PM2 的几个基本用途。
启动应用
您要做的第一件事是使用pm2 start
命令在背景中运行您的应用程序hello.js
:
1pm2 start hello.js
这还会将您的应用程序添加到 PM2 的流程列表中,该列表每次启动应用程序时都会输出:
1[secondary_label Output:]
2┌──────────┬────┬──────┬──────┬────────┬───────────┬────────┬────────────┬──────────┐
3│ App name │ id │ mode │ PID │ status │ restarted │ uptime │ memory │ watching │
4├──────────┼────┼──────┼──────┼────────┼───────────┼────────┼────────────┼──────────┤
5│ hello │ 0 │ fork │ 5871 │ online │ 0 │ 0s │ 9.012 MB │ disabled │
6└──────────┴────┴──────┴──────┴────────┴───────────┴────────┴────────────┴──────────┘
正如您所看到的,PM2 会自动分配一个 App name(基于文件名,不含 .js
扩展)和一个 PM2 id。
如果应用程序故障或死亡,在PM2下运行的应用程序将自动重新启动,但需要采取额外的步骤来让应用程序在系统启动(启动或重新启动)上启动。
启动
子命令生成并配置一个启动脚本,以便在服务器机器人上启动PM2及其管理流程。
1pm2 startup ubuntu
结果输出的最后一行将包含一个命令(必须使用超级用户权限运行):
1[secondary_label Output:]
2[PM2] You have to run this command as root
3[PM2] Execute the following command :
4[PM2] sudo su -c "env PATH=$PATH:/opt/node/bin pm2 startup ubuntu -u sammy --hp /home/sammy"
运行生成的命令(类似于上面的突出输出),以设置PM2开始启动(使用来自自己的输出的命令):
1sudo su -c "env PATH=$PATH:/opt/node/bin pm2 startup ubuntu -u sammy --hp /home/sammy"
其他 PM2 用途(可选)
PM2提供了许多子命令,允许您管理或搜索有关您的应用程序的信息。 请注意,运行pm2
没有任何论点会显示一个帮助页面,包括示例使用,该页面比本教程的本节更详细地涵盖了PM2的使用。
使用此命令停止应用程序(指定PM2应用程序名称
或id
):
1pm2 stop example
使用此命令重新啟動應用程式(指定 PM2「應用程式名稱」或「id」):
1pm2 restart example
目前由 PM2 管理的应用程序列表也可以通过列表
子命令查看:
1pm2 list
有关特定应用程序的更多信息可以通过使用info
子命令找到(指定 PM2 App name 或 id):
1pm2 info example
PM2 流程监视器可以通过monit
子命令拉上,显示应用程序状态、CPU 和内存使用量:
1pm2 monit
现在您的 Node.js 应用程序正在运行,并由 PM2 管理,让我们设置反向代理。
设置反向代理服务器
现在你的应用程序正在运行,并在私人IP地址上倾听,你需要为你的用户设置一种访问方式. 我们将为此设置一个Nginx网络服务器作为反向代理程序。本教程将从头开始设置一个Nginx服务器。如果你已经有了一个Nginx服务器设置,你可以简单地将位置
块复制到你选择的服务器块(确保位置不会与你的Web服务器的任何现有内容相冲突)。
在 web 服务器上,让我们用以下命令更新 apt-get 包列表:
1sudo apt-get update
然后使用 apt-get 安装 Nginx:
1sudo apt-get install nginx
现在打开默认服务器封锁配置文件进行编辑:
1sudo vi /etc/nginx/sites-available/default
删除文件中的所有内容并插入以下配置: 请确保替换您自己的域名为server_name
指令(或如果您没有域设置的IP地址),以及服务器私人IP地址为APP_PRIVATE_IP_ADDRESS
。
1[label /etc/nginx/sites-available/default]
2server {
3 listen 80;
4
5 server_name example.com;
6
7 location / {
8 proxy_pass http://APP_PRIVATE_IP_ADDRESS:8080;
9 proxy_http_version 1.1;
10 proxy_set_header Upgrade $http_upgrade;
11 proxy_set_header Connection 'upgrade';
12 proxy_set_header Host $host;
13 proxy_cache_bypass $http_upgrade;
14 }
15}
假设我们的服务器在example.com
提供,通过网页浏览器访问http://example.com/
将请求发送到应用程序服务器在端口80
上的私人IP地址,该请求将被接收并由Node.js应用程序响应。
您可以向相同的服务器块添加额外的位置
块,以便在相同的 web服务器上提供访问其他应用程序,例如,如果您在端口 8081'上的 **app**服务器上运行了另一个 Node.js 应用程序,您可以添加这个位置块,以便通过
http://example.com/app2` 访问它:
1[label Nginx Configuration — Additional Locations]
2 location /app2 {
3 proxy_pass http://APP_PRIVATE_IP_ADDRESS:8081;
4 proxy_http_version 1.1;
5 proxy_set_header Upgrade $http_upgrade;
6 proxy_set_header Connection 'upgrade';
7 proxy_set_header Host $host;
8 proxy_cache_bypass $http_upgrade;
9 }
一旦您完成为您的应用程序添加位置块,保存和退出。
在 Web 服务器上,重新启动 Nginx:
1sudo service nginx restart
假设您的 Node.js 应用程序正在运行,您的应用程序和 Nginx 配置是正确的,您应该能够通过 web 服务器的反向代理程序访问您的应用程序。
结论
恭喜您! 您现在有 Node.js 应用程序在 Ubuntu 14.04 服务器上运行 Nginx 反向代理程序后面。 此反向代理程序设置足够灵活,可为用户提供您想要共享的其他应用程序或静态 Web 内容的访问。
此外,如果您正在寻求加密您的网页服务器和用户之间的传输, 这里是一个教程,可以帮助您设置HTTPS(TLS/SSL)支持。