Linux部署nuxt & koa 项目,使用PM2与nginx(对新手非常友好的笔记)

1,352 阅读3分钟

是的你没看错,并非标题党,之所以说对新手非常友好,那是因为新手写的!

关于linux基本操作命令

  1. 既然已经要部署上线了,相信你已经有了自己的服务器了,如果你还没有自己的服务器,先去大厂商云去买一个自己的服务器(个人博客,小项目学习的话,服务器建议怎么便宜怎么选则)
  2. 关于域名: 建议提前选择自己的域名备案,如果你先买了服务器,域名还没买或者备案中也是可以,先先在服务器上把玩的.等域名就绪了,将自己的服务器IP地址,进行解析即可.
  3. 值得一提的是我刚开始时,在Linux装了nginx及启动后怎么也访问不了! 最后是在云服务商里的 控制面板 > 网络与安全 > 安全组 > 安全组规则 选择对应的访问规则,才算完!

对于刚开始接触服务器的我来说,捣鼓了大大半天!!!

在本地电脑上连接远程服务器(Linux)

  1. 打开命令行工具,或者编辑器提供的terminal
$   ssh root@ipAddr         //ssh命令用于博客,学习用没多大的安全问题,ipAddr是你购买的服务器IP地址

2.连接成功后,我们先来安装会用到的软件吧!

  • Nodejs
  • nvm: Node Version Manager - POSIX-compliant bash script to manage multiple active node.js versions
  • PM2: Node.js Production Process Manager with a built-in Load Balancer.
  • nginx: nginx [engine x]是HTTP和反向代理服务器,邮件代理服务器和通用TCP / UDP代理服务器

首先安装nginx

Linux发行版本不同,命令也不同,请自己根据自己的发行版选择安装;

我的是centos,用默认的yum包管理,所以:

$   yum install nignx   //安装

$   yum remove          //卸载

$   nginx -v            //查看当前nginx版本(是否安装成功)  nginx version: nginx/1.14.1    ok!

$   nginx               //启动nginx
$   nginx -s start      //启动nginx

$   nginx -s reload     //重新启动nginx

$   nginx -s stop       //停止nginx

$   pkll -9 nginx       //按名杀死nginx进程

$   nginx -t            //查看nginx状态 >>
<<  nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
<<  nginx: configuration file /etc/nginx/nginx.conf test is successful

1.CoreModule 核心模块

2.EventModule 事件驱动模块

3.HttpCoreModule http内核模块

** 关于nginx防火墙: **

由于我是刚买的服务器所以没有开启防火墙,如果你遇到nginx防火墙的问题,请自己查阅解决一下,几行命令

接下来我们安装nvm: nvm是node版本管理工具

官方提供的 shell 命令

$   curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash$   wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash

>>  nvm --version  
<<  0.35.3(我当前nvm版本)

>>  nvm ls-remote 

>>  nvm install node
>>  Downloading and installing node v14.3.0...
Downloading https://nodejs.org/dist/v14.3.0/node-v14.3.0-linux-x64.tar.xz...
#################################################################################### 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v14.3.0 (npm v6.14.5)

