在Ubuntu 14.04上设置生产环境可用的Node.js

在Ubuntu 14.04上设置生产环境可用的Node.js

提供:ZStack社区

前言

Node.js是一个开源的JavaScript运行时环境,开发者可以用它方便的构建服务器端应用和网络应用。Node.js可在Linux、OS X、FreeBSD和Windows上运行,在其上运行的应用使用JavaScript编写。Node.js应用可以在命令行运行,然而本文的目的在于以服务的方式运行Node.js应用,让这些应用可以在系统重启或遇到错误时自动重启,以配合生产环境的需求。

本文将设置一个可用于线上的Node.js环境,该环境包含两台Ubuntu 14.04服务器:一台运行PM2管理下的Node.js应用,另一台是踏板服务器,让用户通过Nginx反向代理登陆到应用服务器。

本教程有一个CentOS版本,可以在这里查阅

前提条件

本教程中的两台Ubuntu 14.04之间通过私有网络连接(在同一数据中心内),两台服务器的命名如下:

  • app:安装了Node.js运行时、Node.js应用和PM2的服务器
  • web:安装了Nginx(做反向代理)的踏板服务器。用户访问本机的IP以连接到app服务器。

你也可以只用单台服务器完成本教程,只需要把教程中涉及app服务器私有IP的地方都换成本机IP(127.0.0.1)即可。

整个部署的图示如下:

在开始操作之前,你的两台服务器上都需要设置好具备sudo权限的普通非root用户,我们需要用这个用户名登陆到服务器上。如果你还没设置过,可以参阅我们的Ubuntu 14.04初始配置教程

如果你想通过域名(而不是IP)来访问web服务器,则你需要购买一个域名,然后参阅如下教程完成设置:

上述条件达成后,进入下述步骤开始在app服务器上安装Node.js。

安装Node.js

我们将在app服务器上安装最新LTS版本的Node.js。

在app服务器上,运行apt-get更新命令:

sudo apt-get update12

然后安装gitnpm的安装需要git):

sudo apt-get install git12

Node.js官网找到Linux软件包(.tar.xz)的下载连接,右键复制地址。本教程撰文时的最新LTS版本是4.2.3,如果你希望安装最新的stable版本,可以到stable版本下载页面获取下载地址。

进入home目录,用wget下载Node.js的源代码:

cd ~

wget https://nodejs.org/dist/v4.2.3/node-v4.2.3-linux-x64.tar.gz1234

下载完毕之后,解压缩到node目录下:

mkdir node

tar xvf node-v*.tar.?z --strip-components=1 -C ./node1234

解压缩之后,压缩包就没用了。可以回到刚才的目录删除之前下载的压缩包:

cd ~

rm -rf node-v*1234

然后,我们要配置npm的全局prefix,用于创建Node软件包的符号连接(symbolic link)。我们在这里将默认目录设置为/usr/local

mkdir node/etc

echo ‘prefix=/usr/local‘ > node/etc/npmrc1234

现在,将nodenpm的二进制文件移动到安装路径下(我们的安装路径是/opt/node):

sudo mv node /opt/12

然后,将文件的所有者设置为root

sudo chown -R root: /opt/node12

然后,为nodenpm的二进制文件设置符号链接。我们使用的是/usr/local/bin

sudo ln -s /opt/node/bin/node /usr/local/bin/node

sudo ln -s /opt/node/bin/npm /usr/local/bin/npm1234

最后,确认Node是否正确安装:

node -v12

如此,Node.js运行时的安装就完成了。现在开始编写我们的Node.js应用。

创建Node.js应用

我们将创建一个简单的“Hello World”应用,该应用针对所有的HTTP请求返回“Hello World”。你也可以直接部署你自己的应用,只是要确保你的应用监听的IP地址和端口是正确的。

我们希望该应用响应来自反向代理服务器“web”的请求,因此需要在app服务器配置私有网络的服务器间通讯。你需要知道app服务器的私有网络地址。

对于DigitalOcean的用户而言,你的droplet的私有IP可以在Metadata服务中查询——在app服务器上使用curl命令获取此IP:

curl -w "\n" http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address 
12

该命令返回的结果就是该服务器的私有IP,将它复制下来以备后续使用。

Hello World代码

现在,创建我们的Node.js应用。本教程使用vi编辑器,创建的应用叫做hello.js

cd ~

vi hello.js1234

将下面的代码复制到文件里。记得把app服务器的私有IP(两处APP_PRIVATE_IP_ADDRESS部分的内容)替换成你自己的。下面定义使用的端口是8080,如果有需要,你也可以改成自己的(只能是非admin的端口,即1024以上的):

hello.js

var http = require(‘http‘);
http.createServer(function (req, res) {
  res.writeHead(200, {‘Content-Type‘: ‘text/plain‘});
  res.end(‘Hello World\n‘);
}).listen(8080, ‘APP_PRIVATE_IP_ADDRESS‘);
console.log(‘Server running at http://APP_PRIVATE_IP_ADDRESS:8080/‘);1234567

保存退出。

该应用能够监听指定的IP地址和端口,并返回“Hello World”以及200 HTTP状态码。该应用目前仅能被同一私有网络上的服务器访问——比如我们的web服务器。

测试应用(可选)

要测试应用,可以在app服务器上敲入如下命令:

node hello.js12

注:用本指令运行Node.js应用的时候,其他发给该服务器的命令会被阻挡。测试结束后,记得用CTRL+C退出应用。

打开另一个终端进程,连接到web服务器上,从该服务器访问app服务器的私有IP。我们用curl命令(记得将APP_PRIVATE_IP_ADDRESS和8080端口替换成你自己的):

curl http://APP_PRIVATE_IP_ADDRESS:808012

如果输出的内容是下面这样的,说明应用运行正常,测试通过:

Output:
Hello World123

否则,请回去检查Node.js应用的运行状态,以及上面配置的IP地址和端口是否有误。

测试完成之后,回到app服务器上CTRL+C退出应用。

安装PM2

PM2是一个Node.js应用的进程管理器。PM2将Node.js应用作为守护进程(服务)进行管理,这样比较方便。

我们将用NPM(Node软件包模块)在app服务器上安装PM2。输入下述命令:

sudo npm install pm2 -g12

使用PM2管理应用

PM2的用法很简单。我们将介绍一些PM2的基本用法。

启动应用

首先,使用pm2 start命令启动我们的hello.js,这会让应用在后台运行:

pm2 start hello.js12

该命令同时将该应用加入到了PM2的进程列表中。每次用PM2启动一个应用时,终端都会返回如下输出:

Output:
┌──────────┬────┬──────┬──────┬────────┬───────────┬────────┬────────────┬──────────┐
│ App name │ id │ mode │ PID  │ status │ restarted │ uptime │     memory │ watching │
├──────────┼────┼──────┼──────┼────────┼───────────┼────────┼────────────┼──────────┤
│ hello    │ 0  │ fork │ 5871 │ online │         0 │ 0s     │ 9.012 MB   │ disabled │
└──────────┴────┴──────┴──────┴────────┴───────────┴────────┴────────────┴──────────┘1234567

从上面可以看到,PM2会给运行的应用自动分配一个应用名(就是该应用的文件名减掉.js后缀)以及一个PM2 id。PM2同时还维护其他信息,如进程的PID、当前状态、以及内存使用情况。

在PM2下运行的应用如果崩溃或者被kill,则会自动重启。如果希望在系统重启(boot或reboot)后也能够自动运行,则可以使用PM2的startup子命令。

startup子命令会创建一个启动脚本,用于在服务器启动时打开PM2以及其所管理的所有进程。你需要在命令中指定操作系统,在本教程中是ubuntu

pm2 startup ubuntu12

返回的结果中,最后一行是一个命令,这个命令需要我们手动执行一次(以superuser的权限):

Output:
[PM2] You have to run this command as root
[PM2] Execute the following command :
[PM2] sudo su -c "env PATH=$PATH:/opt/node/bin pm2 startup ubuntu -u sammy --hp /home/sammy"12345

把它复制下来,运行之,就实现了系统重启后应用也能自动启动的功能:

sudo su -c "env PATH=$PATH:/opt/node/bin pm2 startup ubuntu -u sammy --hp /home/sammy"12

PM2的其他用法(可选)

PM2还有其他一些子选项,可用于应用的管理和信息查询。PM2的帮助页面可以通过运行pm2调出,里面列出了更详细的用法。本文只是简单的介绍一些。

停止应用(用应用名或PM2 id指定):

pm2 stop example12

重启应用(用应用名或PM2 id指定):

pm2 restart example12

列出当前管理中的应用列表:

pm2 list12

关于指定应用的详细信息(用应用名或PM2 id指定):

pm2 info example12

显示应用状态、CPU、内存使用情况:

pm2 monit12

现在我们完成了Node.js应用的启动和PM2的设置,可以去web服务器设置反向代理了。

设置反向代理服务器

我们将用Nginx将用户的访问请求反向代理到app服务器的私有IP上。本教程将从头设置一个Nginx,如果你的系统上已经配置过Nginx,则可以直接将下文的location部分内容复制粘贴到你自己的配置文件里(不要跟现有的配置起冲突就行)。

进入web服务器,更新软件列表:

sudo apt-get update12

用apt-get安装Nginx:

sudo apt-get install nginx12

用vi打开Nginx配置文件:

sudo vi /etc/nginx/sites-available/default12

删掉原来的内容,将下面的内容复制粘贴进去。其中,server_name部分设置为web服务器本机的IP或域名,APP_PRIVATE_IP_ADDRESS设置为app服务器的私有IP。如果上面步骤中使用的不是8080端口,也需要修改:

/etc/nginx/sites-available/default

server {
    listen 80;

    server_name example.com;

    location / {
        proxy_pass http://APP_PRIVATE_IP_ADDRESS:8080;
        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;
    }
}123456789101112131415

上述配置将访问web服务器根地址的请求转发到了app服务器上,即,针对http://example.com/的访问,其请求被转发到APP_PRIVATE_IP_ADDRESS8080端口上,其上的Node.js应用返回的内容再通过web服务器返回到浏览器。

我们还可以在web服务器上添加更多的转发,这只需要添加location内容块即可。比如说,我们想把针对http://example.com/app2的访问都转发到APP_PRIVATE_IP_ADDRESS8081端口上,就可以添加下面的内容:

    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;
    }123456789

