记一次完整的项目部署

前段时间在公司部署项目的时候,运维同学说了一堆关于服务器的东西,顿时感觉不知所云,云里雾里。。。

索性拿这个项目练习一下,简单了解项目部署到服务器的这个流程是怎么处理的

预备知识

pm2

pm2 是启动node进程管理工具

常用命令

···

pm2 start app.js : 启动服务,入口文件是app.js

pm2 list 查看有哪些进程启动

pm2 show xxx 查看某一个服务的详情

npm restart [name or id] : 重启服务

pm2 monit : 对服务进行监控

···

一个项目的package.json 文件

平时启动服务我们可以使用 node run app.js

如果借助pm2 来启动服务 就可以输入 pm2 start app.js

在命令行输入 pm2 list 可以查看正在运行的项目

pm2支持配置文件启动

  • script 启动脚本路径
  • exec_mode 应用启动模式,支持fork和cluster模式
  • instances 应用启动实例个数,仅在cluster模式有效,默认为fork

fork和cluster模式

fork为单进程 cluster可以启动多个进程

在项目中新增一个pm2配置文件 pm2.config.json

{
  "name": "mxx-project",
  "script": "./index.js",
  "error_file": "./logs/err.log",
  "out_file": "./logs/out.log",
  "log_date_format": "YYYY-MM-DD HH:mm Z",
  "instances": 3,
  "merge_logs": true,
  "exec_mode": "cluster",
  "node_args": "",
  "ignore_watch": ["node_modules"],
  "env": {
    "NODE_ENV": "development"
  }
}

在命令行输入

pm2 start pm2.config.json

则会有三个进程被创建

注: 如果你的服务器是多核的 那么很有可能在cluster 模式下 被创建多个进程

可以查看一下自己的服务器是几核的

shipit

shipit 是自动化的服务器部署工具

一个简单的shipit配置文件

module.exports = shipit => {
  require(‘shipit-deploy‘)(shipit)
  shipit.initConfig({
    default: {
      workspace: ‘/tmp/myapp‘,
      deployTo: ‘/var/myapp‘,
      repositoryUrl: ‘你的GitHub地址‘,
      ignores: [‘.git‘, ‘node_modules‘],
      keepReleases: 2,
      deleteOnRollback: false,
      key: ‘/path/to/key‘,
      shallowClone: true,
    },
    staging: {
      servers: ‘你的服务器地址‘,
    },
  })
}

连接服务器

购买服务器之后 得到IP地址 可以尝试登陆服务器

一般自己的服务器可以使用root身份登陆操作

ssh [email protected]

由于后面项目要部署到服务器中 建议可以先做ssh-copy-id 建立信任 这样就不用重复输入密码了

在服务器上配置环境

一般来说 需要安装 npm cnpm node pm2 git nginx

  • 安装npm
yum install npm
  • 安装 cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
  • 安装pm2
npm i pm2
  • 安装node
npm i n
  • 安装git
yum install git
  • 安装nvm
 wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash

需要调整 vim ~/.bashrc

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm

指定默认node版本

nvm alias defalut 8

启动一个简易服务

我们来写一个简单的脚本 在服务器上, 我这里是在 /home/work 目录下新建了一个app.js (依次执行)

cd home
mkdir work
touch app.js

在app.js中 写一个最简单的服务

const http = require(‘http‘)
const port = 3389

http.createServer((req, res) => {
  res.end(‘Hello word!‘)
}).listen(port, () => {
  console.log(port, ‘port‘)
})

启动app.js

node app.js

然后打开浏览器,输入IP+端口号,就能在页面中看到hello word了

--补充--

1 这里使用的端口号是 3389 是因为我的服务器中 安全组中已经配置了 3389 这个端口号

如果你使用的是其余端口 要注意去查看有没有配置安全组

2 关于启动服务

如果使用的是node 那么一旦退出服务器,则无法再访问此服务

可以换成使用pm2 来启动 这样一旦启动 除非报错,将会一直有此进程存在

准备部署

  • 准备项目

项目是用koa1 + React

react的项目地址 点我查看GitHub地址

启动的端口号调整到3389

  • 准备pm2启动文件

创建pm2文件夹 在其中写一个 production.json 用于启动pm2

  • 在项目中创建一个 shipit.js 基本配置如下
