2020-03-25 企业级LNMP环境部署实践(一)

1. LNMP应用环境

1.1 LNMP介绍

大约在2010年以前,互联网公司最常用的经典Web服务环境组合就是LAMP(Linux、Apache、MySQL、PHP),近几年随着Nginx Web服务的逐渐流行,又出现了新的Web服务环境组合——LNMP,其中LNMP为Linux、Nginx、MySQL、PHP等首字母的缩写。现在,LNMP已经逐渐成为国内大中型互联网公司使用PHP开发网站的主流组合环境,因此,我们必须要数量掌握LNMP环境的搭建、优化以及维护方法才行,当然,近几年随着移动互联网、大数据、人工智能的发展,JAVA、Python语言发展迅猛,而PHP语言逐渐败下阵来,但不管怎么说,就单纯对于网站开发来说,PHP是极好的语言。

1.2 LNMP组合工作流程

当LNMP组合工作时,首先是用户通过浏览器输入域名请求Nginx Web服务,如果请求的是静态资源,则由Nginx解析返回给用户,如果是动态请求(以.php结尾),那么Nginx就会把它通过FastCGI接口(生产常用方法)发送给PHP引擎服务(FastCGI进程php-fpm)进行解析,如果这个动态请求要读取数据库数据,那么PHP就会继续向后请求MySQL数据库,以读取需要的数据,并最终通过Nginx服务把获取的数据返回给用户,这就是LNMP环境的基本请求顺序流程(如下图所示),这个请求流程是企业使用LNMP环境的常用流程。

LNMP组合调用关系逻辑图
LNMP组合FastCGI模式调用PHP、MySQL关系逻辑图

2. LNMP之MySQL数据库

2.1 MySQL数据库介绍

MySQL是一种关系型数据库管理软件,关系型数据库的特点是将数据保存在不同的二维表中,并且将这些表放入不同的数据库中,而不是把所有数据统一放在一个大仓库里,这样的设计提高了MySQL的读取速度,其灵活性和可管理性也得到了很大提高。访问及管理MySQL数据库的最常用标准化语言为SQL结构化查询语言。

2.2 为什么选择MySQL数据库

目前,绝大多数使用Linux操作系统的互联网企业都在使用MySQL作为后端的数据库,从大型的BAT门户,到电商门户平台、分类门户平台等无一例外。大家选择MySQL的原因如下:

  • 性能卓越,服务稳定,很少出现异常宕机。
  • 开放源代码且无版权制约,自主性强,使用成本低。
  • 历史悠久,社区及用户非常活跃,遇到问题可以很快获取到帮助。
  • 软件体积小,安装使用简单,并且易于维护,安装及维护成本低。
  • 支持多种操作系统,提供多种API接口,支持多种开发语言,特别是对流行的PHP语言无缝支持。
  • 品牌口碑效应,使得企业无须考虑就直接用之。

2.3 安装MySQL数据库

2.3.1 安装概览

MySQL有几种不同的产品线,且每种产品线又有很多不同的版本,这里选择当前企业使用最广泛的社区版MySQL5.7系列作为LNMP组合环境的数据库平台。
MySQL的安装方法有很多,常见的方法见下表。

企业场景MySQL安装方式一览

安装MySQL的注意事项如下:
1)建议和Nginx服务安装在同一台机器上(这里选择Web01)。
2)重视操作过程中的报错输出,有错误要解决掉后再继续,不能忽略编译中的错误。

2.3.2 安装步骤介绍

(1)创建MySQL用户的帐号
首先以root身份登录到Linux系统中,然后执行如下命令创建MySQL组及用户帐号:

[root@web01 ~]# useradd -s /sbin/nologin -M mysql
[root@web01 ~]# id mysql
uid=1112(mysql) gid=1112(mysql) 组=1112(mysql)

(2)获取MySQL软件包

[root@web01 ~]# wget -q http://mirrors.163.com/mysql/Downloads/MySQL-5.7/mysql-5.7.26-linux-glibc2.12-x86_64.tar
[root@web01 tools]# ls -lsh
总用量 616M
 615M -rw-r--r-- 1 root root  615M 4月  13 2019 mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz

(3)采用二进制方式安装MySQL
1)解压并移动MySQL二进制软件包到指定的安装路径。

[root@web01 tools]# tar xf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
[root@web01 tools]# mv mysql-5.7.26-linux-glibc2.12-x86_64 /application/mysql-5.7.26    ---移动并改名

2)创建软链接,生成去掉版本号的访问路径并查看。

