daduryi 2019-11-04
前段时间在公司部署项目的时候,运维同学说了一堆关于服务器的东西,顿时感觉不知所云,云里雾里。。。
索性拿这个项目练习一下,简单了解项目部署到服务器的这个流程是怎么处理的
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 可以查看正在运行的项目
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配置文件
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
由于后面项目要部署到服务器中 建议可以先做ssh-copy-id 建立信任 这样就不用重复输入密码了
一般来说 需要安装 npm cnpm node pm2 git nginx
yum install npm
npm install -g cnpm --registry=https://registry.npm.taobao.org
npm i pm2
npm i n
yum install git
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文件夹 在其中写一个 production.json 用于启动pm2
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: [‘你的IP地址‘] } }) }
这里 pm2 使用的配置文件来启动 所以配置了 pm 参数 会根据这个文件路径来启动pm2
"deploy": "shipit production deploy", "rollback": "shipit production rollback",
项目部署完毕后,去服务器查看下项目进程
pm2 list
打开页面 看下效果
到目前为止,算是部署完毕了
解决: 服务器上忘记安装git了
这个就很明显了,没有安装 cnpm
原来部署完毕是
然后求助一位大神,发现是shipit配置文件中 没写
require(‘shipit-pm‘)(shipit)
[摔桌子!]
调整文件后重新上线
会启动三个进程
如果你的项目启动时候端口号并没有在安全组中配置,需要在后台中添加安全组
在访问页面的时候 还需要输入端口号 3389。非常懒,不想输入端口号
在安全组中添加默认端口80,将启动文件app.js中端口调整为80。这样就不需要输入端口号了
那如果不想修改app.js文件怎么办,使用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 -c /etc/nginx/nginx.conf nginx -s reload
搞定~
欢迎访问 点我查看项目