如何开发一个产品级的Node.js 应用
介绍
Node.js是一个开源的javascript运行时环境。非常简单可以快速开发一个网络应用。这个平台运行在Linux、OSX和Windows,而且运行在这个平台上的应用都是用javascript写的。Node.js的应用可以使用命令行启动,但是这里我们主要介绍的是作为一个服务运行,这样在电脑重启或者出问题之后可以重新运行起来,这是在产品环境下需要的。
本文会介绍如何使用两台Ubuntu14.04服务器建立一个Node.js的产品环境。一个服务器运行PM2管理下的Node.js应用。另一台运行反向代理Nginx,用户可以通过这个代理访问应用服务器。
前提
这两台服务器使用内网连接。在本文中我们会分别称这两台服务器为:
- app:我们运行Node.js运行时,你的Node.js应用和PM2的服务器.
- web:这台服务器安装Nginx作为反向代理。用户可以通过IP或者域名访问你的Node.js应用。
当然也可以只用一台服务器实现上述的功能。只不过你需要做一些改动。比如,使用localhost IP地址127.0.0.1。
这里只介绍实现的技术,如果你需要你的应用可以在公网用户使用域名访问的话,你需要先购买一个域名。这些文中不做详细叙述。
安装Node.js
使用Homebrew包管理工具安装nodejs。Homebre本来是为Mac服务的。后来被移植到了Linux上,叫做Linuxbrew。可以用来安装大部分的开源软件,比如Nodejs。而且非常简单,只需要一句:
brew install node
你可以在这里找到更多关于Homebrew的内容。后者查看这里了解更多Linuxbrew。首先你需要安装Linuxbrew,使用如下命令:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/linuxbrew/go/install)"
当然这这钱你需要安装Ruby。Linuxbrew安装之后你需要添加下面的三行到.bashrc或者.zshrc文件中。
export PATH="$HOME/.linuxbrew/bin:$PATH"
export MANPATH="$HOME/.linuxbrew/share/man:$MANPATH"
export INFOPATH="$HOME/.linuxbrew/share/info:$INFOPATH"
使用brew install node命令之后,测试一下nodejs是否成功安装。在terminal中输入node -v这个时候应该会有nodejs的版本打印出来。再输入命令:npm -v,这次打印出来的是npm得版本。
Hello World
下面就可以开始写你的nodejs应用了。随便找一个文本编辑器就可以编写nodejs代码。这里推荐WebStom。是一个靠谱的IDE。在文件中添加如下的代码:
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(, 'APP_PRIVATE_IP_ADDRESS');
console.log('Server running at http://APP_PRIVATE_IP_ADDRESS:/');
保存为hello.js。请确定使用app服务器的IP地址代替APP_PRIVATE_IP_ADDRESS。如果你愿意可以代替8080端口,但是最好使用大于1024的端口。app服务器监听的是我们给定的ip地址和端口。这个时候app服务器只能被同一个局域网的其他服务器访问到,比如web服务器。如果访问的话,app会返回一个200的HTTP访问成功的code。
测试一下
node hello.js
运行起来后,terminal将不会再执行其他的命令,除非你按下CTRL+C。
要测试你的app,可以直接打开浏览器访问你的地址,也可以使用curl命令:
curl http://APP_PRIVATE_IP_ADDRESS:8080
如果terminal中出现了Hello World,那么你的代码是正确的。最后记得停掉应用的运行。按下CTRL+C。
安装PM2
PM2是一个Node.js应用的进程管理工具。PM2给了一个简单的方法来管理和虚拟化应用(把它们作为服务运行)。
我们使用NPM(Node Packaged Modules,Nodejs的包管理工具)来安装PM2。命令:
sudo npm install pm2 -g
使用PM2管理应用
这里会讲到一些基本的PM2用法。
启动应用
第一个你需要知道的就是使用pm2 start命令运行你的应用hello.js。
pm2 start hello.js
这个命令也会把你的应用添加到PM2得进程列表中。这个列表在你每次运行一个应用的时候都会打印出来。
┌──────────┬────┬──────┬──────┬────────┬───────────┬────────┬────────────┬──────────┐
│ App name │ id │ mode │ PID │ status │ restarted │ uptime │ memory │ watching │
├──────────┼────┼──────┼──────┼────────┼───────────┼────────┼────────────┼──────────┤
│ hello │ 0 │ fork │ 5871 │ online │ 0 │ 0s │ 9.012 MB │ disabled │
└──────────┴────┴──────┴──────┴────────┴───────────┴────────┴────────────┴──────────┘
PM2会自动根据你的应用的文件名来命名App name。并给你的应用添加一个PM2 id。PM2也会有一些其他的信息,比如:进程的PID,当前的状态和内存使用量。
PM2中运行的应用会在crash或者被kill掉的时候自动重启,但是还是需要设定应用在系统重启的时候自动启动。PM2提供了startup命令,可以很容易做到这一点。
startup命令会生成并配置一个脚本。这个脚本会在系统启动的时候运行PM2和PM2中托管的应用。但是你必须在命令中明确指定运行的平台是什么,比如ubuntu等。
pm2 startup ubuntu
这个命令执行的结果为:
[PM2] You have to run this command as root
[PM2] Execute the following command :
[PM2] sudo env PATH=$PATH:/usr/local/bin pm2 startup ubuntu -u sammy
运行最后的红色高亮的命令,这样PM2就会成为这个服务器的开机启动项。
其他的PM2用法
PM2还提供了很多的命令。你可以使用这些命令查看你的应用的信息。
只运行pm2,会再terminal中打印出来一个帮助页。其中会包括使用的示例。
停止一个应用:
pm2 stop example
重启一个应用:
pm2 restart example
当前被PM2托管的应用列表:
pm2 list
查看一个应用的更多信息:
pm2 info example
使用monit命令可以查看应用的状态,CPU和内存使用情况:
pm2 monit
建立反向代理
因为我们已经有了Linuxbrew了,那么安装什么都很简单的一个命令就可以轻松搞定:
brew install nginx
这个会花一定的时间安装nginx的依赖项。安装好之后执行命令:
sudo nginx
现在可以用curl命令试试了:
curl http://localhost:8080
如果安装正确会输出:
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p> <p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p>
</body>
</html>
打开nginx.conf:
vi /usr/local/etc/nginx/nginx.conf
把文件个的东西全部删掉,之后添加如下代码。记得在server_name项后面填写你自己的域名(或者ip地址,如果你没有域名的话)。并把APP_PRIVATE_IP_ADDRESS替换为app服务器的地址。如果你已经在上面的nodejs代码中修改了端口号,那么这里也需要修改为同样的端口号。
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://APP_PRIVATE_IP_ADDRESS:;
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;
}
}
这一配置会使web服务器对根目录下得访问有response。假设我们的服务器可以用example.com访问,在浏览器中输入http://example.com的话,请求最终会发送到appserver的内网ip地址端口号为8080(或者你设定的端口号)。最后node.js应用会返回输出到用户浏览器。
你可以在同一个server块中继续添加另外的location块。这样在同一个web服务器中可以有多个Node.js应用被访问到。比如,你有一个叫做app的应用,运行在端口8081上。你可以添加如下的location块来允许外界使用http://example.com/app2访问。
location /app2 {
proxy_pass http://APP_PRIVATE_IP_ADDRESS: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;
}
添加完成之后,保存并退出。
重启nginx:
sudo service nginx restart
假设你的应用已经在运行,并且你的应用niginx的配置也都是正确的。你的应用就可以被外网访问到。
最后
你的Node.js应用已经运行在nginx反向代理下了。Nginx可以灵活设置,保证你的用户可以访问到你的全部应用或者静态web内容。
原文地址:https://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-ubuntu-14-04
如何开发一个产品级的Node.js 应用的更多相关文章
- 打算写一个《重学Node.js》系列,希望大家多多支持
先放上链接吧,项目已经开始2周了:https://github.com/hellozhangran/happy-egg-server 想法 现在是2019年11月24日,还有人要开始学习Node.js ...
- 如何在2016年成为一个更好的Node.js开发者
本文主要讨论一些进行Node.js开发的最佳实践和建议,这些建议不仅仅适合开发者,还适合那些管理与维护Node.js基础架构的工作人员.遵循本文提供的这些建议,能够让你更好的进行日常的开发工作. St ...
- 模块化开发(三)---通过node.js学习模块化开发
由于改文章有点大,部分代码格式有点问题,编辑之后博客园莫名其妙推出,有问题可以留言沟通. 什么是Node? 它是一个在浏览器之外可以解析和执行javascript代码的运行环 境,或者说是一个运行 ...
- 一个类似ThinkPHP的Node.js框架——QuickNode
QuickNode Node.js从QuickNode开始,让restful接口开发更简单! PHP的MVC 作为一名曾经的PHP开发者,我也有过三年多的thinkphp使用经验,那是我学习PHP接触 ...
- 使用express搭建第一个Web应用【Node.js初学】
来源:http://jingyan.baidu.com/article/bad08e1ee501e009c8512106.html express是一个开源的node.js项目框架,初学者使用expr ...
- 创建一个提供数据 API 的 Node.js 网站
创建站点目录 首先,创建一个文件夹用来保存你的站点文件,使用 mkdir 就可以了 PS C:\> mkdir mysite 然后,进入到这个文件夹进行下一步的操作. 创建包说明 使用记事本或者 ...
- blockchain 区块链的开发,基于python或node js
现在很多人用node js做区块链的开发,因为点对点并发是区块链中的难点技术之一,而node js天然的对并发支持比较好,因此比较有优势. http://ecomunsing.com/build-yo ...
- node.js的安装与第一个hello world、node.js的初始化
1.下载node.js文件 2.windows下点击安装 重复下一步即可 3.编辑工具 EditPlus编辑器 4.新建保存目录的文件夹,并新建一个文本文档 5.打开EditPlus编辑器 打开 ...
- 一个超级简单的node.js爬虫(内附表情包)
之所以会想到要写爬虫,并不是出于什么高大上的理由,仅仅是为了下载个表情包而已-- 容我先推荐一下西乔出品的神秘的程序员表情包. 这套表情包着实是抵御产品.对付测试.嘲讽队友.恐吓前任的良品, 不过不知 ...
随机推荐
- log4j2搭建记录
今天新建了一个项目,自己弄的小玩意,想要做的正式点,就想引入日志.就想到了log4j2,经过几个小时的努力,还真的可以用了,下面就记录一下我是怎么做的. 下面是总的结构: 下面是MAVEN依赖: &l ...
- [转] #ifndef#define#endif的用法(整理) 原作者:icwk
文件中的#ifndef 头件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都include了同一个头文件.而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了, ...
- log4j显示hibernate sql参数的配置
#下面的两条配置非常重要,设置为trace后,将可以看到打印出sql中 ? 占位符的实际内容 #this is the most important config for showing parame ...
- Haskell语言学习笔记(36)Data.List.Zipper
ListZipper 模块 $ cabal install ListZipper Installed ListZipper-1.2.0.2 Prelude> :m +Data.List.Zipp ...
- 与servlet相关的接口
(二)与servlet相关的接口 从servlet仅有的5个方法当中,我们知道其涉及3个接口,分别是: ServletConfig ServletRequest ServletResponse 2.1 ...
- python网络编程——socket基础篇
python的网络编程比c语言简单许多, 封装许多底层的实现细节, 方便程序员使用的同时, 也使程序员比较难了解一些底层的东西. 1 TCP/IP 要想理解socket,首先得熟悉一下TCP/IP协议 ...
- datagrid数据表格的维护
想想刚开始学jsp, 用application做一个简单的数据库, 简单的注册页面, 跟这个相比就是过家家 <%@ page language="java" contentT ...
- 二级联动的作业&左右移动作业
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 349. Intersection of Two Arrays 是否重复
不重复的: 方法一 [一句话思路]:排序之后用归并. [一刷]: 根据返回方法的类型来判断corner case.判断空.0数组的corner case还不一样,得分开写 由于先排序了,nums1[i ...
- 【转】VS2012 中文版转英文版 英文版转中文版 界面语言切换
[1]下载VS2012的语言包,各种语言包都有,下载对应的即可. 微软官网衔接地址:vs2012 语言包 http://www.microsoft.com/zh-CN/download/detail ...