精简版nodejs线上项目部署
本文不讲解各种技术的详细使用,只把整个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.png2.DNSPod平台解析
打开DNSPod官网,注册登陆。
- 进入域名解析控制台
- 点击域名选项进入主机记录界面
- 点击添加记录,同样只需要把记录类型选为A,主机记录填www,记录值填自己IP地址,其他的默认即可。
注意:
自己当前的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'说明没问题了,如果长久页面跳转不成功,说明端口出了问题,这是服务器的安全组设置所导致的。
- 打开服务器控制台,打开安全组选项:
- 打开编辑规则:
- 进入添加规则界面可以看到各条规则,我们要访问哪个端口,必须添加相应的入站规则。(出站规则是本站访问外网时设置的)
- 添加规则,来源保持和原来一致,tcp对应的就是要访问的端口号,完成保存。
现在再回到终端运行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文件夹
image.pngcd /etc/nginx
- 用编辑方式打开nginx.conf配置文件
vim nginx.conf
- 下拉可以看到核心选贤server:
- 这个server是Nginx的默认配置,我们需要把默认配置的listen改掉,保留其中一个监听80端口;然后多加一个server选项:
- 在添加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_name与proxy_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/。