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='