天天看点

如何开发一个产品级的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

<code>brew install node</code>

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

2

3

<code>export path=</code><code>"$home/.linuxbrew/bin:$path"</code>

<code>export manpath=</code><code>"$home/.linuxbrew/share/man:$manpath"</code>

<code>export infopath=</code><code>"$home/.linuxbrew/share/info:$infopath"</code>

使用brew install node命令之后,测试一下nodejs是否成功安装。在terminal中输入node -v这个时候应该会有nodejs的版本打印出来。再输入命令:npm -v,这次打印出来的是npm得版本。

hello world

下面就可以开始写你的nodejs应用了。随便找一个文本编辑器就可以编写nodejs代码。这里推荐webstom。是一个靠谱的ide。在文件中添加如下的代码:

4

5

6

<code>var</code> <code>http = require(</code><code>'http'</code><code>);</code>

<code>http.createserver(</code><code>function</code> <code>(req, res) {</code>

<code>  </code><code>res.writehead(200, {</code><code>'content-type'</code><code>: </code><code>'text/plain'</code><code>});</code>

<code>  </code><code>res.end(</code><code>'hello world\n'</code><code>);</code>

<code>}).listen(&lt;strong&gt;&lt;span style=</code><code>"color: #ff0000;"</code><code>&gt;8080&lt;/span&gt;&lt;/strong&gt;, </code><code>'&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;app_private_ip_address&lt;/span&gt;&lt;/strong&gt;'</code><code>);</code>

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

测试一下

<code>node hello.js</code>

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

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

<code>curl http:</code><code>//&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;app_private_ip_address&lt;/span&gt;&lt;/strong&gt;:&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;8080</code>

<code>&lt;/span&gt;&lt;/strong&gt;</code>

如果terminal中出现了hello world,那么你的代码是正确的。最后记得停掉应用的运行。按下ctrl+c。

安装pm2

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

我们使用npm(node packaged modules,nodejs的包管理工具)来安装pm2。命令:

<code>sudo npm install pm2 -g</code>

使用pm2管理应用

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

启动应用

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

<code>pm2 start &lt;span style=</code><code>"color: #ff0000;"</code><code>&gt;hello.js</code>

<code>&lt;/span&gt;</code>

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

<code>┌──────────┬────┬──────┬──────┬────────┬───────────┬────────┬────────────┬──────────┐</code>

<code>│ app name │ id │ mode │ pid  │ status │ restarted │ uptime │     memory │ watching │</code>

<code>├──────────┼────┼──────┼──────┼────────┼───────────┼────────┼────────────┼──────────┤</code>

<code>│ hello    │ 0  │ fork │ 5871 │ online │         0 │ 0s     │ 9.012 mb   │ disabled │</code>

<code>└──────────┴────┴──────┴──────┴────────┴───────────┴────────┴────────────┴──────────┘</code>

pm2会自动根据你的应用的文件名来命名app name。并给你的应用添加一个pm2 id。pm2也会有一些其他的信息,比如:进程的pid,当前的状态和内存使用量。

pm2中运行的应用会在crash或者被kill掉的时候自动重启,但是还是需要设定应用在系统重启的时候自动启动。pm2提供了startup命令,可以很容易做到这一点。

startup命令会生成并配置一个脚本。这个脚本会在系统启动的时候运行pm2和pm2中托管的应用。但是你必须在命令中明确指定运行的平台是什么,比如ubuntu等。

<code>pm2 startup ubuntu</code>

这个命令执行的结果为:

<code>[pm2] you have to run </code><code>this</code> <code>command as root</code>

<code>[pm2] execute the following command :</code>

<code>[pm2] &lt;strong&gt;&lt;span style=</code><code>"color: #ff0000;"</code><code>&gt;sudo env path=$path:/usr/local/bin pm2 startup ubuntu -u sammy</code>

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

其他的pm2用法

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

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

停止一个应用:

<code>pm2 stop &lt;span style=</code><code>"color: #ff0000;"</code><code>&gt;example</code>

重启一个应用:

<code>pm2 restart &lt;span style=</code><code>"color: #ff0000;"</code><code>&gt;example</code>

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

<code>pm2 list</code>

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

<code>pm2 info &lt;span style=</code><code>"color: #ff0000;"</code><code>&gt;example</code>

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

