zoukankan      html  css  js  c++  java
  • 马哥博客作业第十五周

    1、写出 MPM multi-processing module 工作模式原理以及区别  

    prefork:多进程I/O模型,每一个进程相应一个请求,Centos7默认模型
      一个主进程:生成和回收n个子进程,创建套接字,不响应请求
      多个子进程:工作work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求
    prefork MPM:预派生模式,有一个主控制进程,然后生成多个子进程,每个子进程有一个独立的响应用户请求,相对比较占用内存,但是比较稳定,
      可以设置最大和最小进程数,是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景.
    worker:复用的多进程IO模型,多进程多线程,IIS使用此模型
      一个主进程:生成m个子进程,每个子进程负责生成n个线程,每个线程响应一个请求,并发响应请求:m*n
    worker MPM: 是一种多进程和多线程混合的模型,有一个控制经常,启动多个子进程,每个子进程里面包含固定的线程,使用线程来处理请求,当线程
      不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,由于其使用线程处理请求,因此可以承受更高的并发.
    优点: 相比prefork占用的内存较少,可以同时处理更多的请求
    缺点: 使用keep-alive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放.如果过多的线程,被这样占据,
      也会导致再高并发场景下的无服务线程使用.
    event:事件驱动模式,centos8默认模型
      一个主进程:生成m个子进程,每个子进程负责生成n个线程,每个线程响应一个请求,并发响应请求m*n. 有专门的监控线程来管理这些keep-alive
        类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放.这样增强了高并发场景下的请求处理能力
    event MPM: Apache 中最新的模式,属于事件驱动模型,每个进程响应多个请求,在现在版本里的已经是稳定可用的模式.它和worker模式很像,最大的
      区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题.event MPM中 ,会有一个专门的线程来管理这些keep-alive
      类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放.这样增强了高并发场景下的请求处理能力.
    优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求时,
      将请求传递给服务线程,执行完毕后,又允许释放.
    缺点:没有线程安全控制.

    2、编译安装httpd 2.4 

    #!/bin/bash
    
    ##安装编译安装必要程序
    yum install gcc make pcre-devel openssl-devel expat-devel bzip2 make wget -y
    
    ##检车/apps目录
    [ -d /apps ] || mkdir /apps
    
    ##检查用户
    id apache || useradd -s /sbin/nologin -r apache
    
    
    install_httpd24(){
    
    ##下载安装包
    [ -e apr-1.7.0.tar.bz2 ] || wget  https://mirrors.bfsu.edu.cn/apache//apr/apr-1.7.0.tar.bz2
    [ -e apr-util-1.6.1.tar.bz2 ] || wget  https://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-util-1.6.1.tar.bz2
    [ -e httpd-2.4.46.tar.bz2 ] || wget  https://mirrors.tuna.tsinghua.edu.cn/apache//httpd/httpd-2.4.46.tar.bz2
    
    ##解压
    tar xf apr-1.7.0.tar.bz2
    tar xf apr-util-1.6.1.tar.bz2
    tar xf httpd-2.4.46.tar.bz2
    
    ##合并安装包
    mv apr-1.7.0 httpd-2.4.46/srclib/apr
    mv apr-util-1.6.1 httpd-2.4.46/srclib/apr-util
    
    ##编译
    cd httpd-2.4.46
    ./configure --prefix=/apps/httpd24 
    --enable-so 
    --enable-ssl 
    --enable-cgi 
    --enable-rewrite 
    --with-zlib 
    --with-pcre 
    --with-included-apr 
    --enable-modules=most 
    --enable-mpms-shared=all 
    --with-mpm=prefork
    
    ##安装
    make -j 4 && make install 
    
    ## 修改配置文件
    sed -ri 's/^User.*$/User apache/' /apps/httpd24/conf/httpd.conf 
    sed -ri 's/^Group.*$/Group apache/' /apps/httpd24/conf/httpd.conf
    sed -ri 's/^#(ServerName.*$)/1/' /apps/httpd24/conf/httpd.conf
    
    ## 在/etc/man_db.conf的22行后面添加/apps/httpd24/man
    sed -ri 'N;22 a MANDATORY_MANPATH                       /apps/httpd24/man' /etc/man_db.conf 
    
    ##添加变量,并生效
    echo PATH=/apps/httpd24/bin:$PATH > /etc/profile.d/httpd24.sh
    source  /etc/profile.d/httpd24.sh
    
    ##检查语法
    #httpd -t 
    
    ##创建service文件
    cat > /usr/lib/systemd/system/httpd24.service <<-EOF
    [Unit]
    Description=The Apache HTTP Server
    After=network.target remote-fs.target nss-lookup.target
    Documentation=man:httpd(8)
    Documentation=man:apachectl(8)
    
    [Service]
    Type=forking
    #EnvironmentFile=/etc/sysconfig/httpd
    
    ExecStart=/apps/httpd24/bin/apachectl start
    ExecReload=/apps/httpd24/bin/apachectl graceful
    ExecStop=/apps/httpd24/bin/apachectl stop
    
    
    # We want systemd to give httpd some time to finish gracefully, but still want
    # it to kill httpd after TimeoutStopSec if something went wrong during the
    # graceful stop. Normally, Systemd sends SIGTERM signal right after the
    # ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
    # httpd time to finish.
    KillSignal=SIGCONT
    PrivateTmp=true
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
    ##启动服务
    systemctl daemon-reload
    systemctl enable --now  httpd24
    echo "apache 安装成功.";exit
    }
    
    install_httpd24

    3、编写一个一键部署 LAMP 架构之 wordpress 脚本

    #!/bin/bash
    #
    #********************************************************************
    #Author: huangguangrui
    #QQ: 158086268
    #Date: 2020-09-09
    #FileName: install_httpd24_php74.sh
    #URL: http://www.xxx.com
    #Description: The test script
    #Copyright (C): 2020 All rights reserved
    #********************************************************************
    SRC="/usr/local/src"
    HDIR="/apps/httpd24"
    PDIR="/apps/php74"

    HTTP="httpd-2.4.46.tar.bz2"
    HTTP_DIR="httpd-2.4.46"
    PHP="php-7.4.10.tar.bz2"
    PHP_DIR="php-7.4.10"

    APR="apr-1.7.0.tar.bz2"
    APR_UTIL="apr-util-1.6.1.tar.bz2"

    WP="wordpress-5.4.2-zh_CN.tar.gz"

    COL='echo -e "33[01;31m'
    END='33[0m"'


    ##安装必要软件
    ${COL} 系统安装必要软件中...请稍等... $END
    yum install gcc make pcre-devel lbzip2 openssl-devel expat-devel bzip2-devel make wget libaio libxml2-devel libmcrypt-devel sqlite-devel oniguruma unzip -y

    ##修改计算机名
    hostnamectl set-hostname LAP

    check(){

    cd ${SRC}
    ${COL}检测当前网络状态$END

    ping -c1 baidu.com &> /dev/null
    if [ $? -eq 0 ];then
    ${COL}当前网络可以联网,下载安装包中...$END
    if [ ! -e ${HTTP} ];then
    wget -c https://mirrors.tuna.tsinghua.edu.cn/apache//httpd/${HTTP} && ${COL}${HTTP}下载完成!$END
    else
    ${COL}${HTTP}已存在!$END
    fi

    if [ ! -e ${APR} ];then
    wget -c https://mirrors.bfsu.edu.cn/apache//apr/${APR} && ${COL}${APR}下载完成!$END
    else
    ${COL}${APR}已存在!$END
    fi

    if [ ! -e ${APR_UTIL} ];then
    wget -c https://mirrors.tuna.tsinghua.edu.cn/apache//apr/${APR_UTIL} && ${COL}${APR_UTIL}下载完成!$END
    else
    ${COL}${APR_UTIL}已存在!$END
    fi

    if [ ! -e ${PHP} ];then
    wget -c https://www.php.net/distributions/php-7.4.10.tar.bz2 && ${COL}${PHP}下载完成!$END
    else
    ${COL}${PHP}已存在!$END
    fi

    if [ ! -e ${WP} ];then
    wget -c https://cn.wordpress.org/latest-zh_CN.tar.gz && ${COL}${WP}下载完成!$END
    else
    ${COL}${WP}已存在!$END
    fi
    else
    ${COL}当前网络无法联网,正在检测相关文件...$END
    if [ ! -e ${HTTP} ];then
    ${COL}缺少${HTTP}文件$END
    ${COL}请下载好相关文件放到${SRC}目录下$END
    exit
    elif [ ! -e ${APR} ];then
    ${COL}缺少${APR}文件$END
    ${COL}请下载好相关文件放到${SRC}目录下$END
    exit
    elif [ ! -e ${APR_UTIL} ];then
    ${COL}缺少${APR_UTIL}文件$END
    ${COL}请下载好相关文件放到${SRC}目录下$END
    exit
    elif [ ! -e ${PHP} ];then
    ${COL}缺少${PHP}文件$END
    ${COL}请下载好相关文件放到${SRC}目录下$END
    exit
    elif [ ! -e ${WP} ];then
    ${COL}缺少${WP}文件$END
    ${COL}请下载好相关文件放到${SRC}目录下$END
    exit
    else
    ${COL}所有文件都齐全.$END
    return
    fi
    fi
    }

    install_httpd24() {
    ${COL}开始安装httpd..$END
    groupadd -r -g 48 apache
    useradd -r -u 48 -g apache -s /sbin/nologin apache

    ##解压
    tar xf ${APR}
    tar xf ${APR_UTIL}
    tar xf ${HTTP}

    ##合并安装包
    mv apr-1.7.0 ${HTTP_DIR}/srclib/apr
    mv apr-util-1.6.1 ${HTTP_DIR}/srclib/apr-util

    ##编译
    cd ${HTTP_DIR}
    ./configure --prefix=${HDIR}
    --enable-so
    --enable-ssl
    --enable-cgi
    --enable-rewrite
    --with-zlib
    --with-pcre
    --with-included-apr
    --enable-modules=most
    --enable-mpms-shared=all
    --with-mpm=event

    ##安装
    make -j 4 && make install

    ## 修改配置文件
    sed -ri 's/^User.*$/User apache/' ${HDIR}/conf/httpd.conf
    sed -ri 's/^Group.*$/Group apache/' ${HDIR}/conf/httpd.conf
    sed -ri 's/^#(ServerName.*$)/1/' ${HDIR}/conf/httpd.conf

    ##可选项--
    #sed -ri 's/^#(.*mod_mpm_event.so)$/1/' ${DIR}/conf/httpd.conf
    #sed -ri 's/^#(.*mod_mpm_perfork.so)$/1/' ${DIR}/conf/httpd.conf
    #sed -ri 's/^#(.*mod_mpm_worker.so)$/1/' ${DIR}/conf/httpd.conf


    ## 在/etc/man_db.conf的22行后面添加${DIR}/man
    sed -ri "N;22 a MANDATORY_MANPATH ${HDIR}/man" /etc/man_db.conf

    ##添加变量,并生效
    echo PATH=${HDIR}/bin:$PATH > /etc/profile.d/httpd24.sh
    source /etc/profile.d/httpd24.sh

    ##检查语法
    httpd -t

    ##创建service文件
    cat > /usr/lib/systemd/system/httpd24.service <<-EOF
    [Unit]
    Description=The Apache HTTP_DIR Server
    After=network.target remote-fs.target nss-lookup.target
    Documentation=man:httpd(8)
    Documentation=man:apachectl(8)

    [Service]
    Type=forking
    #EnvironmentFile=/etc/sysconfig/httpd

    ExecStart=${HDIR}/bin/apachectl start
    ExecReload=${HDIR}/bin/apachectl graceful
    ExecStop=${HDIR}/bin/apachectl stop


    # We want systemd to give httpd some time to finish gracefully, but still want
    # it to kill httpd after TimeoutStopSec if something went wrong during the
    # graceful stop. Normally, Systemd sends SIGTERM signal right after the
    # ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
    # httpd time to finish.
    KillSignal=SIGCONT
    PrivateTmp=true

    [Install]
    WantedBy=multi-user.target
    EOF

    ##启动服务
    systemctl daemon-reload
    systemctl enable --now httpd24
    [ $? -eq 0 ] && ${COL}httpd24安装成功...$END || ${COL}httpd24安装失败...$END
    ss -ntl |grep 80
    [ $? -eq 0 ] && ${COL}httpd24启动成功...$END || ${COL}httpd24启动失败...$END
    }

    install_php74(){
    ${COL}开始安装httpd..$END

    cd ${SRC}
    tar xf ${PHP}

    ##编译PHP
    cd ${PHP_DIR}
    ./configure
    --prefix=${PDIR}
    --enable-mysqlnd
    --with-mysqli=mysqlnd
    --with-pdo-mysql=mysqlnd
    --with-openssl
    --with-zlib
    --with-config-file-path=/etc
    --with-config-file-scan-dir=/etc/php.d
    --enable-mbstring
    --enable-xml
    --enable-sockets
    --enable-fpm
    --enable-maintainer-zts
    --disable-fileinfo

    ##安装
    make -j 4 && make install

    ##追加PATH变量
    echo "PATH=${PDIR}/bin:$PATH" > /etc/profile.d/php74.sh
    . /etc/profile.d/php74.sh

    ##查看版本
    php --version
    [ $? -eq 0 ] && ${COL}php-fpm安装成功...$END || ${COL}php-fpm安装失败...$END

    ##准备php配置文件和启动文件
    cp php.ini-production /etc/php.ini
    cp sapi/fpm/php-fpm.service /usr/lib/systemd/system/

    cd ${PDIR}/etc/
    cp php-fpm.conf.default php-fpm.conf
    cp php-fpm.d/www.conf.default php-fpm.d/www.conf

    ##修改配置的用户和组
    sed -ri "s/^user.*$/user = apache/" php-fpm.d/www.conf
    sed -ri "s/^group.*$/group = apache/" php-fpm.d/www.conf

    ##支持status和ping页面
    sed -ri "s@;(pm.status_path).*@1 = /fpm_status@" php-fpm.d/www.conf
    sed -ri "s/;(ping.path.*)/1/" php-fpm.d/www.conf

    ##支持opcache加速
    mkdir /etc/php.d
    cat > /etc/php.d/opcache.ini <<-EOF
    [opcache]
    zend_extension=opcache.so
    opcache.enable=1
    EOF

    ##重启PHP-fpm服务
    systemctl daemon-reload
    systemctl enable --now php-fpm.service
    systemctl status php-fpm.service


    ##修改httpd24配置文件,使之支持php-fpm
    sed -ri 's/#(.*mod_proxy.so$)/1/' ${HDIR}/conf/httpd.conf
    sed -ri 's/#(.*mod_proxy_fcgi.so$)/1/' ${HDIR}/conf/httpd.conf
    sed -ri 's/(DirectoryIndex) (index.html)/1 index.php 2/' ${HDIR}/conf/httpd.conf

    cat >>${HDIR}/conf/httpd.conf <<-EOF
    AddType application/x-httpd-php .php
    proxyrequests off

    <virtualhost *:80>
    servername blog.guangrui.com
    documentroot "/data/wordpress"
    <directory "/data/wordpress">
    require all granted
    </directory>
    proxypassmatch ^/(.*.php)$ fcgi://127.0.0.1:9000/data/wordpress/$1
    proxypassmatch ^/(fpm_status|ping)$ fcgi://127.0.0.1:9000/$1
    customlog "logs/access_wordpress_log" common
    </virtualhost>

    EOF
    systemctl restart php-fpm
    [ $? -eq 0 ] && ${COL}php-fpm启动成功...$END || ${COL}php-fpm启动失败...$END
    }

    wp(){
    [ -d /data ] || mkdir /data && rm -rf /data/wordpress/*

    cd ${SRC}

    tar xf ${WP}
    mv wordpress /data
    setfacl -R -m u:apache:rwx /data/wordpress

    systemctl restart httpd24.service
    [ $? -eq 0 ] && ${COL}httpd_php部署完成...,请部署mariadb...$END
    }

    check
    install_httpd24
    install_php74
    wp

    #!/bin/bash
    #
    #********************************************************************
    #Author:            huangguangrui
    #QQ:                158086268
    #Date:              2020-09-09
    #FileName:         install_mariadb(10.2).sh
    #URL:               http://www.xxx.com
    #Description:      The test script
    #Copyright (C):    2020 All rights reserved
    #********************************************************************
    SRC="/usr/local/src"
    DIR="/data/mysql"
    MYSQL="mariadb-10.2.33-linux-x86_64.tar.gz"
    COL='echo -e "33[01;31m'
    END='33[0m"'
    
    ##安装必要软件
     ${COL} "系统安装必要软件中...请稍等..." $END
    yum install gcc make pcre-devel openssl-devel expat-devel bzip2-devel make wget libaio  libxml2-devel  libmcrypt-devel sqlite-devel  -y
    
    hostnamectl set-hostname mariadb
    
    check(){
    cd ${SRC}
    ${COL}"检测当前网络状态"$END
    
    ping -c1 baidu.com &> /dev/null
    if  [ $? -eq 0 ];then
        ${COL}"当前网络可以联网,下载${MYSQL}中..."$END
        [ -e ${MYSQL} ] || wget -O ${SRC}/${MYSQL} https://mirrors.ustc.edu.cn/mariadb//mariadb-10.2.33/bintar-linux-x86_64/mariadb-10.2.33-linux-x86_64.tar.gz && ${COL}"${MYSQL}下载完成!"$END
    else 
        ${COL}"当前网络无法联网,正在检测相关文件..."$END
        if [ ! -e ${MYSQL} ];then
            ${COL}"缺少${MYSQL}"文件$END
            ${COL}"请下载好相关文件放到${SRC}目录下"$END
            exit
        elif [ -e /usr/local/mysql ];then 
            ${COL} "数据库已存在,安装失败" $END
            exit
        else
            return
        fi
    fi
    }
    
    install_mariadb(){
    ${COL} "开始安装数据库..." $END
    id mysql || useradd -s /sbin/nologin  -r mysql
    
    ##解压到/usr/local目录
    tar xf ${MYSQL} -C /usr/local/ &> /dev/null
    
    ##软链接
    cd /usr/local/
    ln -sv mariadb-10.2.33-linux-x86_64 mysql &> /dev/null
    
    ##修改权限
    cd mysql
    chown -R root.root ./* &> /dev/null
    
    ##创建数据库存放目录
    mkdir ${DIR} -p 
    chown -R mysql.mysql ${DIR}
    
    mkdir /etc/mysql &> /dev/null
    chown -R mysql.mysql /etc/mysql
    
    cp support-files/my-huge.cnf /etc/my.cnf
    sed -ri '/^server-id.*$/d' /etc/my.cnf
    sed -ri '/[mysqld]/askip_name_resolve=on' /etc/my.cnf
    sed -ri '/[mysqld]/adatadir=/data/mysql' /etc/my.cnf
    sed -ri '/[mysqld]/aserver-id=68' /etc/my.cnf
    
    ##增加PATH路径,并生效
    echo "PATH=/usr/local/mysql/bin:$PATH" > /etc/profile.d/mysql.sh
    . /etc/profile.d/mysql.sh
    
    ##安装数据库并关联mysql用户和数据存放目录
    scripts/mysql_install_db --user=mysql --datadir=/data/mysql &> /dev/null
    
    ##复制server文件到启动目录
    cp support-files/mysql.server /etc/rc.d/init.d/mysqld
    
    ##添加到开机启动
    chkconfig --add mysqld  &> /dev/null
    
    ##启动服务
    service mysqld start
    #[ $? -eq 0 ] && { ${COL} "数据库安装成功..." $END } || { ${COL} "数据库安装失败..." $END;exit; }
    ss -ntl |grep 3306
    [ $? -eq 0 ] && ${COL} "数据库启动成功..." $END || ${COL} "数据库启动失败..." $END
    }
    
    chang_mysql(){
    mysql -e "drop database test;"
    
    mysql -e "create database wordpress;"
    #mysql -e "create database discuz;"
    mysql -e "grant all on wordpress.* to wpuser@'10.0.0.%' identified by 'Admin@120';"
    #mysql -e "grant all on discuz.* to discuz@'10.0.0.%' identified by '123456';"
    }
    
    check
    install_mariadb
    chang_mysql

    浏览器打开该网址:*********

  • 相关阅读:
    设计模式之模板方法
    UML中常见关系详解(泛化、实现、依赖、关联、组合、聚合)
    JAVA并行框架学习之ForkJoin
    生产环境上shell的解读
    设计模式之中介者模式
    设计模式之策略模式
    设计模式之状态模式
    深入理解动态代理
    深入理解Java虚拟机
    深入理解Java虚拟机
  • 原文地址:https://www.cnblogs.com/huangguangrui/p/13619747.html
Copyright © 2011-2022 走看看