module.exports = function (shipit) {
  require(‘shipit-deploy‘)(shipit)
  require(‘shipit-cnpm‘)(shipit)
  require(‘shipit-pm‘)(shipit)
  shipit.initConfig({
    default: {
      workspace: ‘/tmp/deploy/your-project‘,
      deployTo: ‘/home/work/your-project‘,
      repositoryUrl: ‘https://github.com/youproject.git‘,
      ignores: [‘.git‘, ‘node_modules‘],
      keepReleases: 2,
      deleteOnRollback: false,
      key: ‘/path/to/key‘,
      shallowClone: true,
      cnpm: {
        flags: ‘--production‘,
        local: false,
        npm: ‘cnpm‘,
        remote: true
      },
      pm: {
        production: {
          path: ‘/home/work/your-project/current/pm2/production.json‘
        }
      }
    },
    production: {
      servers: [‘[email protected]你的IP地址‘]
    }
  })
}

这里 pm2 使用的配置文件来启动 所以配置了 pm 参数 会根据这个文件路径来启动pm2

  • 在项目的package.json中 添加两个字段
    "deploy": "shipit production deploy",
    "rollback": "shipit production rollback",
  • 将项目push到GitHub中
  • 执行 npm run deploy

项目部署完毕后,去服务器查看下项目进程

pm2 list

打开页面 看下效果

到目前为止,算是部署完毕了

部署过程出现的问题

  • 报错1

解决: 服务器上忘记安装git了

  • 报错2

这个就很明显了,没有安装 cnpm

  • 部署成功之后去服务器查看 项目并没有启动

原来部署完毕是

然后求助一位大神,发现是shipit配置文件中 没写

require(‘shipit-pm‘)(shipit)

[摔桌子!]

调整文件后重新上线

会启动三个进程

根据项目端口号配置阿里云

如果你的项目启动时候端口号并没有在安全组中配置,需要在后台中添加安全组

在访问页面的时候 还需要输入端口号 3389。非常懒,不想输入端口号

在安全组中添加默认端口80,将启动文件app.js中端口调整为80。这样就不需要输入端口号了

那如果不想修改app.js文件怎么办,使用NGINX

配置NGINX

  • 安装 nginx

yum install nginx

查看NGINX配置文件

cat  /etc/nginx/nginx.conf

很简单的配置

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  ‘$remote_addr - $remote_user [$time_local] "$request" ‘
                      ‘$status $body_bytes_sent "$http_referer" ‘
                      ‘"$http_user_agent" "$http_x_forwarded_for"‘;

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

}

将项目入口文件app.js中端口号调整为 9999

处理Nginx.conf.js

最后调整为 (比较重要的是server 这里只展示server部分)

 server {
        listen       80;
        server_name  localhost;

        location / {
          proxy_pass  http://127.0.0.1:9999/;
        }
    }

启动Nginx

nginx -s reload

Nginx配置出现的问题

  • 重启Nginx

在重启Nginx的时候 一直报错

查阅文章后处理

nginx -c /etc/nginx/nginx.conf
nginx -s reload

搞定~

欢迎访问 点我查看项目

参考文章

原文地址:https://www.cnblogs.com/qianduanwriter/p/11795634.html

时间: 2024-08-30 10:18:03

记一次完整的项目部署的相关文章

“全栈”工程师笔记/记一个完整的项目流程

引语:相信很多人都自认为自己是个全栈工程师,不管有没有验证过,我也不例外.心中总有一种傲气,事情都能做,只是做得好不好,时间够不够的问题!所以,对很多事情,我其实是一点不怕的,随着时间的推移,人总是应该要进步的,去做一些没做过的事,才对得起成长二字! 刚好上上个月,公司有一个新的项目需求,需要做一个全新的系统,但是看起来也不难,所以任务就交给了我,我可以说我是这个项目负责人吗?应该是可以的!但是,最开始就已经存在了一些坑,等着我去跳,就连最开始过需求的时候,我也不在场!不过,最终,项目也终于交到

SSIS教程:创建简单的ETL包 -- 6. 对项目部署模型使用参数(Using Parameters with the Project Deployment Model)