编辑完毕之后,保存退出。

在web服务器上重启Nginx:

sudo service nginx restart12

如果我们的Node.js应用运行正常,应用配置和Nginx配置都正确,则我们在浏览器里访问web服务器的时候,就能够访问到我们的应用。现在就到浏览器里输入web服务器的公网IP或域名试试看吧!

总结

至此,我们现在有一台跑着Node.js应用的app服务器运行在一个Nginx反向代理服务器的后面,而且这台反向代理服务器还可以同时给其他应用提供反向代理。

如果你想要加密web服务器和用户之间的传输,可以查阅这篇介绍HTTPS(TLS/SSL)配置的教程

本文来源自DigitalOcean Community。英文原文:How To Set Up a Node.js Application for Production on Ubuntu 14.04 by Mitchell Anicas

翻译:lazycai

时间: 2024-12-20 18:24:35

在Ubuntu 14.04上设置生产环境可用的Node.js的相关文章

在Ubuntu 14.04上部署 PHP 环境及 WordPress

软件及版本选择 Ubuntu 14.04 Ubuntu 是目前用户数量数一数二的发行版,背后有大土豪维护,可以说是轻量级用户的最佳选择.而 14.04 是目前最新的 LTS 版本,目前已经发布了半年了,基本是目前支持最好的版本. Nginx Nginx 是一个轻量级的,配置灵活,擅长并发的 Web 服务器. PHP-FPM PHP-FPM 是目前官方推荐的最佳的运行模式. MariaDB MySQL 的替代品,毕竟目前 MySQL 的创始人已经不建议我们使用 MySQL 了. 基本配置 通常当你

在Ubuntu 14.04上搭建github Pages博客