<code>pm2 monit</code>

  

建立反向代理

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

<code>brew install nginx</code>

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

<code>sudo nginx</code>

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

<code>curl http:</code><code>//localhost:8080</code>

如果安装正确会输出:

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

<code>&lt;!</code><code>doctype</code> <code>html&gt;</code>

<code>&lt;</code><code>html</code><code>&gt;</code>

<code>&lt;</code><code>head</code><code>&gt;</code>

<code>&lt;</code><code>title</code><code>&gt;welcome to nginx!&lt;/</code><code>title</code><code>&gt;</code>

<code>&lt;</code><code>style</code><code>&gt;</code>

<code>    </code><code>body {</code>

<code>        </code><code>width: 35em;</code>

<code>        </code><code>margin: 0 auto;</code>

<code>        </code><code>font-family: tahoma, verdana, arial, sans-serif;</code>

<code>    </code><code>}</code>

<code>&lt;/</code><code>style</code><code>&gt;</code>

<code>&lt;/</code><code>head</code><code>&gt;</code>

<code>&lt;</code><code>body</code><code>&gt;</code>

<code>&lt;</code><code>h1</code><code>&gt;welcome to nginx!&lt;/</code><code>h1</code><code>&gt;</code>

<code>&lt;</code><code>p</code><code>&gt;if you see this page, the nginx web server is successfully installed and</code>

<code>working. further configuration is required.&lt;/</code><code>p</code><code>&gt;</code>

<code>&lt;</code><code>p</code><code>&gt;for online documentation and support please refer to</code>

<code>commercial support is available at</code>

<code>&lt;</code><code>p</code><code>&gt;&lt;</code><code>em</code><code>&gt;thank you for using nginx.&lt;/</code><code>em</code><code>&gt;&lt;/</code><code>p</code><code>&gt;</code>

<code>&lt;/</code><code>body</code><code>&gt;</code>

<code>&lt;/</code><code>html</code><code>&gt;</code>

打开nginx.conf:

<code>vi /usr/local/etc/nginx/nginx.conf</code>

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

<code>server {</code>

<code>    </code><code>listen 80;</code>

<code>    </code><code>server_name &lt;strong&gt;&lt;span style=</code><code>"color: #ff0000;"</code><code>&gt;example.com&lt;/span&gt;&lt;/strong&gt;;</code>

<code>    </code><code>location / {</code>

<code>        </code><code>proxy_pass http:</code><code>//&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;app_private_ip_address&lt;/span&gt;&lt;/strong&gt;:&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;8080&lt;/span&gt;&lt;/strong&gt;;</code>

<code>        </code><code>proxy_http_version 1.1;</code>

<code>        </code><code>proxy_set_header upgrade $http_upgrade;</code>

<code>        </code><code>proxy_set_header connection </code><code>'upgrade'</code><code>;</code>

<code>        </code><code>proxy_set_header host $host;</code>

<code>        </code><code>proxy_cache_bypass $http_upgrade;</code>

<code>}</code>

这一配置会使web服务器对根目录下得访问有response。假设我们的服务器可以用example.com访问,在浏览器中输入http://example.com的话,请求最终会发送到appserver的内网ip地址端口号为8080(或者你设定的端口号)。最后node.js应用会返回输出到用户浏览器。

你可以在同一个server块中继续添加另外的location块。这样在同一个web服务器中可以有多个node.js应用被访问到。比如,你有一个叫做app的应用,运行在端口8081上。你可以添加如下的location块来允许外界使用http://example.com/app2访问。

<code>location /app2 {</code>

<code>    </code><code>proxy_pass http:</code><code>//app_private_ip_address:8081;</code>

<code>    </code><code>proxy_http_version 1.1;</code>

<code>    </code><code>proxy_set_header upgrade $http_upgrade;</code>

<code>    </code><code>proxy_set_header connection </code><code>'upgrade'</code><code>;</code>

<code>    </code><code>proxy_set_header host $host;</code>

<code>    </code><code>proxy_cache_bypass $http_upgrade;</code>

添加完成之后,保存并退出。

重启nginx:

<code>sudo service nginx restart</code>

假设你的应用已经在运行,并且你的应用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

继续阅读