美文网首页全栈笔记程序员让前端飞
精简版nodejs线上项目部署

精简版nodejs线上项目部署

作者: osjj | 来源:发表于2017-07-31 22:22 被阅读0次
    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/

    相关文章

      网友评论

        本文标题:精简版nodejs线上项目部署

        本文链接:https://www.haomeiwen.com/subject/ezhdlxtx.html