在Ubuntu 16.04上,如何设置Koa.js node应用程序

・11 分钟阅读

在本教程中,我们会学习如何利用node.js 为生产环境设置Koa.js web应用程序,我们还会使用Apache链接示例域和反向代理,并学习如何使用适当的流程管理器来管理它。不用多说,让我们开始吧。

简要描述Node.js,Koa.js和Apache

Node.js是一种基于Chrome引擎V8的快速跨平台JavaScript框架,它在桌面和服务器应用程序中都被使用,因为它的线程事件循环处理而闻名,Node.js具有一个名为Node Package Manager(NPM)的包库,它包含超过50万个包。NPM包(或模块)是Node.js的核心主干,因为它们是社区驱动的代码,可以在Node.js应用程序中使用。在我们的Koa.js应用中,node.js是它功能的核心部分。

Koa.js是一个基于Node.js平台的简单的web框架,由流行的express.js框架背后的同一个团队创建其目标是通过会中间件从其核心中排除,进一步最小化已经极简的express.js框架,Koa.js的一个主要特性是没有回调,Koa.js基于ES6的生成器和ES6功能构建,例如,Promises。

Apache是一种流行的开源Web服务器,是用作Web服务器的一个非常基本的起点。在本教程中,我们会使用Apache作为反向代理,这将允许我们将应用程序链接到示例域,如果你没有域名,本教程仍然适用于你,唯一的区别是该网站将在你的VPS IP上运行,而不是在域名上运行。

设置Node.js

任何Node.js框架一样,你需要在你的VPS上安装Node.js ,在本教程中,我假设你已经在你的系统上安装了Node.js ,如果没有,你可以简单地按照指示这里

设置应用程序目录

我们需要创建一个文件夹,它会包含应用程序文件的核心。

 
mkdir site

 

你可以随意使用你想要的名称替换site ,接下来,我们需要初始化Node.js包文件,更改到刚才创建的目录,并运行npm init,并完成提示,最后,它应该类似于下面这样:


{
"name":"site",
"version":"1.0.0",
"description":"Koa.js Site",
"main":"index.js",
"scripts": {
"test":"echo"Error: no test specified" && exit 1"
 },
"author":"yourname",
"license":"ISC"
}

安装Koa.js

现在我们已经建立了目录,接下来可以继续安装Koa.js了,在当前工作目录/site中,键入以下内容。

 
npm install koa

 

这将从NPM下载Koa.js模块,并将它安装在我们的项目目录中,以备将来使用。接下来,我们将创建例子应用程序文件,该文件会保存应用程序代码,为此,创建index.js文件。

 
nano index.js

 

在文件内,创建一个例子应用程序。


const Koa = require('koa');
const app = new Koa();

app.use(async ctx => {
 ctx.body = 'Hello World';
 });

app.listen(3000);
console.log('Website is live!')

保存并关闭文件,CTRL +X。

我们要确保我们的应用程序运行正常,要启动它,运行node index.js,你会在控制台中看到Website is live

安装apache

既然我们知道我们的网站功能正常,我们可以继续安装Apache及它依赖项。


sudo apt install -y libapache2-mod-proxy-html libxml2-dev

为了使用Apache中的反向代理特性,我们需要启用必要的模块。


a2enmod proxy
a2enmod proxy_http
a2enmod proxy_ajp
a2enmod rewrite
a2enmod deflate
a2enmod headers
a2enmod proxy_balancer
a2enmod proxy_connect
a2enmod proxy_html

其中一些模块可能已经启用,但是,仔细检查它们总是好的。

现在我们需要编辑Apache的缺省配置文件。


sudo nano /etc/apache2/sites-enabled/000-default.conf

在这里,我们需要为我们的应用程序添加一个块。


<VirtualHost *:*>
 ProxyPreserveHost On
 ProxyPass / http://0.0.0.0:3000/
 ProxyPassReverse / http://0.0.0.0:3000

 ServerName localhost
