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
显示如下:
参数解析:
"-i" 启动的应用程序实例数量(整数) "--" watch 监视文件变化并自动重启应用程序
2) 确认群集状态
pm2 list
显示如下:
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) 浏览器测试
=====================================
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