V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Johnsen
V2EX  ›  程序员

Node App 部署

  •  
  •   Johnsen · 2017-11-13 16:39:11 +08:00 · 2004 次点击
    这是一个创建于 2327 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Node App 部署

    原文地址

    环境 (System):

    CentOS 7

    服务器可视化管理工具( GUI )

    MacOS 系统推荐使用 Cyberduck (小黄鸭)

    Cyberduck

    Windows 系统推荐使用 FileZilla

    FileZilla

    准备 (Requirement)

    • git: 分布式代码版本管理工具
    • node: 基于 Chrome V8 引擎的 JavaScript 服务端运行环境
    • npm: node 的倚赖包管理器
    • pm2: node 应用进程管理器

    安装 (Install)

    一般在 Linux 系统中安装程序有三种方式:

    1. 下载源码,手动编译
    2. 直接下载二进制文件
    3. 用 yum 安装

    这里推荐用第二种。

    Install git

    如果系统有自带的 git,可执行 yum remove -y git 删除

    1. 安装倚赖:

      yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
      
    2. 前往 github 下载安装包,拷贝至 /usr/src(拷贝可通过可视化工具直接将相应文件拖入目标文件夹),或者直接用 wget:

      cd /usr/src
      yum install -y wget
      wget https://www.kernel.org/pub/software/scm/git/git-2.10.2.tar.gz
      tar xvzf git-2.10.2.tar.gz
      
    3. make 安装:

      make prefix=/usr/local all
      make prefix=/usr/local install
      
    4. 检查 git 是否安装成功:

      git --version
      

    安装 node 和 npm:

    1. 前往 node official site 下载对应的编译好的 Linux 源码,或者直接用 wget 下载:

      cd /usr/src
      wget https://nodejs.org/dist/v6.10.3/node-v6.10.3-linux-x64.tar.gz
      tar xvf node-v6.10.3-linux-x64.tar.gz
      
    2. 创建软链接至 /usr/local/bin

      ln -s /usr/src/node-v6.10.3-linux-x64/bin/node /usr/local/bin/node
      ln -s /usr/src/node-v6.10.3-linux-x64/bin/npm /usr/local/bin/npm
      
    3. 检查 node 与 npm 是否生效

      node -v
      npm -v
      
    4. 接下来要配置一下 npm,将 npm 的默认全局安装路径自定义到 /$HOME/.node:

      npm config set prefix $HOME/.node
      
    5. 添加国内 npm 淘宝镜像:

      npm config set registry https://registry.npm.taobao.org/
      
    6. 配置系统路径,使 npm 全局安装的模块命令行 bin 生效:

      echo "export PATH=$PATH:$HOME/.node/bin" >> ~/.bashrc
      source ~/.bashrc
      

    安装 pm2:

    npm install -g pm2
    

    布署 (Deploy)

    布署分为不用 git 和基于 git 两种方式。前者主要是用于 git 代码网络属于内网的环境下。

    不用 git 的话,下载 git 项目的 tag 包或者将项目文件直接拷贝至目标主机。

    不基于 git 部署

    1. 安装依赖

      // 安装 node 倚赖包
      npm install --production
      
    2. 运行项目

      // node 启动,pm2 启动下面有详解
      node app.js
      

    推荐使用 git

    为了更好的版本管理与更轻松的解决版本倚赖,推荐使用 git。

    git 的传输协议有 https 和 ssh 两种,我们采用更加安全快速的后者。服务器只需 git 的只读权限,因此不必配置 git user,只需生成 ssh key 做为项目的 deploy key ( gitlab 项目右上角的菜单中选择 "Deploy Keys",在此添加服务器的公钥 "id_rsa.pub" 中的内容)。

    (ps. 关于如何生成 ssh key,可参见此,这里要输入的邮箱改为服务器名即可)。

    1. 接下来 clone 项目代码至服务器:

      git clone [email protected]:<GROUP>/<PROJECT>.git <NODE_APP_DIR>
      

    注:尖括号内的为变量

    1. 检出版本

      // 查看当前所有版本
      git tag
      
      // 切换到指定版本,这里的 <TAG> 是演示,比如可以是 1.0.0
      git checkout <TAG>
      
    2. 安装倚赖:

      // 如果没用到 bower,跳过此步骤
      bower install --allow-root
      
      // 安装 node 倚赖包
      npm install --production
      

    注:不采用 git 布署的话,只需执行最后一步

    至此,无论是否使用 git,布署都已完成。

    运行 (Run)

    在项目根目录下,运行 pm2 start pm2.json 即可。

    pm2.json 中的 name 字段为 App name,pm2 可以全局地操作它:pm2 stop <APP_NAME>

    另外有几个比较有用的命令:

    • 查看所有的 node 应用进程:pm2 list
    • 查看某个应用的具体信息:pm2 show <APP_NAME>
    • 监控 CPU / Memory: pm2 monit
    • 查看应用消息日志:pm2 logs <APP_NAME>
    • 重启应用程序:pm2 restart <APP_NAME>

    更多的命令用法请查看: https://github.com/Unitech/pm2#main-features

    更新或回滚 (Update/Rollback)

    1. 不使用 git:之前已提到过,直接在 gitlab 上下载 tag 包,解压缩覆盖至服务器

    2. 使用 git:先通过 git 获取更新

      git fetch origin --tags
      

      再切换:

      git checkout <NEW_TAG>
      

      回滚也非常简单:

      git checkout <PREV_TAG>
      

    Nginx 反向代理

    Nginx 入门参考材料前端工程师学习 Nginx 入门篇

    执行完以上步骤,假设你的项目启在localhost:3000,想通过 www.yourdomain.com 来访问,需要通过如下步骤配置(以阿里云域名为例):

    • 进入阿里云域名控制台,添加域名解析 阿里云
    • 配置反向代理
       server {
           listen 80;
           server_name www.yourdomain.com;
           root /var/www/;
           location / {
               # 反向代理我们通过 proxy_pass 字段来设置
               # 也就是当访问 www.yourdomain.com 的时候经过 Nginx 反向代理到服务器上的 http://127.0.0.1:3000
               proxy_pass http://127.0.0.1:3000;
               proxy_set_header   Host   $host:$server_port;
               proxy_set_header   X-Real-IP   $remote_addr;
               client_max_body_size    100m;
               proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
           }
       }
    
    • 修改完上面配置信息之后,执行下面命令检查配置文件语法是否有误并且重新加载配置:

      nginx -t && nginx -s reload
      
    4 条回复
    halfcrazy
        1
    halfcrazy  
       2017-11-13 16:57:02 +08:00   ❤️ 1
    也可以直接在你服务器上创建一个 bare 的仓库,设置 hook 去做服务器上的发布。这样能 push 到服务器上就自动发布了。还可以用 fabric ansible 这类工具写发布脚步。连上服务器做手动发布还是太原始了
    winglight2016
        2
    winglight2016  
       2017-11-13 17:40:32 +08:00   ❤️ 1
    我看完了也没搞明白在安装什么?就是搭 node 运行环境吗?
    GooMS
        3
    GooMS  
       2017-11-13 17:40:48 +08:00 via Android   ❤️ 1
    也可以用 CI 简单的自动部署
    sarices
        4
    sarices  
       2017-11-13 17:52:23 +08:00   ❤️ 1
    建议楼主用 jenkins+docker,或者将 jenkins 换成其他
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5818 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 01:55 · PVG 09:55 · LAX 18:55 · JFK 21:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.