1 理论部分
1.1 方案简介
本文部署了一个Linux + MySQL + Node.js + Express + PM2的生产环境下,我们需要借助PM2的群集模式的特征,PM2带负载均衡功能,是一个完美的Node.js进程管理器,可轻松实现Node.js的服务器多CPU并发,并保证进程永远活着,0秒重载,PM2可监视Node.js底层代码的修改,使得修改代码无需重启Node.js进程。
1.2 Node.js简介
- Node.js是运行在服务端的JavaScript
- Node.js是基于Chrome JavaScript运行时建立的一个平台
- Node.js是事件驱动I/O服务端JavaScript环境,基于Google的V8引擎
注:V8引擎执行Javascript的速度非常快,性能非常好
1.3 Express的简介
Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用(几行代码即可快速地搭建一个完整功能的网站)。
1.4 PM2的简介
PM2的群集模式带负载均衡功能,是一个完美的Node.js进程管理器,可轻松实现Node.js的服务器多CPU并发,并保证进程永远活着,0秒重载,PM2可监视Node.js底层代码的修改,使得修改代码无需重启Node.js进程。
2 Node.js生产环境配置
2.1 环境信息
2.1.1 环境配置
OS = CentOS 7.3 x86_64
IPAddress = 10.168.0.55
App Env = Linux + MySQL + Node.js + express + PM2
2.1.2 配置MySQL源
1
|
vim /etc/yum .repos.d /mysql56-community .repo
|
输入如下内容:
1
2
3
4
5
6
7
|
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http: //repo .mysql.com /yum/mysql-5 .6-community /el/7/ $basearch/
enabled=1
gpgcheck=1
gpgkey=http: //repo .mysql.com /RPM-GPG-KEY-mysql
|
2.1.3 配置Node.js源
1
|
yum install -y http: //rpm .nodesource.com /pub_8 .x /el/7/x86_64/nodesource-release-el7-1 .noarch.rpm
|
2.1.4 配置防火墙
1
2
3
|
firewall-cmd --permanent --add-port 8080 /tcp
firewall-cmd --reload
firewall-cmd --list-all
|
2.1.5 配置SELinux
1
2
|
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
|
2.2 配置MySQL服务
2.2.1 安装MySQL相关包
1
|
yum install -y mysql-community-server mysql-community-devel mysql-community-client
|
2.2.2 启动并配置服务自启动
1
2
|
systemctl start mysqld
systemctl enable mysqld
|
2.2.3 初始化MySQL服务
1
|
mysql_secure_installation
|
向导如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[…]
Enter current password for root (enter for none):
[…]
Set root password? [Y /n ] y
New password: dbAdminPassword1
Re-enter new password: dbAdminPassword1
[…]
Remove anonymous users ? [Y /n ] y
[…]
Disallow root login remotely? [Y /n ] n
[…]
Remove test database and access to it? [Y /n ] y
[…]
Reload privilege tables now? [Y /n ] y
[…]
|
2.2.4 创建数据库
1
|
create database nodedb character set utf8;
|
2.2.5 数据库授权
1
|
grant all privileges on nodedb.* to 'nodeDBUser1' @ 'localhost' identified by 'nodeDBPassword1' ;
|
2.3 配置Node.js
2.3.1 安装Node.js包
1
|
yum install -y nodejs-8.1.3
|
2.3.2 配置运行环境
1) 配置运行用户
注:如无特殊说明第3章节往下代码都使用npm用户身份执行,而非root
2) 查找npm默认路径
显示如下:
3) 新建npm全局目录
4) 设置npm全局目录
1
|
npm config set prefix '~/.npm-global'
|
5) 配置npm环境变量
1
2
|
echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bash_profile
source ~/.bash_profile
|
2.3.3 安装全局npm包并保存依赖关系
1
|
npm install -g --save express-generator mysql pm2
|
确认包的安装:
显示如下:
1
2
3
4
|
/home/npm/ .npm-global /lib
├── express-generator@4.15.0
├── mysql@2.13.0
└── pm2@2.6.1
|
2.3.4 配置express依赖环境
1) 新建项目文件夹
1
2
3
4
|
mkdir -p /var/www/project1
chown npm:npm /var/www/project1
chmod 755 /var/www
chmod 770 /var/www/project1
|
注:1)使用root用户身份执行
2) 创建应用程序
1
2
3
|
su - npm
cd /var/www/project1/
express .
|
3) 安装依赖关系
4) 建立演示文件
输入如下内容:
1
2
3
4
5
6
7
8
|
var express = require( 'express' )
var app = express()
app.get( '/' , function (req, res) {
res.send( 'Hello World' )
})
app.listen(8080)
|
5) 启动演示
注:【Ctrl+C】退出
6) 测试演示
显示如下:
注:看到以上信息证明Express包的依赖关系正确。
2.3.5 配置MySQL依赖环境
1) 安装本npm地包
1
2
3
|
su - npm
cd /var/www/project1/
npm install mysql
|
2) 建立测试演示
输入如下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
var mysql = require( 'mysql' );
var connection = mysql.createConnection({
host : 'localhost' ,
user : 'nodeDBUser1' ,
password : 'nodeDBPassword1' ,
database : 'nodedb'
});
connection.connect();
connection.query( 'SELECT 1 + 1 AS solution' , function (error, results, fields) {
if (error) throw error;
console.log( 'The solution is: ' , results[0].solution);
});
connection.end();
|
3) 运行测试代码
显示如下:
注:看到以上信息证明MySQL包的依赖关系正确,数据库可正常连接。
2.3.6 配置PM2
1) 启动服务
1
|
pm2 start -i 4 express_demo.js -- watch
|
显示如下:

参数解析:
1
2
|
"-i" 启动的应用程序实例数量(整数)
"--" watch 监视文件变化并自动重启应用程序
|
2) 确认群集状态
显示如下:

3) 配置服务自启动
生成启动配置命令:
最后3行显示如下:
1
2
3
|
[PM2] Writing init configuration in /etc/systemd/system/pm2-npm .service
[PM2] You have to run this command as root. Execute the following command :
sudo env PATH=$PATH: /usr/bin /home/npm/ .npm-global /lib/node_modules/pm2/bin/pm2 startup systemd -u npm --hp /home/npm
|
执行配置命令:
1
2
|
exit
sudo env PATH=$PATH: /usr/bin /home/npm/ .npm-global /lib/node_modules/pm2/bin/pm2 startup systemd -u npm --hp /home/npm
|
注:以上行需要root身份执行
4)测试PM2服务命令
1
2
3
|
systemctl status pm2-npm.service
systemctl stop pm2-npm.service
systemctl start pm2-npm.service
|
注:以上三行需要root身份执行,以上三条命令能正常运行即可证明PM2服务方式启动OK
5) 浏览器测试

=====================================
npm参考:
----------
http://cmdschool.blog.51cto.com/2420395/1950640
https://www.npmjs.com/package/cnpm
https://npm.taobao.org/
https://cnpmjs.org/
nodejs参考:
------------
http://www.runoob.com/nodejs/nodejs-mysql.html
express使用文档
------------------------
https://www.npmjs.com/package/express
pm2使用文档:
-----------
https://www.npmjs.com/package/pm2
本文转自 tanzhenchao 51CTO博客,原文链接:http://blog.51cto.com/cmdschool/1951112,如需转载请自行联系原作者