在本地开发好node项目和vue前端项目后,我们需要部署到linux服务器上,那么我要要如何部署呢?

首先,本人node后端项目和前端vue项目是分离的,那么前端vue项用是nginx来部署运行,当然跟node部署在一起也是可以的。

安装步骤如下(这里nginx和node环境、mongodb都是先安装好的),具体安装可以看:

1、在linux系统中安装Nodejs 的简单步骤说明

2、在linux系统中安装MongoDB的步骤和使用说明

3、Centos7服务器安装Nginx步骤和使用说明

以下是自己部署的一些简单笔记。

一、部署node项目

其实部署node项目相对是比较简单的。

1、首先我这里是在服务器上建一个目录workspace/server,在server里放node项目的代码。(当然大家自己可以根据自己的习惯建),这里自己也是随便建的。注意:修改新建的文件夹的权限(本人是xftp上直接修改的)

2、上传node代码

 新建好放项目的文件夹后,我们要上传到workspace/server目录下,为了方便,这里本人是用xftp上传的。
cd /workspace/server 执行npm i  安装依赖 

npm i
然后安装express等框架(因为自己使用的express),这里自己使用了mongoose,执行npm i mongoose
npm i mongoose
以上步骤就可以了。

当然我们还可以安装express npm install express-generator -g 来快速创建Express应用骨架。
然后建立软链接,ln -s /usr/local/bin/node-v10.15.2-linux-x64/bin/express /usr/local/bin/express
然后cd /workspace/server用express初始化项目

最后把我们本地的node的代码传上去替换一下也是可以的。

3、运行node

安装完成后 cd workspace/server  执行node bin/www,  如图所示成功了。

4、 安装pm2

上面我们运行完成后,ctrl+c 后,node就停止,那么怎么样让node项目一直在运行呢,我们可以安装pm2来运行。

npm install -g pm2

安装好后,发现是安装在/usr/local/bin/node-v10.15.2-linux-x64/bin的,所以我们可以建立一下软链接。(因为自己的node,mongodb等是安装在/usr/local/bin目录)

ln -s /usr/local/bin/node-v10.15.2-linux-x64/bin/pm2 /usr/local/bin/pm2
如图所示,我们在任何目录都可以使用pm2命令了。

5、用pm2启动node项目

启动应用 pm2 start bin/www  或者 pm2 start [app id]


6、pm2常用的一些命令

1、查看运行状态pm2 list
	 
2、追踪资源运行情况  pm2 monit
	 
3、查看日志 pm2 logs
	 
4、停止应用  pm2 stop bin/www	 获取pm2 stop [app id]
	 
5、重启应用  pm2 restart appId(appId就是我们通过pm2 list查看到运行的www的id,这里我们pm2 start bin/www的www是0)所以 pm2 restart 0
	  
6、查看应用详细部署状态   pm2 describe 0

7、因为自己用的是阿里云服务器,所以在使用3000端口的时候,先要配置一下安全组规则,如图所示。


然后在浏览器输入http://xx.xx.xxx.xxx:3000就可以访问了。如图所示

已经部署成功了。

 二、nginx部署vue项目 

nginx的安装和常见操作命令,可以查看如下文章:

Centos7服务器安装Nginx步骤和使用说明


1、首先我们通过 npm run build 打包好我们的代码,然后上传到服务器即可,这里本人项目放在/home/myshop下。

(这里要有一点要注意一下,因为我们的静态资源是在static目录下,有的项目会涉及到目录访问的问题,build的时候需要配置好,这要根据自己项目来具体情况具体分析了)。

2、配置nginx.conf 

找到服务器上的/usr/local/nginx/下的nginx.conf 配置文件进行配置修改。(/usr/local/nginx/是自己安装nginx的目录)

简单配置一下就可以了,相对还是简单的。/home/myshop  是自己vue项目的目录(nginx默认根目录是/usr/local/nginx/html)

       location / {
            root   /home/myshop;  
            index  index.html index.htm;
        }
3、重启nginx

     然后 ./nginx -s reload   重新加载配置一下nginx.conf 文件,浏览器上http://xx.xx.xxx.xxx访问就出来了。

4、跨域解决

由于自己的node项目的接口地址是3000端口(http://xx.xx.xxx.xxx:3000),所以存在跨域访问问题,有两种方法可以解决,本人使用的是第二种

4.1、可以通过nginx代理来实现跨域的。

location /users/login {
       proxy_pass http://xx.xx.xxx.xxx:3000/users/login;
}

users/login是我的接口地址,具体就不详说了。

4.2、是配置node服务器请求允许跨域

在我们node想的app.js配置如下:

app.all('*', function (req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  //服务器支持的所有头信息字段,多个字段用逗号分隔
  res.header('Access-Control-Allow-Headers', 'Content-type, userId, authToken');
  res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS,PATCH");
  res.header('Access-Control-Max-Age', 1728000); //预请求缓存20天
  next();
});

当然这里Access-Control-Allow-Origin为*是不安全的,可以改为允许指定域名或者ip的请求

res.header("Access-Control-Allow-Origin", "http://xx.xxx.xxx.xx");

比如我们前端项目vue地址是:http://xx.xxx.xx.xxx,而我们要请求的接口地址为http://xx.xxx.xx.xxx:3000,如上面配置就可以了。

5、vue单页应用的页面刷新一下出现404的问题

如果我们router是HTML5 History 模式时,刷新页面会出现404的,那么如何解决呢?

其实官方文档也有说明:

https://router.vuejs.org/zh/guide/essentials/history-mode.html#%E5%90%8E%E7%AB%AF%E9%85%8D%E7%BD%AE%E4%BE%8B%E5%AD%90

需要在nginx配置里加一句代码就可以了,如下:

location / {
	root   /home/myshop;  
	index  index.html index.htm;
	#映射到index.html上,防止页面刷新出现404问题
	try_files $uri $uri/ /index.html;  
}