linux之记服务器上线并维护更新一个node项目

前言

首先,本人只是一个开发安卓和前端辣鸡,后台服务器相关知识涉及比较少,也不太懂,以下纯个人学习而来,仅供参考,肯定很多问题跟实际不一定一样,轻喷,最好勿喷

涉及技术点:linux常用命令,shell脚本,git使用,firewall防火墙,nginx,infotify,pm2,node等相关知识

由于去年忙里抽空用node写了一套系统,作为一个前端,对后台服务器等知识不了解,所以就想走一遍整个流程:

开发->申请域名/部署服务器->上线项目

先说下,一个项目的简单发布有如下三个仓库:

可以看到,本地的代码仓库和服务器代码仓库是一样的,都可以相对裸仓库进行push/pull,因为两者本来就一样,本地代码仓库是为了在本地跑,服务器代码仓库是为了在服务器跑,之所以不用裸仓库直接当项目跑,而是弄一个代码仓库,是因为裸仓库是经过加密处理的,我们根本看不懂,更何况当成正常项目来跑了,但是clone出来的就可以正常显示了,至于为啥问git去,看git源码去。

1.服务器创建裸仓库:git init --bare。

2.服务器创建代码仓库,从裸仓库clone来

3.本地创建代码仓库

然后绑定到服务器裸仓库:git remote add origin <用户名>@<服务器公网IP>:/<服务器裸仓库地址>。我用的用户名是root,如果觉得不安全,也可以创建其他用户,然后限制权限,因为root属于最高权限账户,所以很多操作为了安全会创建其他账号比如git账户,用以限制其权限只用来做代码的控制。

4.使用forever/pm2在服务器将代码仓库跑起来

执行npm start,nodejs项目跑起来后,默认开启3000端口,http://localhost:3030,我们知道,npm start之后我们无法进行其他操作了,除非control+c停止运行,因为我们不是在后台跑的,所以受限,为了让它可以在后台跑,我们可以用相关工具,forever或者pm2,具体看相关资料,我在项目中用的是pm2,具体使用在下面会说明

5.使用nginx将域名绑定到这个项目,扩展firewall防火墙

比如通过shudongpo.com这个域名访问到我们的项目,那么就需要将域名和3030端口绑定起来,这样才可以在服务器外进行访问项目,这才算是成功发布了,这个步骤我们需要借助nginx来实现,使用nginx将域名转发到3000端口,具体如下:

使用yum安装nginx:yum install -y nginx。

安装后:nginx -t查看配置文件位置。

使用vim编辑nginx配置文件增加一个server:

    server {
        listen       80;
        server_name  xxx.xxx.cn;
        location / {
            proxy_pass http://localhost:3000;
        }
    }

这样当你访问xxx.xxx.cn的时候就可以访问到你跑起来的node项目了。

注意:80端口请在自己的服务器的安全组里面开放出来,以免无法访问;如果你的linux服务器安装了firewall防火墙,很有可能你的firewall将80端口给关闭了,所以可以将其开启:firewall-cmd --zone=public --add-port=80/tcp --permanent。

firewall知识扩展:

开放端口,firewall-cmd --zone=public --add-port=80/tcp --permanent
命令含义:
--zone #作用域
--add-port=80/tcp  #添加端口,格式为:端口/通讯协议
--permanent   #永久生效,没有此参数重启后失效
查看已开放端口,firewall-cmd --list-ports
重启,firewall-cmd --reload
查看默认防火墙状态,firewall-cmd --state

nginx配置完成后请重启:systemctl start nginx,如果已经开启过那就restart。

然后在电脑上输入绑定的域名就可以访问项目了。

6.使用inotify、shell脚本、pm2实现自动更新线上项目【重点】

现在项目已经跑起来了,那么有什么问题呢?电脑上修改代码后push到服务器裸仓库,但是服务器代码仓库我们没有pull,所以代码没更新,即使更新了我们没有重新跑项目,访问的时候还是不会更新的,所以需要解决的问题:

电脑push代码 -> 服务器裸仓库收到更新后更新代码仓库 -> 代码仓库更新后重新跑起来

6.1.电脑push代码

本地执行push即可

6.2.服务器裸仓库收到更新后更新代码仓库

此步骤需要分两步来走:1.服务器监听到裸仓库更新;2.裸仓库更新后,自动更新代码仓库

先说监听裸仓库的更新,我们也可以用git的钩子实现,具体请查看相关资料,我这里介绍下inotify,我使用的inofity来监听的

安装inotify:

yum install inotify-tools -y

执行监听,直接写个shell脚本来跑,touch update.sh:


#!/bin/bash
#监听裸仓库xxx.git改变完成后,执行xxx代码仓库进行pull
inotifywait -m -e modify -r /local/git_project/xxx.git/ |
while read events            #读取事件
do
cd /local/node_workspace/xxx #cd到代码仓库目录
git pull                     #pull代码
echo 'xxx.git裸仓库有变动,已pull最新代码到代码仓库'
echo $events                 #打印事件
done

inofity相关命令知识扩展:

inotifywait -m -e modify -r /local/git_project/xxx.git

-m表示保持监听,否则只会执行一次,-e modify表示监听的事件是modify(文件内容被修改),-r表示递归监听,也要监听子文件

脚本写完了,但是它只是一个普通文件,我们需要赋予它执行权限: chomd +x update.sh

跑脚本:./xxx.sh,这样会有问题,这不是后台跑,我们一旦退出无法后台执行,所以:./xxx.sh &后台跑,还是有问题,shell脚本进程是shell终端进程的子进程,当shell终端关闭后,它的子进程就会关闭,所以脚本会停止,所以:nohup ./xxx.sh &,表示不中断的跑在后台,即是在后台跑,也不会因为关闭shell终端而中断

那么脚本跑起来了,当我们在本地电脑push代码,服务器inotify会监听到裸仓库修改了,然后cd到代码仓库执行pull,代码仓库代码就会更新了

6.3.代码更新后自动reload,并且让项目在后台跑,而不是npm start一直跑在前台

实现该步骤需要借助pm2工具来实现,安装:npm install pm2 -g

如果仅仅让它跑在后台,而不需要代码更新后自动reload,可以:pm2 start bin/www

如果既要跑在后台又要监听代码更新后自动reload,那么我们需要配置文件,首先:pm2 ecosystem,生成配置文件config.js,然后修改:

module.exports = {
  apps : [{
    name: 'shopsystem-server-pms',
    script: './bin/www',    #主要是这里,修改启动项

    // Options reference: https://pm2.keymetrics.io/docs/usage/application-declaration/
    args: 'one two',
    instances: 1,
    autorestart: true,
    watch: false,
    watch_options: {
      "usePolling": true
    },
    max_memory_restart: '1G',
    env: {
      NODE_ENV: 'development'
    },
    env_production: {
      NODE_ENV: 'production'
    }
  }],

  deploy : {
    production : {
      user : 'node',
      host : '212.83.163.1',
      ref  : 'origin/master',
      repo : '[email protected]:repo.git',
      path : '/var/www/production',
      'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production'
    }
  }
};

然后:pm2 start config.js

这样便会自动监听当前目录下的所有文件夹和文件,一旦有更新会自动reload

需要了解pm2相关知识请至:https://pm2.keymetrics.io/docs/usage/application-declaration/

至此,项目的整个流程完成了

发布了33 篇原创文章 · 获赞 49 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/gsw333/article/details/105176839