如何在CentOS 6.6 vps上部署使用Visual Studio开发的Node JS应用程序
这是我第一次使用Node JS
,因为我的背景是.NET技术,所以我使用Visual Studio
和Node.JS Tools
来开发项目的Web服务。
我使用express
, node-rest-client
和mysql
模块构buildWeb服务。 WS在我的环境中testing时工作正常,现在可以利用systemd
将它部署到我自己的CentOS 6.6 VPS的生产环境中。
我习惯在IIS
上部署WCF
和Web API
Web服务,在这种情况下,这个过程似乎是完全不同的。 我尝试使用Google,但答案和教程似乎并不简单,有时甚至是矛盾的。
是否有一些额外的步骤来部署在Visual Studio中创build一个基于* nix的系统的项目? 我应该如何进行部署和(可能)使它与systemd
运行?
在较高层次上,部署的基本步骤如下。 你可以开始做这些手动和理解他们如何工作。 最终你会想要这些主要是自动的通过脚本或configurationpipe理系统,如ansible或类似的。
- 获取代码的快照到一个已知的状态
- 这可以通过
git archive
或检出您想要构build的标签来完成 - 首先,您可以使用您的工作副本,但最终您会希望从原始位置进行构build,以避免您的开发目录中的任何工件无意中泄漏到构build中
- 这可以通过
- 安装您的生产npm依赖关系
-
npm install --production
-
- 将具有相关性的代码打包成
tar
,npm pack
或zip
- 通过
scp
将其转移到您的服务器并将其提取到位。-
/opt/myapp
是安装它的推荐位置
-
- 设置一个systemd服务文件(下面的例子)
- 安装和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理员,负责:
- 启动Node.js应用程序
- 如果他们崩溃,重新启动它们
- 提供监视和logging
- 在启动时自动启动Node.js应用程序。
PM2本身是用Node.js编写的,可以为你设置systemd / init.d / upstart。 此外,它确保您的应用程序以有限的权限运行(不是以root身份运行,因为system.d默认可以)。
使用PM2时,可能的工作stream程是:
- 将应用程序的源代码部署到服务器。 这里有无数的select。 他们中的许多人使用GIT(通过添加一个部署密钥到服务器,并检查出那里的源代码)。
- 安装PM2:
$ (sudo) npm install -g pm2
- 让PM2自动启动:
$ (sudo) pm2 startup
- 使用PM2启动您的应用程序:
$ pm2 start /home/centos/app.js
- 转储PM2的configuration,所以在启动时,它将重新加载您的应用程序:
$ pm2 save
PM2有很多选项,也可以为你创build群集 !
有些人喜欢在Node.js应用程序前面有一个反向代理(nginx)。 在我看来,这可能是一个好主意,有三种情况:
- 当你的网站有静态内容的时候,你可以使用nginx来代替Node应用程序来卸载这些静态文件(它的速度非常快!)(记住,Node应用程序是单线程的)
- 如果您的网站使用SSL / TLS,则可以终止反向代理上的SSL / TLS,并使用简单的HTTP(无SSL / TLS)请求连接到Node应用程序。 这应该会提高性能,因为您的工作人员(Node应用程序)不需要因HTTPS而浪费宝贵的事件循环周期
- 如果要手动加载余额,而不使用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