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源

vim /etc/yum.repos.d/mysql56-community.repo

输入如下内容:

# 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源

yum install -y http://rpm.nodesource.com/pub_8.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm

2.1.4 配置防火墙

firewall-cmd --permanent --add-port 8080/tcp
firewall-cmd --reload
firewall-cmd --list-all

2.1.5 配置SELinux

setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

2.2 配置MySQL服务

2.2.1 安装MySQL相关包

yum install -y mysql-community-server mysql-community-devel mysql-community-client

2.2.2 启动并配置服务自启动

systemctl start mysqld
systemctl enable mysqld

2.2.3 初始化MySQL服务

mysql_secure_installation

向导如下:

[…]
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 创建数据库

create database nodedb character set utf8;

2.2.5 数据库授权

grant all privileges on nodedb.* to 'nodeDBUser1'@'localhost' identified by 'nodeDBPassword1';

2.3 配置Node.js

2.3.1 安装Node.js包

yum install -y nodejs-8.1.3

2.3.2 配置运行环境

1) 配置运行用户

useradd npm
su - npm

注:如无特殊说明第3章节往下代码都使用npm用户身份执行,而非root

2) 查找npm默认路径

npm config get prefix

显示如下:

/usr

3) 新建npm全局目录

mkdir ~/.npm-global

4) 设置npm全局目录

npm config set prefix '~/.npm-global'

5) 配置npm环境变量

echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bash_profile
source  ~/.bash_profile

2.3.3 安装全局npm包并保存依赖关系

npm install -g --save express-generator mysql pm2

确认包的安装:

npm ls -g --depth=0

显示如下:

/home/npm/.npm-global/lib
├── [email protected]
├── [email protected]
└── [email protected]

2.3.4 配置express依赖环境

1) 新建项目文件夹

mkdir -p /var/www/project1
chown npm:npm /var/www/project1
chmod 755 /var/www
chmod 770 /var/www/project1

注:1)使用root用户身份执行

2) 创建应用程序

su - npm
cd /var/www/project1/
express .


3) 安装依赖关系

npm install

4) 建立演示文件

vim express_demo.js

输入如下内容:

var express = require('express')
var app = express()

app.get('/', function (req, res) {
  res.send('Hello World')
})

app.listen(8080)

5) 启动演示

node express_demo.js

注:【Ctrl+C】退出

6) 测试演示

curl 127.0.0.1:8080

显示如下:

Hello World

注:看到以上信息证明Express包的依赖关系正确。

2.3.5 配置MySQL依赖环境

1) 安装本npm地包

su - npm
cd /var/www/project1/
npm install mysql

2) 建立测试演示

vim mysql_demo.js

输入如下内容:

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) 运行测试代码

node mysql_demo.js

显示如下:

The solution is:  2

注:看到以上信息证明MySQL包的依赖关系正确,数据库可正常连接。

2.3.6 配置PM2

1) 启动服务

pm2 start -i 4 express_demo.js --watch

显示如下:

Node.js生产环境配置_第1张图片

参数解析:

"-i" 启动的应用程序实例数量(整数)
"--" watch 监视文件变化并自动重启应用程序

2) 确认群集状态

pm2 list

显示如下:

Node.js生产环境配置_第2张图片

3) 配置服务自启动

生成启动配置命令:

pm2 save
pm2 startup

最后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

执行配置命令:

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服务命令

systemctl status pm2-npm.service
systemctl stop pm2-npm.service
systemctl start pm2-npm.service

注:以上三行需要root身份执行,以上三条命令能正常运行即可证明PM2服务方式启动OK


5) 浏览器测试

Node.js生产环境配置_第3张图片

=====================================

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