如何开发一个产品级的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。而且非常简单,只需要一句:

1
brew install node

你可以在这里找到更多关于Homebrew的内容。后者查看这里了解更多Linuxbrew。首先你需要安装Linuxbrew,使用如下命令:

当然这这钱你需要安装Ruby。Linuxbrew安装之后你需要添加下面的三行到.bashrc或者.zshrc文件中。

1
2
3
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。在文件中添加如下的代码:

1
2
3
4
5
6
var  http = require( 'http' );
http.createServer( function  (req, res) {
   res.writeHead(200, { 'Content-Type' 'text/plain' });
   res.end( 'Hello World\n' );
}).listen(<strong><span style= "color: #ff0000;" >8080</span></strong>,  '<strong><span style="color: #ff0000;">APP_PRIVATE_IP_ADDRESS</span></strong>' );
console.log( 'Server running at http://<strong><span style="color: #ff0000;">APP_PRIVATE_IP_ADDRESS</span>:<span style="color: #ff0000;">8080</span></strong>/' );

保存为hello.js。请确定使用app服务器的IP地址代替APP_PRIVATE_IP_ADDRESS。如果你愿意可以代替8080端口,但是最好使用大于1024的端口。app服务器监听的是我们给定的ip地址和端口。这个时候app服务器只能被同一个局域网的其他服务器访问到,比如web服务器。如果访问的话,app会返回一个200的HTTP访问成功的code。

测试一下

1
node hello.js

运行起来后,terminal将不会再执行其他的命令,除非你按下CTRL+C。

要测试你的app,可以直接打开浏览器访问你的地址,也可以使用curl命令:

1
2
curl http: //<strong><span style="color: #ff0000;">APP_PRIVATE_IP_ADDRESS</span></strong>:<strong><span style="color: #ff0000;">8080
</span></strong>

如果terminal中出现了Hello World,那么你的代码是正确的。最后记得停掉应用的运行。按下CTRL+C。

安装PM2

PM2是一个Node.js应用的进程管理工具。PM2给了一个简单的方法来管理和虚拟化应用(把它们作为服务运行)。

我们使用NPM(Node Packaged Modules,Nodejs的包管理工具)来安装PM2。命令:

1
sudo npm install pm2 -g

使用PM2管理应用

这里会讲到一些基本的PM2用法。

启动应用

第一个你需要知道的就是使用pm2 start命令运行你的应用hello.js。

1
2
pm2 start <span style= "color: #ff0000;" >hello.js
</span>

这个命令也会把你的应用添加到PM2得进程列表中。这个列表在你每次运行一个应用的时候都会打印出来。

1
2
3
4
5
┌──────────┬────┬──────┬──────┬────────┬───────────┬────────┬────────────┬──────────┐
│ 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等。

1
pm2 startup ubuntu

这个命令执行的结果为:

1
2
3
4
[PM2] You have to run  this  command as root
[PM2] Execute the following command :
[PM2] <strong><span style= "color: #ff0000;" >sudo env PATH=$PATH:/usr/local/bin pm2 startup ubuntu -u sammy
</span></strong>

运行最后的红色高亮的命令,这样PM2就会成为这个服务器的开机启动项。  

其他的PM2用法

PM2还提供了很多的命令。你可以使用这些命令查看你的应用的信息。

只运行pm2,会再terminal中打印出来一个帮助页。其中会包括使用的示例。

停止一个应用:

1
2
pm2 stop <span style= "color: #ff0000;" >example
</span>

重启一个应用:

1
2
pm2 restart <span style= "color: #ff0000;" >example
</span>

当前被PM2托管的应用列表:

1
pm2 list

查看一个应用的更多信息:

1
2
pm2 info <span style= "color: #ff0000;" >example
</span>

使用monit命令可以查看应用的状态,CPU和内存使用情况:

1
pm2 monit

  

建立反向代理

因为我们已经有了Linuxbrew了,那么安装什么都很简单的一个命令就可以轻松搞定:

1
brew install nginx

这个会花一定的时间安装nginx的依赖项。安装好之后执行命令:

1
sudo nginx

现在可以用curl命令试试了:

1
curl http: //localhost:8080

如果安装正确会输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<! 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:

1
vi /usr/local/etc/nginx/nginx.conf

