精简版nodejs线上项目部署

image.png

本文不讲解各种技术的详细使用,只把整个node初步部署的过程写出来,最终目的是能确保nodejs成功在云主机跑起来,并能通过自己的IP地址或域名访问得到。长话短说,首先来看看需要做的整个流程:

  • 购买服务器
  • 购买域名
  • DNSPod域名解析
  • 本地连接主机服务器
  • 安装nodejs运行环境
  • 安装pm2进程管理工具
  • Nginx反向代理与负载均衡配置

上面几个过程,在一些有部署经验的人看来很简单,但对于一个初出茅庐的新手来说,碰到的坑还是不少的,虽然可以百度可以谷歌,但网上资源多如繁星,要想快速正确筛选到正确答案,需要付出不少的精力和时间,更糟糕的情况是有些过于陈旧的答案,一旦放到项目使用,因为版本不相同,导致整个项目运行错乱,这时候需要从更加深入的环节才能解决处理,这对一名刚涉及部署上线的人来说是非常辛苦的。下面重回正题,就上面的各个环节更加详细地谈谈。

购买服务器

服务器商有很多选择,目前国内最多人使用的是阿里云,我买的是腾讯云。其实服务器都是差不多的,根据性价比买即可。个人购买出了系统选择其他一般按默认选择即可。系统选择linux的CentOS系统,Ubuntu也是linux系统,但CentOS更新,在安装软件时候比Ubuntu更加便捷。

image.png

选好配置后购买付款即可。

购买域名

腾讯是新网,阿里是万网,根据性价比买即可。

DNSPod域名解析

购买了服务器和域名之后,需要把服务器IP地址绑定到域名方可根据域名运行项目,否则只能通过IP地址来访问。

域名解析有两种方式,一是在当前的购买域名的平台解析,二是使用其他服务商解析,例如我选择的DNSPod

1.购买域名的平台解析

在个人域名控制台打开,点击解析选项。

image.png

进入解析版面后点击添加选项,可以下面的弹出框,只需要把记录类型选为A,主机记录填www,记录值填自己IP地址,其他的默认即可。

image.png

2.DNSPod平台解析

打开DNSPod官网,注册登陆。

  • 进入域名解析控制台
image.png
  • 点击域名选项进入主机记录界面
image.png
  • 点击添加记录,同样只需要把记录类型选为A,主机记录填www,记录值填自己IP地址,其他的默认即可。
image.png

注意:

自己当前的www.XXX.com是一级域名,可以用这个域名解析多个子域名,也就是二级域名——www.xxx.XXX.com。二级域名是免费无需再购买的。解析方法只需把主机记录值改成二级域名名即可,如下:

image.png

本地登陆主机服务器

Mac使用iTerm登陆,

  • 打开iTerm登陆输入:

ssh -t root@公网ip地址 -p 22

  • 然后在提示会让输入密码,输入登陆即可。

也可以设置无需输入密码登陆

  • 打开finder,按command + shift + g 键搜~/.ssh文件
  • 编辑下面内容至文件whatevername,保存在.ssh目录
set user <用户名>
set host <ip地址>
set password <密码>
set timeout -1

spawn ssh $user@$host
expect "*assword:*"
send "$password\r"
interact
expect eof
  • 打开iTerm2的profiles设置,编辑profiles
  • 在Genernal->Command下选择 Command,在输入框里填入 expect ~/.ssh/whatevername即可完成,以后每次登陆都用whatevername文件自动填写了信息。


    image.png

在window系统下登陆

使用putty登陆:

  • 打开Putty客户端输入
  • Host Name:云服务器的公网IP
  • Port:云服务器的端口,必须填22
  • Connect type:选择“SSH”

全部输入完后,点击“Open”,创建一个新对话。

image.png

在Putty会话窗口中,主机帐号密码登录。


image.png

安装nodejs运行环境

yum -y install nodejs

查看版本

node -v

可使用下面命令快速升级到最新版:

  • 首先安装n模块

npm install -g n

  • 升级命令

n stable

这时nodejs已经升到最新版了。

为了测试node.js的运行,先新建个文件跑一跑:

  • 随便找位置建个空目录:

mkdir -p /data/node

  • 打开目录,并新建并且编辑app.js文件

cd /data/node

vim app.js

  • 将以下测试代码放入:
const http =require('http')
http.createServer(function(req,res){
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('hello world')
}).listen(8081)
console.log('Server running at http://119.29.72.246:8081/');
  • 保存成功后运行:

node app.js

这时成功运行就可以看到打印信息了:

Server running at http://119.29.72.246:8081/

这时根据自己IP地址加端口访问在浏览器访问即可。

注意:

这时候如果能访问到'hello world'说明没问题了,如果长久页面跳转不成功,说明端口出了问题,这是服务器的安全组设置所导致的。

  • 打开服务器控制台,打开安全组选项:
image.png
  • 打开编辑规则:
image.png
  • 进入添加规则界面可以看到各条规则,我们要访问哪个端口,必须添加相应的入站规则。(出站规则是本站访问外网时设置的)
image.png
  • 添加规则,来源保持和原来一致,tcp对应的就是要访问的端口号,完成保存。
image.png

现在再回到终端运行nodo app.js就可以访问到8081端口了!

