• 8.lnmp架构


    1.什么是lnmp

    是一套网站架构,L=Linux、N=Nginx、P = PHP、M= MySQL、Mariadb


    2.lnmp简单工作流程

    客户端发起http请求,访问http://www.test.com/index.php页面,对于nginx而言,它是无法处理这样的动态脚本的,nginx在接收http请求后,通过location规则进行匹配,再将请求通过fastcgi协议传递给后端的PHP服务处理
    ,然后PHP解析对应目录下的PHP文件,将解析的结果通过fastcgi协议回传给nginx,nginx构造响应报文再回传给客户端,客户端接收到后进行加载渲染

    在这里插入图片描述

    在这里插入图片描述


    3.部署lnmp架构

    部署nginx

    1.配置nginx官方源
    设置 yum 仓库,创建文件 /etc/yum.repos.d/nginx.repo ,写入以下内容

    [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.安装nginx
    yum install nginx -y


    部署PHP

    1.安装php-fpm
    ( 7.1版本 7.1版本官方没有提供rpm的软件包、第三方有提供 (下载速度可能会很慢,有无法下载成功的情况))

    如果有之前有安装旧版本的话,先移除掉
    yum remove php-mysql-5.4 php php-fpm php-common
    
    
    配置源
    vim /etc/yum.repos.d/php.repo
    [webtatic-php]
    name = php Repository
    baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
    gpgcheck = 0
    
    安装
    yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb
    
    查看PHP版本
    php -v
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    如果自己本地有源码包的话,可以本地安装

    先解压包
    unzip php.zip
     
    yum localinstall php/*.rpm 
    通过本地方法安装所有的rpm包,如果有依赖的话会自动通过base、epel源下载
    
    systemctl start php-fpm 
    启动php-fpm 
    
    systemctl enable php-fpm 
    加入开机自启动 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    部署数据库

    可以选择安装mariadb
    yum install mariadb mariadb-server -y

    systemctl start mariadb
    systemctl enable mariadb


    这里我装的是mysql
    从官网下的包,传到服务器
    https://downloads.mysql.com/archives/community/
    在这里插入图片描述

    先创建一个文件夹
    mkdir mysql-5.7.38
    
    解压包到指定的文件夹mysql-5.7.38
    tar xfv mysql-5.7.38-1.el7.x86_64.rpm-bundle.tar -C /opt/mysql-5.7.38
    mysql-community-client-5.7.38-1.el7.x86_64.rpm
    mysql-community-common-5.7.38-1.el7.x86_64.rpm
    mysql-community-devel-5.7.38-1.el7.x86_64.rpm
    mysql-community-embedded-5.7.38-1.el7.x86_64.rpm
    mysql-community-embedded-compat-5.7.38-1.el7.x86_64.rpm
    mysql-community-embedded-devel-5.7.38-1.el7.x86_64.rpm
    mysql-community-libs-5.7.38-1.el7.x86_64.rpm
    mysql-community-libs-compat-5.7.38-1.el7.x86_64.rpm
    mysql-community-server-5.7.38-1.el7.x86_64.rpm
    mysql-community-test-5.7.38-1.el7.x86_64.rpm
    
    
    cd mysql-5.7.38
    自动解析本目录下各安装包的依赖关系,并自动按顺序安装:
    sudo yum localinstall *.rpm
    
    启动mysql
    systemctl start mysqld
    
    加入开机启动
    systemctl enable mysqld
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    查看初始密码
    cat /var/log/mysql.log
    在这里插入图片描述
    登陆
    mysql -uroot -p密码

    修改root密码
    ALTER USER 'root'@'localhost' IDENTIFIED BY '密码';
    在这里插入图片描述


    4.配置lnmp

    nginx+php配置集成

    1.用户请求 www.test.com/test.php
    
    2.通过fastcgi协议传递给php服务端 ( nginx并没有告诉php需要php帮其解析哪个目录下的那个文件)
    
    3.nginx可以通过fastcgi_param参数传递需要解析哪个目录下的哪个文件
    
    4.fastcgiparam SCRIPTFILENAME $document_root$fastcgi_script_name;
    
    SCRIPT_FILENAME: PHP需要读取的变量,通过获取变量对应的值知道需要解析哪个目录下的哪个文件,
    $document_root: 他等价于 = root指令。如果说root指令等于 /code , document_root就是/code
    $fastcgi_script_name 用户请求的uri是,/test.php
    两个变量拼接在一起的结果就是 /code/test.php , 将这个路径赋值给 SCRIPT_FILENAME变量。
    
    5.php接收到请求后需要读取SCRIPT_FILENAME变量,读取后的结果为 /code/test.php
    
    6.php就会查找系统中/code/test.php文件进行解析处理,然后将解析的结果回传给nginx
    
    7.nginx构建响应报文,通过http协议回传给浏览器。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    1.编写nginx配置文件

    vim /etc/nginx/conf.d/php.conf

    server{
    		listen 80;
    		sever_name www.test.com;
    		root /html;
    
    location / {
    		index index.php index.html;
    	}
    
    location ~ \.php$ {  #通过location进行匹配,访问的URI为.php结尾的都走这个location
    		fastcgi_pass 127.0.0.1:9000;     #将php结尾的请求文件都传递给本地php服务端处理
        	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  #为SCRIPT_FILENAME变量设定值(具体要解析的文件路径)
        	include fastcgi_params;
    
    	}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2.初始化本地目录文件
    cat /html/info.php

     
    
    • 1

    3.语法检测,重载nginx

    nginx -t
    systemctl reload nginx
    
    • 1
    • 2

    4.访问www.test.com/info.php
    在这里插入图片描述

    php+mysql配置集成
    php写一份代码,去连接mysql即可
    vim /html/mysql.php

    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2.语法检测,重载nginx

    nginx -t
    systemctl reload nginx
    
    • 1
    • 2

    3.访问测试
    访问www.test.com/mysql.php
    在这里插入图片描述

    故意将mysql.php中的密码修改错误,查看失败的效果
    在这里插入图片描述


    5.拆分数据库,独立部署

    例:
    192.168.10.10nginx+php
    192.168.10.20 mariadb

    1.在192.168.10.10上将数据库备份下来(带-A参数表示导出全部数据库)
     mysqldump -uroot -pTest.123 -A > /opt/alldatabases.sql 
     
    然后推送到192.168.10.20
     scp /opt/alldatabases.sql root@192.168.10.20:/opt
    
    
    2.在192.168.10.20上安装数据库,然后倒入 192.168.10.10推送过来的数据库备份文件
    yum install mariadb mariadb-server -y 
    systemctl start mariadb 
    systemctl enable mariadb 
    mysql < /root/all_databases.sql #导入数据
    
    systemctl restart mariadb #重启
    mysql -uroot -pTest.123 #使用之前的密码就可以登陆192.168.10.20的数据库 
    show databases;查看数据库
    
    3.配置一个数据库的远程用户,允许别人连接192.168.10.20的数据库。
    授权
    grant all privileges on *.* to 'new'@'%' identified by 'Test.12345';
    刷新
    flush privileges;
    
    4.关闭192.168.10.10上面的数据库。
    systemctl stop mariadb
    systemctl disable mariadb 
    
    
    5.将192.168.10.10 上的程序,原先连接的是本地数据库,修改为连接远程192.168.10.20的数据库即可。
    程序割接:
    vim /code/wordpress/wp-config.php 
    
    define( 'DB_NAME', 'wordpress' ); #WordPress数据库的名称 
    define( 'DB_USER', 'new' ); # MySQL数据库用户名 ,使用远程的用户名称
    define( 'DB_PASSWORD', 'Test.12345' ); # MySQL数据库密码 ,使用远程的用户密码
    define( 'DB_HOST', '192.168.10.20' ); #MySQL主机,填写远程数据库的IP地址
    
    /** 创建数据表时默认的文字编码 */ define( 'DB_CHARSET', 'utf8mb4' );
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    6.扩展多台节点

    提供相同业务环境的服务,称为集群
    现状:只有一台web服务器 192.168.10.10
    目标:扩展成多台web服务器,让配置一摸一样192.18.10.10、192.168.10.11

    1.部署nginx

    1.1、配置nginx官方源
    设置 yum 仓库,创建文件 /etc/yum.repos.d/nginx.repo ,写入以下内容

    [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.2、安装nginx
    yum install nginx -y


    2.部署PHP

    配置源
    vim /etc/yum.repos.d/php.repo
    [webtatic-php]
    name = php Repository
    baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
    gpgcheck = 0
    
    安装
    yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb
    
    查看PHP版本
    php -v
    
    systemctl start php-fpm 
    启动php-fpm 
    
    systemctl enable php-fpm 
    加入开机自启动 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    3.拷贝192.18.10.10服务器上的所有程序代码给192.168.10.11 (php文件也都包括在该路径下)
    scp -rp /code/ root@192.168.10.11:/code

    4.拷贝192.18.10.10服务器上的nginx配置文件给192.168.10.11
    scp /etc/nginx/conf.d/nginx.conf root@192.168.10.11:/etc/nginx/conf.d/

    5.语法检测,重载nginx

    nginx -t
    systemctl reload nginx
    
    • 1
    • 2

    然后就可以访问新的web站点了
    但是web1上传的图片等在web2上是看不到的,俩个节点的静态资源不是共享的


    7.节点之间静态资源共享

    思路:
    1.先找到web应用存放静态资源的路径
    2.部署一台NFS服务器,提供一个共享的目录
    3.各个节点下,web应用存放静态资源的路径,将NFS都挂载上

    找一个静态资源查看其路径
    http://www.test.com/wp-content/uploads/2020/06/11.jpg
    其实完整的路径是:/code/wordpress/wp-content/uploads/2020/06/11.jpg
      
    所以存放静态资源的路径是: /code/wordpress/wp-content/uploads/
      
      
      1. 准备一台nfs 地址为192.168.10.30
       yum install nfs-utils -y
      
      2.配置nfs共享
      vim /etc/exports
      /data/wp 192.168.10.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
     
      创建用户
       groupadd -g 666 www
       useradd -u666 -g666 www
      
      创建目录、授权、重启nfs
      mkdir /data/wp
      chown -R www.www /data/
      systemctl restart nfs
      
     3.在每台web节点上进行挂载,将/code/wordpress/wp-content/uploads/ 作为nfs存储的入口
      mount -t nfs 192.168.10.30:/data/wp /code/wordpress/wp-content/uploads/
      
      df -h
      文件系统                   容量  已用  可用 已用% 挂载点
      192.168.10.30:/data/wp    17G  4.4G   13G   26% /code/wordpress/wp-content/uploads
      
     最后记得加入开机自动挂载
     vim /etc/fstab
      
    192.168.10.30:/data/wp	/code/wordpress/wp-content/uploads		nfs	defaults	0 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    然后就实现静态资源共享了

    8.多节点如何访问

    • 1.DNS轮询

      • 1.要求所有的web节点都具备公网IP地址
      • 2.问题:
        • 1.公网独立IP要花钱,
        • 2.带宽买多大是不是问题?
        • 3.所有的web服务器拥有公网IP对外,不安全
        • 4.DNS轮询他没有健康检查机制。web节点出现问题时,不会把问题节点踢出集群,
          发现不了节点故障了,用户的请求还继续发往问题节点,导致用户访问失败,大大降低用户体验
    • 2.负载均衡 ( 硬件设备、软件 )

      • 1.所有的web节点不需要有公网IP地址。
        • 成本降低、
        • 安全可靠
      • 2.负载均衡能够对后端的web节点进行健康检查机制
      • 3.负载均衡拥有多种调度算法来满足企业的不同需求(根据节点不同的处理能力,分配不同的工作量给他们)
  • 相关阅读:
    代码随想录算法训练营第四十八天|198. 打家劫舍、213. 打家劫舍 II、337. 打家劫舍 III
    Linux——开发工具yum与vim
    2023-9-27 JZ18 删除链表的结点
    【C语言】操作符详解
    【Cherno的C++视频】Continuous integration in C++
    wps要会员才能把pdf分开,这不纯属智商税吗
    CentOS7---Nginx安装并配置虚拟主机
    Github上前十大开源Rust项目
    云原生SIEM解决方案
    IT廉连看——C语言——操作符
  • 原文地址:https://blog.csdn.net/Wangjiachenga/article/details/126140526