[root@web01 tools]# ln -s /application/mysql-5.7.26 /application/mysql
[root@web01 tools]# ls -l /application/
总用量 0
lrwxrwxrwx  1 root root  25 3月  25 15:01 mysql -> /application/mysql-5.7.26
drwxr-xr-x  9 root root 129 3月  25 14:58 mysql-5.7.26
lrwxrwxrwx  1 root root  25 3月  22 01:58 nginx -> /application/nginx-1.16.0
drwxr-xr-x 11 root root 151 3月  22 02:22 nginx-1.16.0

当安装LNMP一体化环境时,MySQL数据库要装在Nginx所在的机器上。如果MySQL和Nginx不在一台机器上启动,那么,Nginx服务器上不需要安装MySQL数据库。
在非一体的LNMP环境(Nginx和MySQL不在一台机器上)下编译PHP环境时,也是需要MySQL数据库环境的,但是高版本的PHP,如5.3版本以上,内置了PHP需要的MySQL程序,因此,对于此类版本就不需要在Nginx服务器上安装MySQL软件了,只需要在编译PHP时指定相关参数即可。这个PHP的编译参数为--with-mysql=mysqld,表示PHP程序在编译时会调用内置的MySQL的库。
(4)初始化MySQL配置文件my.cnf

[root@web01 tools]# cd /application/mysql
[root@web01 mysql]# find ./ -name "*.cnf"    ---没找到my.cnf
[root@web01 mysql]# ls -l support-files/
总用量 24
-rw-r--r-- 1 7161 31415   773 4月  13 2019 magic
-rwxr-xr-x 1 7161 31415  1061 4月  13 2019 mysqld_multi.server
-rwxr-xr-x 1 7161 31415   894 4月  13 2019 mysql-log-rotate
-rwxr-xr-x 1 7161 31415 10576 4月  13 2019 mysql.server
[root@web01 mysql]# rpm -e --nodeps mariadb-libs    ---卸载系统自动安装的mariadb库,防止冲突
[root@web01 mysql]# vi /etc/my.cnf    ---手动编辑/etc/my.cnf加入如下内容
[mysqld]    ---服务器端模块名字
basedir = /application/mysql/    ---MySQL安装目录
datadir = /application/mysql/data    ---MySQL数据文件目录
socket = /tmp/mysql.sock    ---MySQL服务器端sock文件目录
server_id = 1    ---MySQL实例ID
port = 3306    ---MySQL默认端口
log_error = /application/mysql/data/oldboy_mysql.err    ---MySQL错误日志路径

[mysql]    ---MySQL客户端模块名
socket = /tmp/mysql.sock    ---MySQL客户端sock文件目录
prompt = oldboy [\\d]>    ---MySQL登录提示符

(5)初始化MySQL数据库文件
1)卸载系统自动安装的mariadb-libs,并安装依赖包。

[root@web01 mysql]# rpm -qa mariadb-libs    ---检查前面是否已经删除了
[root@web01 mysql]# yum install libaio-devel -y    ---安装MySQL依赖包

2)创建数据文件目录并授权。

[root@web01 ~]# cd /application/mysql
[root@web01 mysql]# mkdir -p /application/mysql/data    ---建立mysql数据文件目录
[root@web01 mysql]# chown -R mysql.mysql /application/mysql/    ---授权MySQL用户管理MySQL安装目录
[root@web01 mysql]# ls -ld /application/mysql/
drwxr-xr-x 10 mysql mysql 141 3月  25 16:41 /application/mysql/

3)初始化数据库。

[root@web01 mysql]# /application/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/application/mysql/ --datadir=/application/mysql/data    ---初始化MySQL数据库文件

说明:上述初始化数据库都做了什么?
1)生成MySQL初始系统相关数据到/application/mysql/data/data/mysql。
2)两个安全参数介绍。

--user=mysql    ---MySQL用户
--basedir=/application/mysql/    ---MySQL根目录
--datadir=/application/mysql/data    ---MySQL数据文件目录
--initialize-insecure    ---关闭MySQL安全策略
--initialize    ---开启MySQL安全策略,高安全环境采用

安全策略:
1)密码长度:12以上。
2)密码复杂度:数字、大小字符、特殊符号。
3)密码默认过期时间为180天。
4)初始化完成后会立即生成一个临时密码。

A temporary password is generated for root@localhost: anAWFnV(a49g。

2.4 配置并启动MySQL数据库

1)设置MySQL启动脚本,CentOS7.6使用systemctl命令来管理服务:

