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
<code>vim </code><code>/etc/yum</code><code>.repos.d</code><code>/mysql56-community</code><code>.repo</code>
輸入如下内容:
2
3
4
5
6
7
<code># Enable to use MySQL 5.6</code>
<code>[mysql56-community]</code>
<code>name=MySQL 5.6 Community Server</code>
<code>baseurl=http:</code><code>//repo</code><code>.mysql.com</code><code>/yum/mysql-5</code><code>.6-community</code><code>/el/7/</code><code>$basearch/</code>
<code>enabled=1</code>
<code>gpgcheck=1</code>
<code>gpgkey=http:</code><code>//repo</code><code>.mysql.com</code><code>/RPM-GPG-KEY-mysql</code>
2.1.3 配置Node.js源
<code>yum </code><code>install</code> <code>-y http:</code><code>//rpm</code><code>.nodesource.com</code><code>/pub_8</code><code>.x</code><code>/el/7/x86_64/nodesource-release-el7-1</code><code>.noarch.rpm</code>
2.1.4 配置防火牆
<code>firewall-cmd --permanent --add-port 8080</code><code>/tcp</code>
<code>firewall-cmd --reload</code>
<code>firewall-cmd --list-all</code>
2.1.5 配置SELinux
<code>setenforce 0</code>
<code>sed</code> <code>-i </code><code>'s/SELINUX=enforcing/SELINUX=disabled/g'</code> <code>/etc/selinux/config</code>
2.2 配置MySQL服務
2.2.1 安裝MySQL相關包
<code>yum </code><code>install</code> <code>-y mysql-community-server mysql-community-devel mysql-community-client</code>
2.2.2 啟動并配置服務自啟動
<code>systemctl start mysqld</code>
<code>systemctl </code><code>enable</code> <code>mysqld</code>
2.2.3 初始化MySQL服務
<code>mysql_secure_installation</code>
向導如下:
8
9
10
11
12
13
14
15
<code>[…]</code>
<code>Enter current password </code><code>for</code> <code>root (enter </code><code>for</code> <code>none):</code>
<code>Set root password? [Y</code><code>/n</code><code>] y</code>
<code>New password: dbAdminPassword1</code>
<code>Re-enter new password: dbAdminPassword1</code>
<code>Remove anonymous </code><code>users</code><code>? [Y</code><code>/n</code><code>] y</code>
<code>Disallow root login remotely? [Y</code><code>/n</code><code>] n</code>
<code>Remove </code><code>test</code> <code>database and access to it? [Y</code><code>/n</code><code>] y</code>
<code>Reload privilege tables now? [Y</code><code>/n</code><code>] y</code>
2.2.4 建立資料庫
<code>create database nodedb character </code><code>set</code> <code>utf8;</code>
2.2.5 資料庫授權
<code>grant all privileges on nodedb.* to </code><code>'nodeDBUser1'</code><code>@</code><code>'localhost'</code> <code>identified by </code><code>'nodeDBPassword1'</code><code>;</code>
2.3 配置Node.js
2.3.1 安裝Node.js包
<code>yum </code><code>install</code> <code>-y nodejs-8.1.3</code>
2.3.2 配置運作環境
1) 配置運作使用者
<code>useradd</code> <code>npm</code>
<code>su</code> <code>- npm</code>
注:如無特殊說明第3章節往下代碼都使用npm使用者身份執行,而非root
2) 查找npm預設路徑
<code>npm config get prefix</code>
顯示如下:
<code>/usr</code>
3) 建立npm全局目錄
<code>mkdir</code> <code>~/.npm-global</code>
4) 設定npm全局目錄
<code>npm config </code><code>set</code> <code>prefix </code><code>'~/.npm-global'</code>
5) 配置npm環境變量
<code>echo</code> <code>'export PATH=~/.npm-global/bin:$PATH'</code> <code>>> ~/.bash_profile</code>
<code>source</code> <code>~/.bash_profile</code>
2.3.3 安裝全局npm包并儲存依賴關系
<code>npm </code><code>install</code> <code>-g --save express-generator mysql pm2</code>
确認包的安裝:
<code>npm </code><code>ls</code> <code>-g --depth=0</code>
<code>/home/npm/</code><code>.npm-global</code><code>/lib</code>
<code>├── [email protected]</code>
<code>├── [email protected]</code>
<code>└── [email protected]</code>
2.3.4 配置express依賴環境
1) 建立項目檔案夾
<code>mkdir</code> <code>-p </code><code>/var/www/project1</code>
<code>chown</code> <code>npm:npm </code><code>/var/www/project1</code>
<code>chmod</code> <code>755 </code><code>/var/www</code>
<code>chmod</code> <code>770 </code><code>/var/www/project1</code>
注:1)使用root使用者身份執行
2) 建立應用程式
<code>cd</code> <code>/var/www/project1/</code>
<code>express .</code>
3) 安裝依賴關系
<code>npm </code><code>install</code>
4) 建立示範檔案
<code>vim express_demo.js</code>
<code>var express = require(</code><code>'express'</code><code>)</code>
<code>var app = express()</code>
<code>app.get(</code><code>'/'</code><code>, </code><code>function</code> <code>(req, res) {</code>
<code> </code><code>res.send(</code><code>'Hello World'</code><code>)</code>
<code>})</code>
<code>app.listen(8080)</code>
5) 啟動示範
<code>node express_demo.js</code>
注:【Ctrl+C】退出
6) 測試示範
<code>curl 127.0.0.1:8080</code>
<code>Hello World</code>
注:看到以上資訊證明Express包的依賴關系正确。
2.3.5 配置MySQL依賴環境
1) 安裝本npm地包
<code>npm </code><code>install</code> <code>mysql</code>
2) 建立測試示範
<code>vim mysql_demo.js</code>
16
<code>var mysql = require(</code><code>'mysql'</code><code>);</code>
<code>var connection = mysql.createConnection({</code>
<code> </code><code>host : </code><code>'localhost'</code><code>,</code>
<code> </code><code>user : </code><code>'nodeDBUser1'</code><code>,</code>
<code> </code><code>password : </code><code>'nodeDBPassword1'</code><code>,</code>
<code> </code><code>database : </code><code>'nodedb'</code>
<code>});</code>
<code>connection.connect();</code>
<code>connection.query(</code><code>'SELECT 1 + 1 AS solution'</code><code>, </code><code>function</code> <code>(error, results, fields) {</code>
<code> </code><code>if</code> <code>(error) throw error;</code>
<code> </code><code>console.log(</code><code>'The solution is: '</code><code>, results[0].solution);</code>
<code>connection.end();</code>
3) 運作測試代碼
<code>node mysql_demo.js</code>
<code>The solution is: 2</code>
注:看到以上資訊證明MySQL包的依賴關系正确,資料庫可正常連接配接。
2.3.6 配置PM2
1) 啟動服務
<code>pm2 start -i 4 express_demo.js --</code><code>watch</code>
<a href="https://s3.51cto.com/wyfs02/M01/9C/F4/wKioL1l4ObWSQPIDAABRnnyJ4Pw308.png" target="_blank"></a>
參數解析:
<code>"-i"</code> <code>啟動的應用程式執行個體數量(整數)</code>
<code>"--"</code> <code>watch</code> <code>監視檔案變化并自動重新開機應用程式</code>
2) 确認群集狀态
<code>pm2 list</code>
<a href="https://s2.51cto.com/wyfs02/M00/9C/F4/wKiom1l4Olmiv0ljAABBW6sUuHk850.png" target="_blank"></a>
3) 配置服務自啟動
生成啟動配置指令:
<code>pm2 save</code>
<code>pm2 startup</code>
最後3行顯示如下:
<code>[PM2] Writing init configuration </code><code>in</code> <code>/etc/systemd/system/pm2-npm</code><code>.service</code>
<code>[PM2] You have to run this </code><code>command</code> <code>as root. Execute the following </code><code>command</code><code>:</code>
<code>sudo</code> <code>env</code> <code>PATH=$PATH:</code><code>/usr/bin</code> <code>/home/npm/</code><code>.npm-global</code><code>/lib/node_modules/pm2/bin/pm2</code> <code>startup systemd -u npm --hp </code><code>/home/npm</code>
執行配置指令:
<code>exit</code>
注:以上行需要root身份執行
4)測試PM2服務指令
<code>systemctl status pm2-npm.service</code>
<code>systemctl stop pm2-npm.service</code>
<code>systemctl start pm2-npm.service</code>
注:以上三行需要root身份執行,以上三條指令能正常運作即可證明PM2服務方式啟動OK
5) 浏覽器測試
<a href="https://s2.51cto.com/wyfs02/M00/9C/D3/wKiom1l2utzRcVSqAAAiW-Ch-k0006.png" target="_blank"></a>
=====================================
npm參考:
----------
<a href="http://cmdschool.blog.51cto.com/2420395/1950640" target="_blank">http://cmdschool.blog.51cto.com/2420395/1950640</a>
<a href="https://www.npmjs.com/package/cnpm" target="_blank">https://www.npmjs.com/package/cnpm</a>
<a href="https://npm.taobao.org/" target="_blank">https://npm.taobao.org/</a>
<a href="https://cnpmjs.org/" target="_blank">https://cnpmjs.org/</a>
nodejs參考:
------------
<a href="http://www.runoob.com/nodejs/nodejs-mysql.html" target="_blank">http://www.runoob.com/nodejs/nodejs-mysql.html</a>
express使用文檔
------------------------
<a href="https://www.npmjs.com/package/express" target="_blank">https://www.npmjs.com/package/express</a>
pm2使用文檔:
-----------
<a href="https://www.npmjs.com/package/pm2" target="_blank">https://www.npmjs.com/package/pm2</a>
本文轉自 tanzhenchao 51CTO部落格,原文連結:http://blog.51cto.com/cmdschool/1951112,如需轉載請自行聯系原作者