把文件个的东西全部删掉,之后添加如下代码。记得在server_name项后面填写你自己的域名(或者ip地址,如果你没有域名的话)。并把APP_PRIVATE_IP_ADDRESS替换为app服务器的地址。如果你已经在上面的nodejs代码中修改了端口号,那么这里也需要修改为同样的端口号。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
     listen 80;
 
     server_name <strong><span style= "color: #ff0000;" >example.com</span></strong>;
 
     location / {
         proxy_pass http: //<strong><span style="color: #ff0000;">APP_PRIVATE_IP_ADDRESS</span></strong>:<strong><span style="color: #ff0000;">8080</span></strong>;
         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访问。

1
2
3
4
5
6
7
8
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:

1
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

 

欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 330987132 | Go:217696290 | Python:336880185 | 做人要厚道,转载请注明出处!http://www.cnblogs.com/sunshine-anycall/p/4476522.html
相关文章
|
3月前
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
70 1
|
21天前
|
JavaScript 前端开发 jenkins
抛弃node和vscode,如何用记事本开发出一个完整的vue前端项目
本文探讨了在不依赖Node和VSCode的情况下,仅使用记事本和浏览器开发一个完整的Vue3前端项目的方法。通过CDN引入Vue、Vue Router、Element-UI等库,直接编写HTML文件实现页面功能,展示了前端开发的本质是生成HTML。虽然日常开发离不开现代工具,但掌握这种基础方法有助于快速实现想法或应对特殊环境限制。文章还介绍了如何用Node简单部署HTML文件到服务器,提供了一种高效、轻量的开发思路。
49 10
|
2月前
|
Web App开发 JavaScript 前端开发
Node.js开发
Node.js开发
73 13
|
3月前
|
存储 JavaScript 前端开发
深入浅出Node.js后端开发
在数字化时代的浪潮中,后端开发作为连接用户与数据的桥梁,扮演着至关重要的角色。本文将以Node.js为例,深入探讨其背后的哲学思想、核心特性以及在实际项目中的应用,旨在为读者揭示Node.js如何优雅地处理高并发请求,并通过实践案例加深理解。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和思考。
|
3月前
|
Web App开发 开发框架 JavaScript
深入浅出Node.js后端开发
本文将带你领略Node.js的魅力,从基础概念到实践应用,一步步深入理解并掌握Node.js在后端开发中的运用。我们将通过实例学习如何搭建一个基本的Web服务,探讨Node.js的事件驱动和非阻塞I/O模型,以及如何利用其强大的生态系统进行高效的后端开发。无论你是前端开发者还是后端新手,这篇文章都会为你打开一扇通往全栈开发的大门。
|
3月前
|
Web App开发 开发框架 JavaScript
深入浅出Node.js后端开发
在这篇文章中,我们将一起探索Node.js的奇妙世界。无论你是刚接触后端开发的新手,还是希望深化理解的老手,这篇文章都适合你。我们将从基础概念开始,逐步深入到实际应用,最后通过一个代码示例来巩固所学知识。让我们一起开启这段旅程吧!
|
2月前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
本文将带领读者从零基础开始,一步步深入到Node.js后端开发的精髓。我们将通过通俗易懂的语言和实际代码示例,探索Node.js的强大功能及其在现代Web开发中的应用。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的见解和技巧,让你的后端开发技能更上一层楼。
|
3月前
|
JavaScript 前端开发 API
深入理解Node.js事件循环及其在后端开发中的应用
本文旨在揭示Node.js的核心特性之一——事件循环,并探讨其对后端开发实践的深远影响。通过剖析事件循环的工作原理和关键组件,我们不仅能够更好地理解Node.js的非阻塞I/O模型,还能学会如何优化我们的后端应用以提高性能和响应能力。文章将结合实例分析事件循环在处理大量并发请求时的优势,以及如何避免常见的编程陷阱,从而为读者提供从理论到实践的全面指导。
|
3月前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
本文将带你走进Node.js的世界,从基础到进阶,逐步解析Node.js在后端开发中的应用。我们将通过实例来理解Node.js的异步特性、事件驱动模型以及如何利用它处理高并发请求。此外,文章还会介绍如何搭建一个基本的Node.js服务器,并探讨如何利用现代前端框架与Node.js进行交互,实现全栈式开发。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
71 4
|
3月前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
【10月更文挑战第40天】在这篇文章中,我们将一起探索Node.js的奥秘,从基础概念到实际应用,逐步揭示如何利用Node.js构建高效、可扩展的后端服务。通过实际案例分析,我们将了解Node.js在现代Web开发中的应用,以及如何克服常见的开发挑战。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供宝贵的见解和实用的技巧,帮助你在Node.js的道路上更进一步。
42 4

热门文章

最新文章