如何在Debian 8上设置用于生产的Node.js应用程序

介绍

Node.js是一个开源的JavaScript运行时环境,用于轻松构建服务器端和网络应用程序。该平台在Linux,OS X,FreeBSD和Windows上运行。 Node.js应用程序可以在命令行运行,但我们将专注于将它们作为服务运行,以便在重新引导或故障时自动重新启动,并且可以安全地在生产环境中使用。 在本教程中,我们将介绍在单个Debian 8服务器上设置一个生产就绪的Node.js环境。此服务器将运行由PM2管理的Node.js应用程序,并通过Nginx逆向代理为用户提供对应用程序的安全访问。

先决条件

本指南假设你有一个Debian 8服务器,与非root用户配置的 sudo特权,作为中描述 为Debian 8初始服务器安装指南 。 它还假定您有一个域名,指向服务器的公共IP地址。 让我们开始在你的服务器上安装Node.js运行时。

安装Node.js

我们将安装Node.js的最新LTS版,采用了 NodeSource包文件。 首先,您需要安装NodeSource PPA才能访问其内容。确保您在您的主目录中,并使用curl检索Node.js 6.x存档的安装脚本:
cd ~
curl -sL https://deb.nodesource.com/setup_6.x -o nodesource_setup.sh
您可以使用nano(或您首选的文本编辑器)检查此脚本的内容:
nano nodesource_setup.sh
而在运行该脚本 sudo
sudo bash nodesource_setup.sh
PPA将添加到您的配置中,并且本地包缓存将自动更新。从nodesource运行安装脚本后,您可以按照上面的方式安装Node.js包:
sudo apt-get install nodejs
nodejs包中包含 nodejs二进制以及 npm ,所以你不需要安装 npm分开。 但是,为了对一些 npm包工作(如那些需要从源代码编译),您将需要安装 build-essential包:
sudo apt-get install build-essential
Node.js运行时现在已安装,并准备运行应用程序!让我们编写一个Node.js应用程序。

创建Node.js应用程序

我们将编写一个 Hello World应用程序,它只是返回的“Hello World”的任何HTTP请求。这是一个示例应用程序,将帮助您获得您的Node.js设置,您可以替换为您自己的应用程序 - 只是确保您修改您的应用程序以监听相应的IP地址和端口。

Hello World代码

首先,创建并打开您的Node.js应用程序以进行编辑。在本教程中,我们将使用 nano编辑示例应用程序调用 hello.js
cd ~
nano hello.js
将以下代码插入到文件中。如果你愿意,你可以更换高亮度显示端口, 8080 ,在这两个位置(一定要使用非管理端口,即1024或更高版本):
hello.js
#!/usr/bin/env nodejs
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(8080, 'localhost');
console.log('Server running at http://localhost:8080/');
现在保存并退出。 这Node.js的应用程序只监听指定的地址( localhost )和端口( 8080 ),和一个返回“Hello World”的 200 HTTP成功代码。 由于我们监听 localhost,远程客户端将无法连接到我们的应用程序。

测试应用程序

为了使我们能够测试应用程序,标志 hello.js可执行文件:
chmod +x ./hello.js
并运行它像这样:
./hello.js
OutputServer running at http://localhost:8080/
注:以这种方式运行的Node.js应用程序会阻止其他命令,直到应用程序按Ctrl-C杀害。 为了测试应用程序,您的服务器上打开另一个终端会话,并与连接到 本地主机 curl
curl http://localhost:8080
如果看到以下输出,应用程序正常工作并监听正确的地址和端口:
OutputHello World
如果没有看到正确的输出,请确保您的Node.js应用程序正在运行,并配置为监听正确的地址和端口。 一旦你确定它的工作,杀死应用程序(如果您还没有),按 Ctrl + C。

安装PM2

现在我们将安装PM2,它是Node.js应用程序的进程管理器。 PM2提供了一种简单的方法来管理和守护应用程序(在后台作为服务运行它们)。 我们将使用 npm ,用于节点模块的软件包管理器,与Node.js的安装,到我们的服务器上安装PM2。使用此命令安装PM2:
sudo npm install -g pm2
-g选项告诉 npm全球范围内安装模块,所以它的系统范围内可用。

使用PM2管理应用程序

PM2简单易用。我们将介绍PM2的几个基本用途。

启动应用程序

