美文网首页
2020-03-25 企业级LNMP环境部署实践(一)

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

作者: 阿丧小威 | 来源:发表于2020-03-25 21:27 被阅读0次

    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环境部署实践(一)

          本文链接:https://www.haomeiwen.com/subject/bxstuhtx.html