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
|
# Enable to use MySQL 5.6
[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) 配置运行用户
1
2
|
useradd
npm
su
- npm
|
注:如无特殊说明第3章节往下代码都使用npm用户身份执行,而非root
2) 查找npm默认路径
1
|
npm config get prefix
|
显示如下:
1
|
/usr
|
3) 新建npm全局目录
1
|
mkdir
~/.npm-global
|
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
|
npm
ls
-g --depth=0
|
显示如下:
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) 安装依赖关系
1
|
npm
install
|
4) 建立演示文件
1
|
vim express_demo.js
|
输入如下内容:
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) 启动演示
1
|
node express_demo.js
|
注:【Ctrl+C】退出
6) 测试演示
1
|
curl 127.0.0.1:8080
|
显示如下:
1
|
Hello World
|
注:看到以上信息证明Express包的依赖关系正确。
2.3.5 配置MySQL依赖环境
1) 安装本npm地包
1
2
3
|
su
- npm
cd
/var/www/project1/
npm
install
mysql
|
2) 建立测试演示
1
|
vim mysql_demo.js
|
输入如下内容:
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) 运行测试代码
1
|
node mysql_demo.js
|
显示如下:
1
|
The solution is: 2
|
注:看到以上信息证明MySQL包的依赖关系正确,数据库可正常连接。
2.3.6 配置PM2
1) 启动服务
1
|
pm2 start -i 4 express_demo.js --
watch
|
显示如下:
参数解析:
1
2
|
"-i"
启动的应用程序实例数量(整数)
"--"
watch
监视文件变化并自动重启应用程序
|
2) 确认群集状态
1
|
pm2 list
|
显示如下:
3) 配置服务自启动
生成启动配置命令:
1
2
|
pm2 save
pm2 startup
|
最后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
nodejs参考:
------------
http://www.runoob.com/nodejs/nodejs-mysql.html
express使用文档
------------------------
https://www.npmjs.com/package/express
pm2使用文档:
-----------