安全组作用和防火墙相似,都是IPTables规则来做包过滤,相当于给主机添加多一重保护,设置了安全组后可以给主机添加多一层防火墙作双重防护。

安装pm2进程管理工具

基于node命令运行的项目都是一次性,断开主机连接后就不运行了,这时候需要安装用到进程管理工具。相关的工具有pm2,forever,我推荐pm2,更新更强大!

  • 安装pm2:

npm install -g pm2

  • 使用pm2:

pm2 start app.js

  • 运行pm2 list可以监控进程列表:

pm2 list

pm2的其他命令使用可以参考:
https://www.douban.com/note/314200231/

如果pm2运行刚刚app.js端口有冲突,需要更改端口重新运行或者关掉进程重新运行。Linux查找端口进程和关掉进程的命令:

netstat -apn | grep 端口号

kill -9 进程的pid号

Nginx配置使用

  • 安装Nginx之前需要先安装一些依赖和lib库:

yum install gcc-c++

yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel

  • 直接安装Nginx:

yum install nginx -y

  • 查到版本号即安装成功:

nginx -v

Nginx配置

刚刚pm2运行的app.js示例是在端口8081下运行的,Nginx的反向代理设置可以把端口号去掉或搭配个人域名使用。

反向代理设置

反向代理需要通过修改Nginx的配置文件来完成,Nginx的默认的配置文件是目录etc/nginx下的nginx.conf文件。

  • 进入etc/nginx文件夹

cd /etc/nginx

image.png
  • 用编辑方式打开nginx.conf配置文件

vim nginx.conf

  • 下拉可以看到核心选贤server:
image.png
  • 这个server是Nginx的默认配置,我们需要把默认配置的listen改掉,保留其中一个监听80端口;然后多加一个server选项:
image.png
  • 在添加server的里写上配置:
server {
  listen 80;
  server_name 119.29.72.246;
  location / {
        proxy_pass http://119.29.72.246:8081;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    
    proxy_set_header Host $http_host; 
    proxy_set_header X-Nginx-Proxy true;
    proxy_redirect off;
  }
}

上面配置中,最重要是server_nameproxy_pass选项,proxy_pass对应的是项目运行原本带有端口的iP 地址,server_name是映射proxy_pass地址的新的地址。至此,Nginx初步配置完成。

  • 重启一下Nginx就可以通过server_name的地址就可以访问到项目原来带有端口的地址了。

nginx -s reload

http://119.29.72.246 => http://119.29.72.246:8081;

域名解析成功后,server_name选项可以用域名代替:

server_name xxx.com; //不用带www

现在可以通过域名访问到原来的端口号了:

http://www.xxx.com => http://119.29.72.246:8081;

最后的nginx.conf:

image.png

到现在Nginx的反向代理已经完成,不过如果想更完善些,还能再调整一下。

nginx.conf文件下有一句代码:

include /etc/nginx/conf.d/*.conf

这句代码会把conf.d目录下所以的conf文件引入,所以我们其实可以把刚新建的server选项单独写在这些conf文件里,这种方式对管理复杂项目更加便捷。

  • 打开conf.d目录,新建编辑test.conf

cd conf.d
vim test.conf

  • 把刚刚的nginx.conf里新建的server选项剪贴到该目录下。

负载均衡

所谓负载均衡,就是通过配置多台服务来对单一路径进行访问服务,当有某台主机发生宕机时候,其他主机能承担相应任务,继续提供完整服务。

用刚刚在test.conf做下这个设置,test.conf原文件:

server {
  listen 80;
  server_name 119.29.72.246;
  location / {
        proxy_pass http://119.29.72.246:8081;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    
    proxy_set_header Host $http_host; 
    proxy_set_header X-Nginx-Proxy true;
    proxy_redirect off;
  }
}

改写后的最终文件:

upstream roots {
  server 119.29.72.246:8081;
}

server {
  listen 80;
  server_name 119.29.72.246;
  location / {
        proxy_pass http://roots;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    
    proxy_set_header Host $http_host; 
    proxy_set_header X-Nginx-Proxy true;
    proxy_redirect off;
  }
}

可以看到这个变动只是把server的proxy_pass对应的提取出来,然后在upstream里单独设置。当想设置负载均衡时,只需在upstream里继续添加主机Ip,如:

upstream roots {
  server 119.29.72.246:8081;
  server 119.221.72.246:3000;
  server 119.221.12.246:3000;
  ...
}

这样就可以设置多台主机为119.29.72.246这个访问提供服务了。

更多干货请访问https://github.com/osjj/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,462评论 24 1,003
  • 上一篇《WEB请求处理一:浏览器请求发起处理》,我们讲述了浏览器端请求发起过程,通过DNS域名解析服务器IP,并建...
    七寸知架构阅读 80,526评论 21 356
  • 配置运行Nginx服务器用户(组) 用于配置运行Nginx服务器用户(组)的指令是user,其语法格式为: use...
    吃瓜的东阅读 4,405评论 0 41
  • 1、第八章 Samba服务器2、第八章 NFS服务器3、第十章 Linux下DNS服务器配站点,域名解析概念命令:...
    哈熝少主阅读 3,636评论 0 10