>>  nvm ls
>>
iojs -> N/A (default)
unstable -> N/A (default)
lts/* -> lts/erbium (-> N/A)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.20.1 (-> N/A)
lts/erbium -> v12.16.2 (-> N/A)

node安装

$   nvm install node

$   node -v         //查看node版本

$   npm -v              //npm包管理版本

启动nginx后,我们去本地(自己的电脑)里输入,自己的服务器IP地址:xxx.xxx.xxx,看看是否启动&具备提供访问服务能力

安装PM2

$   npm install pm2 -g      //注意pm2需要本地(你自己的电脑也得全局安装)
所需安装完

接下来准备部署吧!

首先确保自己已经SSH连接到远程服务器了,其次nginx已经安装启动。

$   cd /etc/nginx/          //切换到ngixn安装配置目录`/`表示根目录出发 (相对 || 绝对路径)


$   ls                      //list
>>
conf.d                fastcgi_params.default  nginx.conf           uwsgi_params
default.d             koi-utf                 nginx.conf.default   uwsgi_params.default
fastcgi.conf          koi-win                 nginx.conf.rpmsave   win-utf
fastcgi.conf.default  mime.types              scgi_params
fastcgi_params        mime.types.default      scgi_params.default

$   cat nginx.conf          //查看nginx.conf > server模块 > include 没有被注释,nginx里 ** # ** 

查看nginx.conf

  • 查看nginx.conf/下 server模块 > include 没有被注释,nginx里 # 表示注释

在命令行ls可以查看到,当前目录里有conf.d目录(是目录|文件夹)

$   cd conf.d

$   touch projectName.conf          //创建一个你自己项目名的.conf文件

$   vi projectName.conf             //用vi(linux系统自带)打开,编辑

首先我们先上线不依赖Node.js的项目吧

projectName.conf文件

server {
        listen              80;                                 //(必填可修改)监听
        server_name         你的域名(xxx.com);                  //(必填可修改)你公开访问的备案域名

        location / {
                root        /var/www/porject;                   //(必填可按自己的喜欢目录存放修改)我将打包的项目放在了此目录文件夹下
                index       index.html index.htm index.php;     //包含的index
        }
}

编辑好后:

  1. 按Esc键
  2. shift + :
  3. :wq

1.2.3步走! 一气呵成,保存退出

  1. :wq!(加上!感叹号是强制保存退出)
$   cd ..           //切换到上一层目录下

$   ls              

cd /var/www/        //我将项目存放在这里的,你可以根据自己喜欢存放,但是一定要对应projectName.conf里的location/的root   如我的配置是/var/www/porject;
好吧
$   cd /var/www/

$   mkdir projectNmae       //创建项目文件夹(你自己的喜好命名)

$   cd projectNmae          //我将项目 /dist 文件夹存放与此

梳理一下目录: /根目录下 /var/www/xxx/dist/[index.html(文件),static(文件夹)] static是静态资源;

nginx,最最最最最最最最最基本的配置后应该就按对应的域名,访问项目了(旨在快速,简单,上线)

nginx , pm2 部署 nuxt.js

ssh连接服务器,切换到/根目录下/etc/nginx/conf.d/ 下 **在Linux无论在哪里 cd /**都可以切换到根目录/

cd /etc/nginx/conf.d/

$   touch projectName.conf

$   vi projectName.conf

projectName.conf 配置如下

    server {
    listen          80;                          
    server_name     domain.com;                                 //改成你的域名

    location / {
        proxy_set_header Host                   $http_host;
        proxy_set_header X-Real-IP              $remote_addr;
        proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
        proxy_set_header X-Nginx-Proxy          true;
        proxy_pass http://127.0.0.1:3000;                       //我的nuxt项目在本地是3000端口
        add_header Access-Control-Allow-Origin: *;
        proxy_redirect                          off;
    }
}
  1. 按Esc键
  2. shift + :
  3. :wq

1.2.3步走! 一气呵成,保存退出

  1. :wq!(加上!感叹号是强制保存退出)

================================================================

回到自己当前所开发目录下,创建pm2发布配置文件(不一定是跟目录,但最好是跟目录) 如我:

$   vi deploy.conf.js                   //跳过touch 命令直接用vi编辑器打开,并编辑后可保存.
module.exports = {
	app: [
    {
    	name: 'yoee',
    	script: 'server/index.js',
    	env: {
    		COMMON_VARIABLE: 'true'
    	},
    	env_production: {
    		NODE_ENV: 'production'
    	}
    }
	],

	deploy: {
		production: {
			user: 'root',                       //服务器用户名 我的是root
			host: 'xxx.xxx.xxx.xxx',            //你的服务器Ip地址
			ref: 'origin/master',
			repo: 'https://gitee.com/yoee/yoee.git',    //gitee||github仓库地址
			path: '/var/www/yoee',              //发布到服务器的何路径文件夹下?(自喜自修改)
			'pre-deploy': 'git fetch --all',
			'post-deploy': 'npm install && npm run build && npm start && pm2 startOrRestart deploy.config.js --env production'      //我将npm替换成cnpm暂没问题(因为更快,repo配置gitee发布也很快,你懂得)          
		}
	}
}

记得 ctrl+s 保存,提交 gitee || github

还有** package.json **文件里要修改配置scripts字段

package.json 文件

{
  "name": "yoee",
  "version": "1.0.0",
  "description": "proj",
  "author": "yoee",
  "private": true,
  "scripts": {
    "dev": "cross-env NODE_ENV=development nodemon server/index.js --watch server",
    "build": "nuxt build",
    "start": "cross-env NODE_ENV=production pm2 start server/index.js",  //将node替换成 pm2 start运行接管
    "generate": "nuxt generate"
  },

配置好后重新git提交到仓库,确保github是最新的项目代码

>

最后

我踩过的坑

因为 .nuxt 项目文件夹在 .gitignore

  1. 没有被忽略掉,导致我在发布时(失败时)遇到很久很久很久很久很久很久很久很久以前的发布(像是缓存|历史版本).
  2. 因为自己刚接触服务端,在学习配置是,折腾配置将端口port多次修改,导致我一个域名下同时监听多个服务器端多个端口,浪费!!!而且,因为不同端口都发布某次学习部署,导致坑 1 成立!

所以:

$   netstat -ntlp       //推荐刚学习部署的同学,看看自己当前所用的端口,将占用的kill掉(当心!)

发布命令

  1. 在项目目录启动terminal:从github仓库拉取代码到服务器。
$    pm2 deploy deploy.conf.js production setup  //发布命令,pm2会按我们配置,到github拉取代码
  1. 将服务器端的代码发布:
$    pm2 deploy deploy.conf.js production

这个过程会让你输入密码(多次,但可配置)


如果以上配置部署失败,请出门右转,继续查学习资料,仅记学习笔记和个人收获...