你会想要做的第一件事就是使用 pm2 start命令来运行你的应用程序, hello.js ,在后台:
pm2 start hello.js
这也将您的应用程序添加到PM2的进程列表,这是每次启动应用程序时输出:
Output[PM2] Spawning PM2 daemon
[PM2] PM2 Successfully daemonized
[PM2] Starting hello.js in fork_mode (1 instance)
[PM2] Done.
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid  │ status │ restart │ uptime │ memory      │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ hello    │ 0  │ fork │ 3524 │ online │ 0       │ 0s     │ 21.566 MB   │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────────────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app
正如你所看到的,PM2自动分配一个 应用程序名称 (基于文件名,没有 .js扩展名)和PM2 ID。 PM2还维护的其它信息,如进程的 PID,其当前状态,和存储器使用率。 在PM2下运行的应用程序将在应用程序崩溃或被终止时自动重新启动,但需要执行额外的步骤才能在系统启动(启动或重新启动)时启动应用程序。幸运的是,PM2提供了一种简单的方法来做到这一点, startup子命令。 该 startup子产生并配置启动脚本启动PM2和管理流程上的服务器引导。 你还必须指定要运行的平台,这是 ubuntu ,在我们的例子:
pm2 startup systemd
结果输出的最后一行将包含一个必须使用超级用户权限运行的命令:
Output[PM2] You have to run this command as root. Execute the following command:
sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy
运行生成的命令(类似于上面的高亮输出,但与您的用户名,而不是 sammy )来设置PM2为什么要在开机启动(使用您自己的输出命令):
sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy
这将创建一个运行systemd 单元 pm2上引导用户。 这 pm2例如,反过来,运行 hello.js 。 您可以检查与systemd单元的状态 systemctl
systemctl status pm2
对于systemd的详细介绍,请参见 Systemd要领:用服务,单位和学报工作

其他PM2用法(可选)

PM2提供了许多子命令,允许您管理或查找有关应用程序的信息。请注意,运行 pm2不带任何参数将显示一个帮助页面,包括用法示例,涵盖PM2使用在除本节中的更多细节。 停止使用此命令(指定PM2的应用程序 App nameid ):
pm2 stop app_name_or_id
重新启动使用此命令(指定PM2的应用程序 App nameid ):
pm2 restart app_name_or_id
目前由PM2管理的应用程序列表也可以抬头与 list子命令:
pm2 list
有关特定应用程序的更多信息,可以通过使用发现 info子(指定PM2 应用程序名称ID):
pm2 info example
该PM2进程监视器可以与拉升 monit子命令。这将显示应用程序状态,CPU和内存使用情况:
pm2 monit
现在你的Node.js应用程序正在运行,并由PM2管理,让我们设置反向代理。

将Nginx设置为反向代理服务器

现在,您的应用程序正在运行,并监听 本地主机 ,你需要设置为你的用户访问它的方法。 我们将为此设置一个Nginx Web服务器作为反向代理。 本教程将从头开始设置一个Nginx服务器。 如果你已经有一个Nginx的服务器设置,您可以将刚才复制 location块到您选择的服务器模块(确保位置不与任何Web服务器的现有内容的冲突)。 首先,使用apt-get安装Nginx:
sudo apt-get install nginx
现在打开默认服务器块配置文件进行编辑:
sudo nano /etc/nginx/sites-available/default
删除文件中的所有内容并插入以下配置。一定要代替你自己的域名为 server_name指令。 此外,更改端口( 8080 ),如果你的应用程序设置为监听在不同的端口:
/ etc / nginx / sites-available / default
server {
    listen 80;

    server_name example.com;

    location / {
        proxy_pass http://localhost: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;
    }
}
这将配置服务器以响应其根目录中的请求。假设我们的服务器可在 example.com ,访问 http://example.com/通过Web浏览器将请求发送到 hello.js ,监听端口 8080本地主机 。 您可以添加其他 location的块到同一服务器模块能提供访问其他应用程序在同一台服务器上。 例如,如果您还运行在端口另一个应用程序的Node.js 8081 ,您可以通过添加此位置区块允许访问它 http://example.com/app2
Nginx配置 - 其他位置
    location /app2 {
        proxy_pass http://localhost: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;
    }
为应用程序完成添加位置块后,保存并退出。 确保您没有通过键入以下语法错误:
sudo nginx -t
接下来,重启Nginx:
sudo systemctl restart nginx
接下来,如果启用,允许通过防火墙的流量到Nginx。 如果您使用 UFW,可以使用下面的命令:
sudo ufw allow 'Nginx Full'
随着 UFW,可以随时查询使用以下命令的状态:
sudo ufw status
如果您使用 的IPTables相反,你可以用下面的命令允许流量Nginx的:
sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
您可以随时通过运行以下命令检查IPTables的状态:
sudo iptables -S
假设你的Node.js应用程序正在运行,你的应用程序和Nginx配置是正确的,你现在应该能够通过Nginx反向代理访问你的应用程序。尝试通过访问您的服务器的URL(其公共IP地址或域名)。 从这里,你应该继续阅读,以确保您设置了 如何使用让我们在Debian 8加密安全Nginx 。

结论

恭喜!现在,您的Node.js应用程序在Debian 8服务器上的Nginx逆向代理之后运行。这种逆向代理设置足够灵活,可以让您的用户访问您想要共享的其他应用程序或静态Web内容。祝你运行你的Node.js开发!
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