前言

对于 node 应用,一般我们在本地调试的时候,可以考虑用 node app 的方式来启动服务查看效果。但是在服务器上,如果直接通过 node app 来启动,出现报错时可能直接停止服务运行,所以我选择了好评度较高的 pm2 来管理我的 ssr 服务。

pm2 是一个进程管理工具,维护一个进程列表,可以用它来管理你的 node 进程,负责所有正在运行的进程,并查看 node 进程的状态,也支持性能监控,负载均衡等功能。


PM2的主要有以下特性:

  • 内建负载均衡(使用 Node cluster 集群模块)
  • 后台运行
  • 0秒停机重载
  • 具有 Ubuntu 和 CentOS 的启动脚本
  • 停止不稳定的进程
  • 控制台检测
  • 提供 HTTP API
  • 远程控制和实时的接口API ( Nodejs 模块,允许和 PM2 进程管理器交互 )

我的一些基础配置信息:

主机系统为:Ubuntu_16.04_64
项目Angular版本为:5.2.7


第1步:安装Apache

Apache 在 Ubuntu 的默认软件库中可用,因此我们将使用传统的软件包管理工具进行安装。

我们将从更新本地包索引开始,这样才能获取到最新的软件包。之后,我们再安装 apache2 包:

sudo apt-get update
sudo apt-get install apache2


第2步:安装node

sudo apt-get install nodejs
sudo apt-get install nodejs-legacy
sudo apt-get install npm

查看 node 和 npm 版本

【Angular项目实战】PM2+Apache部署Angular Universal服务器渲染_angular

由于默认安装的版本过低,需要升级一下 node 版本,下面用 nvm 来更新 node 的版本到10.15.3


安装nvm

sudo curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash 
sudo source ~/.bashrc
sudo nvm install v10.15.3

升级后的版本如下

【Angular项目实战】PM2+Apache部署Angular Universal服务器渲染_ssr服务_02


第3步:全局安装angular

npm install -g @angular/cli

第4步:上传项目

这里,我在 /var/www/html 下创建一个文件夹 ngssr 来存放项目,把项目上传到ngssr下。

进入项目目录:

cd /var/www/html/ngssr

安装项目依赖:

npm install

package.json 中的 scripts 部分命令如下:

"scripts": {
"ng": "ng",
"start": "run-p build:dev nodemon",
"build": "run-s build:client build:aot build:server",
"build:client": "ng build --prod --app 0",
"build:aot": "ng build --aot --app 1",
"build:server": "webpack -p",
"build:dev": "run-p build:dev:client build:dev:aot build:dev:server",
"build:dev:client": "ng build -w --aot --app 0",
"build:dev:aot": "ng build -w --aot --delete-output-path=false --app 1",
"build:dev:server": "webpack -w",
"nodemon": "sleep 25 && nodemon --watch dist/browser/index.html --watch dist/server.js dist/server.js",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
}

执行命令进行打包:

npm run build

第5步:安装PM2

使用 npm 使用以下命令安装 PM2:

npm install pm2 -g

运行项目:

pm2 start dist/server.js

【Angular项目实战】PM2+Apache部署Angular Universal服务器渲染_ssr服务_03


PM2常用的命令行如下:

pm2 start app_name|app_id 启动应用
pm2 logs 显示所有进程日志
pm2 list 查
看所有进程
pm2 status 查看所有的进程状态
pm2 stop all 停止所有进程
pm2 stop app_name|app_id 停止指定的进程
pm2 restart all 重启所有进程
pm2 reload all 0秒停机重载进程
pm2 restart app_name|app_id 重启指定的进程
pm2 startup 产生 init 脚本保持进程活着
pm2 delete app_name|app_id 删除指定的进程
pm2 delete all 删除全部进程

想了解更多关于 PM2 的用法,请请前往​​官网​


第6步:配置Apache代理

要从 Web 访问 Node 服务项目,我们需要安装 Apache 模块代理和 proxy_http,命令如下:

sudo a2enmod proxy
sudo a2enmod proxy_http

安装完成后,需要重启 Apache 以使更改生效:

sudo service apache2 restart


接下来,我们需要添加 Apache 代理配置。

将这些指令插入站点主 Apache 配置文件中的 VirtualHost 命令块。这个 Apache 配置文件通常是 Ubuntu 上的 /etc/apache2/sites-available/node.efly.cc.conf。


注意:​站点的 Apache 配置文件的位置和文件名可能有所不同。这里我不分域名配置文件了,直接修改主机主配置文件,进入配置文件:

vi /etc/apache2/apache2.conf

配置文件如下:

<VirtualHost *:80>
DocumentRoot /var/www/html/ngssr/dist/
ServerName node.efly.cc
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Order Deny,Allow
Allow from all
</Proxy>

ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/

<Directory "/">
AllowOverride All
</Directory>
</VirtualHost>

重启服务:

service apache2 restart


通过浏览器访问node.efly.cc可以正常访问项目,效果如下:

【Angular项目实战】PM2+Apache部署Angular Universal服务器渲染_ssr服务_04


右键“查看源代码”效果如下:

【Angular项目实战】PM2+Apache部署Angular Universal服务器渲染_项目管理_05

至此,Angular universal 的 node 项目在服务器部署就结束了,希望能给你们带来参考价值。

后期一些PM2优化配置请​​参考​


下期给大家分享更多实战中的点滴,如果大家喜欢 Angular 或对此感兴趣,欢迎各位关注、留言,大家的支持就是我的动力!