在本地开发好node项目和vue前端项目后,我们需要部署到linux服务器上,那么我要要如何部署呢?
首先,本人node后端项目和前端vue项目是分离的,那么前端vue项用是nginx来部署运行,当然跟node部署在一起也是可以的。
安装步骤如下(这里nginx和node环境、mongodb都是先安装好的),具体安装可以看:
以下是自己部署的一些简单笔记。
一、部署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的,那么如何解决呢?
其实官方文档也有说明:
需要在nginx配置里加一句代码就可以了,如下:
location / { root /home/myshop; index index.html index.htm; #映射到index.html上,防止页面刷新出现404问题 try_files $uri $uri/ /index.html; }