如何在CentOS 6.6 vps上部署使用Visual Studio开发的Node JS应用程序

这是我第一次使用Node JS ,因为我的背景是.NET技术,所以我使用Visual StudioNode.JS Tools来开发项目的Web服务。

我使用expressnode-rest-clientmysql模块构buildWeb服务。 WS在我的环境中testing时工作正常,现在可以利用systemd将它部署到我自己的CentOS 6.6 VPS的生产环境中。

我习惯在IIS上部署WCFWeb API Web服务,在这种情况下,这个过程似乎是完全不同的。 我尝试使用Google,但答案和教程似乎并不简单,有时甚至是矛盾的。

是否有一些额外的步骤来部署在Visual Studio中创build一个基于* nix的系统的项目? 我应该如何进行部署和(可能)使它与systemd运行?

在较高层次上,部署的基本步骤如下。 你可以开始做这些手动和理解他们如何工作。 最终你会想要这些主要是自动的通过脚本或configurationpipe理系统,如ansible或类似的。

  1. 获取代码的快照到一个已知的状态
    • 这可以通过git archive或检出您想要构build的标签来完成
    • 首先,您可以使用您的工作副本,但最终您会希望从原始位置进行构build,以避免您的开发目录中的任何工件无意中泄漏到构build中
  2. 安装您的生产npm依赖关系
    • npm install --production
  3. 将具有相关性的代码打包成tarnpm packzip
  4. 通过scp将其转移到您的服务器并将其提取到位。
    • /opt/myapp是安装它的推荐位置
  5. 设置一个systemd服务文件(下面的例子)
  6. 安装和configuration反向代理,如nginx

通过阅读我用于我的网站的构build脚本可以find更多的细节。 现有技术研究的另一件好事是heroko node.js构build包 ,这是heroku在推送到heroku git远程时构build应用程序的function。

这些是高层次的步骤。 细节中有一些细节,当然,你可以在获得一些经验的时候处理这​​些细节。


示例systemd服务文件。 安装到/etc/systemd/system/mynodeapp.service并运行systemctl daemon-reload然后systemctl start mynodeapp

 [Unit] Description=My node.js App [Service] User=mynodejsapp Group=mynodejsapp WorkingDirectory=/opt/mynodejsapp EnvironmentFile=/etc/mynodejsapp/config Environment=NODE_ENV=production ExecStart=/usr/bin/node cluster.js Restart=always [Install] WantedBy=multi-user.target 

在生产中部署Node.js应用程序的一个好工具是PM2 。
PM2是一个stream程pipe理员,负责:

  1. 启动Node.js应用程序
  2. 如果他们崩溃,重新启动它们
  3. 提供监视和logging
  4. 在启动时自动启动Node.js应用程序。

PM2本身是用Node.js编写的,可以为你设置systemd / init.d / upstart。 此外,它确保您的应用程序以有限的权限运行(不是以root身份运行,因为system.d默认可以)。

使用PM2时,可能的工作stream程是:

  1. 将应用程序的源代码部署到服务器。 这里有无数的select。 他们中的许多人使用GIT(通过添加一个部署密钥到服务器,并检查出那里的源代码)。
  2. 安装PM2: $ (sudo) npm install -g pm2
  3. 让PM2自动启动: $ (sudo) pm2 startup
  4. 使用PM2启动您的应用程序: $ pm2 start /home/centos/app.js
  5. 转储PM2的configuration,所以在启动时,它将重新加载您的应用程序: $ pm2 save

PM2有很多选项,也可以为你创build群集 !

有些人喜欢在Node.js应用程序前面有一个反向代理(nginx)。 在我看来,这可能是一个好主意,有三种情况:

  1. 当你的网站有静态内容的时候,你可以使用nginx来代替Node应用程序来卸载这些静态文件(它的速度非常快!)(记住,Node应用程序是单线程的)
  2. 如果您的网站使用SSL / TLS,则可以终止反向代理上的SSL / TLS,并使用简单的HTTP(无SSL / TLS)请求连接到Node应用程序。 这应该会提高性能,因为您的工作人员(Node应用程序)不需要因HTTPS而浪费宝贵的事件循环周期
  3. 如果要手动加载余额,而不使用Node.js群集模块。 在这种情况下,你启动Node.js应用程序的多个实例监听不同的端口,并且nginx会做负载均衡。

在其他情况下,您不需要使用反向代理。

进一步阅读: – PM2基本自述文件: https : //github.com/Unitech/PM2/blob/master/README.md – PM2高级自述文件: https : //github.com/Unitech/PM2/blob/master/ADVANCED_README。 MD