在本课中,将修改在第 5 课: 添加包部署模型的包配置中创建的包,以便使用项目部署模型.您将使用一个参数替换该配置值,以便指定示例数据位置.还可以复制本教程附带的已完成的 Lesson 5 包. 使用 Integration Services 项目配置向导,您将该项目转换为项目部署模型,并且使用参数而不是配置值来设置 Directory 属性.本课部分介绍了您将现有 SSIS 包转换为新的项目部署模型时要遵循的步骤. 再次运行包时,Integration Services 服务将使用参数填充该变

一个完整的项目中,需要的基本gulp

一个完整的项目需要使用gulp的多种功能,包括—— (1)加载各种需要的插件 var concat=require('gulp'); var clean=require(''gulp); 等等.需要的插件放在指定的module文件夹下面,然后再修改文件中修改. (2)启动任务和完成部署任务 我们想要在文件进行操作之前,首先将文件的环境弄好,例如,想把a放在一个目录下,但是这个目录下面有着很多的不需要的文件,所以我们首先需要将这些文件删除—— gulp.task('cleanTask',funct

如何把php项目部署到阿里云服务器window server2012__含公网ip访问时jquery/ajax失效解决办法

记一次蛋疼的折腾. 弄了一晚上最后发觉是360浏览器的问题,换个浏览器就好了.垃圾360用什么IE7文档模式.导致界面和功能失效. 建议大家测试的时候用firefox或者chrome. 项目部署到服务器后360浏览器兼容模式显示错误的解决办法:http://www.cnblogs.com/zj917/p/6697724.html -------------------------------------------------- 正文: 上篇博客说临时起意做了个有意思的聊天版,就想把它部署到阿里

react + redux 完整的项目,同时写一下个人感悟

先附上项目源码地址和原文章地址:https://github.com/bailicangd... 做React需要会什么? react的功能其实很单一,主要负责渲染的功能,现有的框架,比如angular是一个大而全的框架,用了angular几乎就不需要用其他工具辅助配合,但是react不一样,他只负责ui渲染,想要做好一个项目,往往需要其他库和工具的配合,比如用redux来管理数据,react-router管理路由,react已经全面拥抱es6,所以es6也得掌握,webpack就算是不会配置也

JBoss AS7中进行项目部署

AS7的项目部署方式与原有版本相比有了较大变化,本文通过实例来讲解AS7中的项目部署方式. 有关JBoss AS7的下载和安装,请参考蓝点上面的另一篇文章: http://bluedash.net/spaces/JBoss%20AS%207%20快速上手 部署一个简单的Web项目 下载安装完成后,我们用standalone方式来启动JBoss AS7: liweinan@smart:~/projs/jboss-7.0.0.CR1/bin$ ./standalone.sh 启动后,我们试着向AS7

JSP_运维_JSP项目部署到server(适合0经验新手)

实战:真正server端部署jsp项目经验总结与记录(完整过程从0到10适合对server端部署0经验新手) jsp+tomcat+mysql项目部署到真正server; servermysql安装; serverjdk安装; servertomcat安装; serversql文件管理; serverjsp项目与servermysql连接; 将项目与域名进行绑定的相关教程已经更新.网址 第一步是安装jdk,jdk应该是全部须要安装的软件中最先安装的. jdk详细怎样安装能够參考这篇 我截取了能够

项目部署流程

项目部署 http://blog.51cto.com/ljmict 项目部署流程: 买服务器, 服务器租用 选择操作系统的版本,安装系统 在开发环境中把项目需要的pip包写到一个文件 pip freeze . requirements .txt 把项目上传到服务器 部署项目, 安装需要的环境 pyhton3解释器 虚拟环境 数据库 nginx, uwsgi 服务器 nginx mysql redis uwsgi celery docker 网站流量参考 网站流量度量 pv:独立访客 ip:独立i

linux--后端项目部署

nginx + uwsgi + crm + mysql + virtualenv + supervisor项目部署 1.后端整起,用uwsgi启动crm 2.创建一个新的虚拟环境,用于运行crm新业务 mkvirtualenv crm_env (crmenv) [[email protected] Envs]# which python3 /root/Envs/crmenv/bin/python3 确认python3来自虚拟环境下 3.上传crm代码到服务器 4.解决代码的模块依赖 之前在一个e