[root@web01 mysql]# cat /etc/systemd/system/mysqld.service     ---手动增加如下内容
[Unit]
Description=MySQL Server By zheng
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/application/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000

2)启动MySQL数据库

[root@web01 mysql]# systemctl start mysqld
[root@web01 mysql]# systemctl enable mysqld
Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /etc/systemd/system/mysqld.service.
[root@web01 mysql]# systemctl status mysqld
● mysqld.service - MySQL Server By zheng
   Loaded: loaded (/etc/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since 三 2020-03-25 21:07:11 CST; 15s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
 Main PID: 7394 (mysqld)
   CGroup: /system.slice/mysqld.service
           └─7394 /application/mysql/bin/mysqld --defaults-file=/etc/my.cnf
3月 25 21:07:11 web01 systemd[1]: Started MySQL Server By zheng.

3)检查MySQL数据库是否启动:

[root@web01 mysql]# netstat -lntup|grep mysql
tcp6       0      0 :::3306                 :::*                    LISTEN      7394/mysqld 

如发现3306端口未启动,请tail -100 /application/mysql/data/机器名.err查看日志信息,看是否有报错信息,然后根据相关错误提示进行调试。经常查看服务运行日志是个很好的习惯,也是高手的习惯。
4)查看MySQL数据库启动结果日志:

[root@web01 mysql]# tail /application/mysql/data/oldboy_mysql.err 
2020-03-25T13:07:11.720587Z 0 [Note] InnoDB: Buffer pool(s) load completed at 200325 21:07:11
2020-03-25T13:07:11.733698Z 0 [Warning] Failed to set up SSL because of the following SSL library error: SSL context is not usable without certificate and private key
2020-03-25T13:07:11.733715Z 0 [Note] Server hostname (bind-address): '*'; port: 3306
2020-03-25T13:07:11.733772Z 0 [Note] IPv6 is available.
2020-03-25T13:07:11.733796Z 0 [Note]   - '::' resolves to '::';
2020-03-25T13:07:11.733808Z 0 [Note] Server socket created on IP: '::'.
2020-03-25T13:07:11.769518Z 0 [Note] Failed to start slave threads for channel ''
2020-03-25T13:07:11.776624Z 0 [Note] Event Scheduler: Loaded 0 events
2020-03-25T13:07:11.776827Z 0 [Note] /application/mysql/bin/mysqld: ready for connections.
Version: '5.7.26'  socket: '/tmp/mysql.sock'  port: 3306  MySQL Community Server (GPL)

本例只查看了错误日志的命令及错误日志中的内容,省略了大部分日志内容,只要每行的中括号里没有error字样,一般就无大碍。
5)配置MySQL命令的全局使用路径:

[root@web01 mysql]# echo 'export PATH=/application/mysql/bin:$PATH' >> /etc/profile    ---这里要用单引号不能用双引号
[root@web01 mysql]# tail -1 /etc/profile
export PATH=/application/mysql/bin:$PATH
[root@web01 mysql]# source /etc/profile
[root@web01 mysql]# echo $PATH
/application/mysql/bin:/application/nginx/sbin:/application/nginx/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

6)登录MySQL测试:

[root@web01 mysql]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.26 MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
oldboy [(none)]>show databases;    ---查看当前的数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
oldboy [(none)]>select user();    ---查看当前的登录用户
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
oldboy [(none)]>select user,password,host from mysql.user;    ---5.6查看用户列表命令无效了
ERROR 1054 (42S22): Unknown column 'password' in 'field list'
oldboy [(none)]>select user,authentication_string,host from mysql.user;    ---5.7查看用户列表命令
+---------------+-------------------------------------------+-----------+
| user          | authentication_string                     | host      |
+---------------+-------------------------------------------+-----------+
| root          |                                           | localhost |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | localhost |
| mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | localhost |
+---------------+-------------------------------------------+-----------+
3 rows in set (0.00 sec)
oldboy [(none)]>quit
Bye

MySQL安装完后,默认情况下,管理员帐号root是无密码的,这个必须要设置下。
7)为MySQL root用户设置密码:

[root@web01 mysql]# mysqladmin -u root password 'oldboy123'    ---更改默认密码
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
[root@web01 mysql]# mysql    ---无法直接登录了
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
[root@web01 mysql]# mysql -uroot -p    ---指定用户使用密码登录
Enter password:     ---交互式输入新密码
Welcome to the MySQL monitor.  Commands end with ; or \g.
---省略若干---
oldboy [(none)]>

你可能感兴趣的:(2020-03-25 企业级LNMP环境部署实践(一))