</VirtualHost>

保存文件,CTRL +X。

你可能会注意到我们正在使用端口3000作为ProxyPassProxyPassReverse IP的端口,因为它与我们运行Koa.js应用程序的端口相同,所以,一定要输入正确的端口。

一旦发生了更改,我们就需要重新启动Apache,并重新启动Koa.js应用程序。


sudo systemctl restart apache2

这会确保我们的配置文件处于活动状态,并且在启动Koa.js应用程序时可以正常工作,重启Apache后,回到你的站点目录,并启动Koa.js应用程序,如前所示,你可以浏览到http://yourdomain,或者http://yourip:,你会看到"Hello World"

使用SystemD管理我们的应用程序

既然我们已经介绍了创建示例Koa.js应用程序的基础知识,我们意识到在生产环境中,像我们现在一样启动应用程序是不切实际的。流程管理器绝对是一个需求,这就是SystemD发挥作用的地方,类似"init",它提供了系统启动后管理用户进程的系统,对于我们的应用程序,systemd允许我们在系统重新启动后自动启动我们的网站,以防万一有中断系统正常运行的事件。它还提供了一组在管理我们的应用程序时可以派上用场的工具。它是内置到Ubuntu 16.04的,所以,我们不需要安装任何额外的软件。

创建SystemD服务

我们需要启动应用程序的所有内容都包含在一个名为service的文件中,它保存了关于我们的应用的细节,比如,它的名字,目录,环境等等,要创建我们的系统文件,请打开文本编辑器。


sudo nano /lib/systemd/system/site.service

像这样编辑并保存文件。


[Unit]
Description=desc here
Documentation=https://example.com
After=network.target

[Service]
Environment=NODE_PORT=3000
Type=simple
User=youruser
ExecStart=/usr/bin/node /home/[youruser]/site/index.js
Restart=on-failure

[Install]
WantedBy=multi-user.target

将youruser替换为服务器的用户名,下面是重要字段的简要概述:

  • after这会通知Systemd在启动应用程序之前等待网络接口准备就绪,
  • Environment -在这里我们可以为应用程序指定环境变量,我们的Node.js端口是其中之一,
  • type ,这会通知Systemd我们的应用程序可以启动而不需要分配用户权限等
  • user 这告诉Systemd我们要在用户帐户下运行应用程序,这是推荐,作为root用户运行应用程序可能会导致许多安全问题,
  • ExecStart -本质上是systemd运行的命令来启动我们的应用程序,类似于我们之前手动启动它的方式,
  • restart -告诉systemd在什么条件下重新启动我们的应用程序,,在本例中,我们希望在出现错误时,重新启动我们的网站,

启动SystemD服务

我们现在准备启动SystemD服务。


sudo systemctl daemon-reload

每当systemd服务文件发生更改时,这都是必要的,以便systemd注册任何新更改。

然后,启动应用程序。


sudo systemctl start site

再次导航到浏览器中的站点,以验证所有内容是否正常工作。

关键系统管理功能

  • stop -完全停止应用程序,
  • Restart -停止应用程序,并在新进程下重新启动它,
  • enable -告诉Systemd在启动计算机时启动应用程序,
  • status -显示有关当前正在运行的应用程序的信息,例如,运行时间,应用程序状态和更多信息,

若要使用这些函数中的任何一个,请运行以下命令。


systemctl <function> site

结束语

我们已经成功建立了一个Koa.js应用程序,并且学习了如何反向代理它,以及使用systemd进行管理。你现在已准备好扩展你的应用程序,并且以此示例为基础。如果你想了解更多关于Koa.js的信息,以及更多可以做的事情,请访问它们的网站 ,除此之外,如果你想了解有关SystemD流程管理器的更多信息请在这里 阅读文档,最后,如果你想了解更多关于Apache反向代理的信息,可以随时查看这里 。

Yanyan profile image