背景 github是一个全球性的代码托管平台,支持github Pages服务.这个服务可以为个人.组织或项目建立静态主页.github为用户提供项目托管.git.pages等用于项目开发的功能.我们使用的就是其pages服务.相对于其他提供免费博客的网站,github的最大优点是无任何广告且提供git版本管理工具对博客进行管理.但劣势是需要一定的命令行操作,对于普通用户有一定门槛.Octopress是一款优秀的静态化博客系统,官方将它简称为:"A blogging framework for

Ubuntu 14.04 上安装和配置 FTP 服务器 ProFTPD

proftpd的配置方式类似apache,比vsftpd更易用,xampp就集成了proftpd. apt-cache search proftpd 搜索相关包 sudo apt-get install proftpd-basic 安装 安装时默认作为一个standalone server运行proftpd,如果每天的ftp请求量少,可以安装为inetd服务,节省服务器资源. 这里我使用默认值,安装为standalone server. sudo netstat -antp|grep proft

ubuntu 14.04搭建android编译环境

按照我的文章:http://blog.csdn.net/zangcf/article/details/23566999在ubuntu 14.04上搭建android编译环境,编译过程会出以下两个错误: 1,Can't locateSwitch.pm in @INC (you may need to install the Switch module) (@INC contains:/etc/perl /usr/local/lib/perl/5.18.2 /usr/local/share/perl

Ubuntu 14.04下java开发环境的搭建--3--Tomcat及MySQL的安装

前面两篇文章,已经说明了JDK和Eclipse 的安装方法,下面简单说一下,Tomcat及MySQL的安装方法. Tomcat的安装. 在合适的地方解压apache-tomcat-6.0.39.tar.gz cd /opt/DevelopTools sudo mkdir server cd server sudo cp /home/home/下载/apache-tomcat-6.0.39.tar.gz /opt/DevelopTools/server sudo tar -zxvf apache-

ubuntu 14.04 hadoop eclipse 初级环境配置

接触hadoop第二天,配置hadoop到环境也用了两天,将自己配置的过程写在这里,希望对大家有所帮助! 我将文中用到的所有资源都分享到了  这里,点开就能下载,不需要一个个的找啦! 其中有<Hadoop 技术内幕>这本书,第一章讲述了这个配置过程,但是不详细~ ---------------安装jdk------------------------------- 1. 下载jdk1.6.0_45 2.解压到opt文件夹下,配置/etc/profile,在文件尾部加上 #set java en

GOLANG 在 UBUNTU 14.04 上使用 Oracle 数据库

本文参考了以下地址的文章: https://github.com/Centny/Centny/blob/master/Articles/How%20build%20github.com%3amattn%3ago-oci8.md? 一.安装oracle的OCI套件 1.OCI下载链接页面下载(instantclient-basic,instantclient-sdk) http://www.oracle.com/technetwork/database/features/instant-clien

如何利用Heartbeat与Floating IP在Ubuntu 14.04上创建高可用性设置

提供 ZStack社区 内容简介 Heartbeat是一款开源程序,负责将集群基础设施容量--包括集群成员与消息收发--交付至客户服务器.Hearbeat在高可用性服务器基础设施当中扮演着关键性角色.我们通常需要将Heartbeat与Pacemaker等集群资源管理器(简称CRM)相结合,从而实现完整的高可用性设置.不过在今天的教程中,我们将演示如何利用Heartbeat与DigitalOcean Floating IP轻松创建一套双节点高可用性服务器设置. 如果大家希望进一步提升可用性水平,不

入门系列之在Ubuntu 14.04上备份,还原和迁移MongoDB数据库

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由信姜缘 发表于云+社区专栏 MongoDB是最受欢迎的NoSQL数据库引擎之一.它以可扩展,强大,可靠和易于使用而闻名.在本文中,我们将向您展示如何备份,还原和迁移MongoDB数据库. 导入和导出数据库意味着以人类可读的格式处理数据,与其他软件产品兼容.相反,备份和还原操作创建或使用特定于MongoDB的二进制数据,这不仅保留了数据的一致性和完整性,还保留了其特定的MongoDB属性.因此,对于迁移,只要源系统和目标系统兼容,通