马哥博客作业第十五周

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 "\033[01;31m'
END='\033[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 "\033[01;31m'
END='\033[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\]/a\skip_name_resolve=on' /etc/my.cnf
sed -ri '/\[mysqld\]/a\datadir=/data/mysql' /etc/my.cnf
sed -ri '/\[mysqld\]/a\server-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

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

 

posted @ 2020-09-05 21:17  IRui  阅读(235)  评论(0编辑  收藏  举报