如何在Ubuntu 18.04上使用NGINX在生产中运行NodeJS
以下教程将向我们展示如何使用NGINX在生产中安全地运行NodeJS。
为什么要使用NGINX?
安全
要将NodeJS作为Web服务器运行,需要root特权。这将成为一个严重的安全问题,因为NodeJS或者应用程序中的漏洞可能意味着攻击者可以完全自由地访问服务器。另一方面,NGINX使用特权较低的帐户运行,因此,如果攻击者获得了控制权,则可以限制损失。
TLS
几乎所有用于TLS / SSL的NodeJS库的性能都很差,或者存在许多与之相关的严重漏洞。 NGINX已针对TLS流量进行了优化,与随机NPM模块相比,其处理效率更高,漏洞更少。
标头和简单路由
毫无疑问,大多数路由应该由应用程序完成。但是,在几种情况下,应该在流量甚至未触及应用程序之前对其进行路由。这样可确保应用程序仅路由相关流量,而忽略其他所有内容。
与标题相同的想法。并非所有标头都应由应用程序设置。在应用程序之上具有一层对于许多我们将不详细介绍的场景很有用。
安装NodeJS
适用于Ubuntu 18.04的NodeJS版本为v8.10. NPM的版本是3.5.2. 如果这适合应用程序,则可以简单地使用APT安装它们。否则,我们将需要使用单独的方法。
安装Ubuntu的存储库
以下命令将安装可从Ubuntu的存储库中获得的最新版本的NodeJS。
sudo apt install nodejs
从官方存储库安装NodeJS
NodeJS当前提供了两个安装库。我们可以使用v8存储库或者v10存储库。这两个说明都在下面列出。
添加NodeJS v8存储库
运行以下脚本为NodeJS v8的官方存储库准备服务器。这将下载其公钥并将存储库添加到APT。
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
添加NodeJS v10存储库
如果我们需要更新一些的内容,则可以运行以下脚本为NodeJS v10准备服务器。
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
安装NodeJS
sudo apt install nodejs
可选的构建基础
某些模块的库需要在服务器上进行编译才能使用。例如,这是典型的用C语言编写的代码。
sudo apt-get install -y build-essential
将NodeJS应用作为服务运行
运行应用程序应该花费最少的精力。让我们将NodeJS应用程序配置为可以轻松启动和停止的服务。我们还希望确保它在每次启动后自动启动。
- 创建一个帐户,服务将以该帐户运行。
sudo useradd -s myapp
确保服务帐户具有足够的特权来运行应用程序。
为应用创建一个新的SystemD配置文件。
sudo vi /etc/systemd/system/myapp.service
- 向其添加以下行。
[Unit] Description=My NodeJS APP - It's pretty awesome Documentation=https://docs.myapp.com After=network.target [Service] Environment=PORT=3000 Type=simple User=myapp ExecStart=/usr/bin/node /path/to/app/server.js Restart=on-failure [Install] WantedBy=multi-user.target
After = network.target告诉SystemD该服务取决于网络堆栈是否在线才可以启动。 Environment = PORT = 3000正在设置环境变量,我们的应用将使用该变量来设置监听端口。在此示例中,端口为3000。Type = simple告诉SystemD不允许分支我们的进程。
- 注册更改。
sudo systemctl daemon-reload
- 启动应用程序。
sudo systemctl start myapp
- 启用服务,使其在系统引导后自动启动。
sudo systemctl enable myapp
安装NGINX
几乎所有最新发行版都通过其官方软件存储库提供支持并提供NGINX。这简化了我们的工作,因为我们不必过多担心构建,安装和修补程序。
缺点当然是,我们不太可能运行任何最新版本的NGINX。更糟糕的是,Debian,Red Hat和CentOS就是这种情况,我们可能落后几个主要版本。但是除非我们需要那些不需要的尖端功能,否则最好不要使用现成的功能。
sudo apt install nginx
配置NGINX
安装了NGINX后,我们可以为后端NodeJS应用程序进行配置。我们将在默认端口80上托管我们的应用程序,不过我们可以自行决定选择任何端口。
创建一个新的NGINX站点配置文件
添加以下行。
保存更改并退出文本编辑器
应用更改。