马哥博客作业第十五周


1、写出 MPM multi-processing module 工作模式原理以及区别
Prefork MPM:预派生模式,有一个主控制进程,然后生成多个子进程,每个子进程有一个独立的线程响应用户请求,相对比较占用内存,但是比较稳定,
可以设置最大和最小进程数,是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景。
优点:稳定
缺点:慢,占用资源,不适用于高并发场景

worker MPM:是一种多进程和多线程混合的模型,有一个控制进程,启动多个子进程,每个子进程里面包含固定的线程,使用线程程来处理请求,
当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,由于其使用了线程处理请求,因此可以承受更高的并发。
优点:相比prefork 占用的内存较少,可以同时处理更多的请求
缺点:使用keep-alive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。
如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)

Event MPM:和worker模式很像,最大的区别在于在event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,
当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。
优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keep-alive类型的线程,
当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。
缺点:没有线程安全控制

2、编译安装httpd 2.4
1>.安装相关包
[root@CentOS8 ~]#yum -y install wget bzip2 gcc make pcre-devel openssl-devel expat-devel
2>.下载源代码并解压缩
[root@CentOS8 ~]#wget https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-1.7.0.tar.bz2;tar xvf apr-1.7.0.tar.bz2
[root@CentOS8 ~]#wget https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-util-1.6.1.tar.bz2;tar xvf apr-util-1.6.1.tar.bz2
[root@CentOS8 ~]#wget https://mirrors.tuna.tsinghua.edu.cn/apache/httpd/httpd-2.4.46.tar.bz2;tar xvf httpd-2.4.46.tar.bz2
3>.将apr和apr-util源码与httpd 源码合并
[root@CentOS8 ~]#mv apr-1.7.0 httpd-2.4.46/srclib/apr
[root@CentOS8 ~]#mv apr-util-1.6.1 httpd-2.4.46/srclib/apr-util
4>.将三者一并编译并安装
[root@CentOS8 ~]#cd httpd-2.4.46/
[root@CentOS8 ~]#./configure \
--prefix=/app/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=event
[root@CentOS8 ~]#make -j 4 && make install
5>.创建专用用户
[root@CentOS8 ~]#useradd -s /sbin/nologin -r apache
6>.指定运行httpd的用户
[root@CentOS8 ~]#sed -ri 's/^User.*/User apache/;s/^Group.*/Group apache/' /app/httpd24/conf/httpd.conf
7>.配置环境变量
[root@CentOS8 ~]#echo 'PATH=/app/httpd24/bin:$PATH' > /etc/profile.d/httpd.sh
[root@CentOS8 ~]#source /etc/profile.d/httpd.sh
8>.配置帮助
[root@CentOS8 ~]#vim /etc/man_db.conf
MANDATORY_MANPATH      /app/httpd24/man
9>.创建service unit文件(CentOS 7 以上版本)
[root@CentOS8 ~]#vim /usr/lib/systemd/system/httpd24.service
[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=/app/httpd24/bin/apachectl start
#ExecStart=/app/httpd24/bin/httpd $OPTIONS -k start
ExecReload=/app/httpd24/bin/apachectl graceful
#ExecReload=/app/httpd24/bin/httpd $OPTIONS -k graceful
ExecStop=/app/httpd24/bin/apachectl stop
KillSignal=SIGCONT
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[root@CentOS8 ~]#systemctl enable --now httpd24
10.>设置开机启动(CentOS 6 以前版本)
[root@CentOS6 ~]#echo "/app/httpd24/bin/apachectl start" >> /etc/rc.d/rc.local

3、编译安装基于 FASTCGI 模式LAMP架构多虚拟主机WEB应用
目标:实现CentOS 7 编译安装基于 fastcgi 模式的多虚拟主机的wordpress和discuz的LAMP架构
环境准备:10.0.0.17:httpd+php(fastcgi模式)
    10.0.0.27:mysql服务器
软件版本:CentOS 7.8
    mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz通用二进制
    apr-1.7.0.tar.gz
    apr-util-1.6.1.tar.gz
    httpd-2.4.46.tar.gz
    php-7.4.7.tar.gz
    wordpress-5.4.2-zh_CN.tar.gz
    Discuz_X3.4_SC_UTF8【20200818】.zip
实验步骤:
1>.运行一键安装mysql脚本
#!/bin/bash
#wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz
. /etc/init.d/functions
SRC_DIR=`pwd`
MYSQL='mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz'
#MYSQL='mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz'
MYSQL_DIR=`echo $MYSQL| sed -rn 's/(.*[0-9]).*/\1/p'`
COLOR='echo -e \E[01;31m'
END='\E[0m'
MYSQL_ROOT_PASSWORD=centos
SID=$(ip a |awk -F[./] '/inet/ && /brd/ {print $4}')
check () {
if [ $UID -ne 0 ];then
action "当前用户不是root,安装失败" false
exit 1
fi
cd $SRC_DIR
if [ ! -e $MYSQL ];then
$COLOR"缺少${MYSQL}文件"$END
$COLOR"请将相关软件放在${SRC_DIR}目录下"$END
exit
elif [ -e /usr/local/mysql ];then
action "数据库已存在,安装失败" false
exit
else
return
fi
}

install_mysql () {
$COLOR"开始安装MySQL数据库..."$END
yum -y -q install libaio &> /dev/null
cd $SRC_DIR
tar xf $MYSQL -C /usr/local/
ln -s /usr/local/$MYSQL_DIR /usr/local/mysql
chown -R root.root /usr/local/mysql/
id mysql &> /dev/null || { useradd -s /sbin/nologin -r mysql ; action "创建mysql用户"; }
echo 'PATH=/usr/local/mysql/bin/:$PATH' > /etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh
cat > /etc/my.cnf <<-EOF
[mysqld]
server-id=$SID
log-bin
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
default_authentication_plugin=mysql_native_password
[client]
socket=/data/mysql/mysql.sock
EOF
[ -d /data ] || mkdir /data
mysqld --initialize --user=mysql --datadir=/data/mysql
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
service mysqld start
[ $? -ne 0 ] && { $COLOR"数据库启动失败,退出!"$END;exit; }
MYSQL_OLDPASSWORD=`awk '/A temporary password/{print $NF}' /data/mysql/mysql.log`
mysqladmin -uroot -p${MYSQL_OLDPASSWORD} password ${MYSQL_ROOT_PASSWORD} &>/dev/null
action "数据库安装完成"
}

create_wd_ds () {
mysql -uroot -pcentos -e "create database wordpress;" &> /dev/null
mysql -uroot -pcentos -e "create database discuz;" &> /dev/null
mysql -uroot -pcentos -e "create user wpuser@'10.0.0.%' identified by 'magedu';" &> /dev/null
mysql -uroot -pcentos -e "create user discuz@'10.0.0.%' identified by 'magedu';" &> /dev/null
mysql -uroot -pcentos -e "grant all on wordpress.* to wpuser@'10.0.0.%';" &> /dev/null
mysql -uroot -pcentos -e "grant all on discuz.* to discuz@'10.0.0.%';" &> /dev/null
action "数据库修改完成"
}

main () {
check
install_mysql
create_wd_ds
}
main

2>.运行一键安装httpd脚本
#!/bin/bash
#相关源码包路径
#wget https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-1.7.0.tar.gz
#wget https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-util-1.6.1.tar.gz
#wget https://mirrors.tuna.tsinghua.edu.cn/apache/httpd/httpd-2.4.46.tar.gz
. /etc/init.d/functions
SRC_DIR=`pwd`
COLOR='echo -e \E[01;31m'
END='\E[0m'
APR='apr-1.7.0'
APR_UTIL='apr-util-1.6.1'
HTTPD='httpd-2.4.46'
SUF='.tar.gz'
INS_DIR=/app/httpd24

check_httpd () {
if [ $UID -ne 0 ];then
action "当前用户不是root,安装失败!" false
exit
fi
cd ${SRC_DIR}
if [ ! -f $APR$SUF -o ! -f $APR_UTIL$SUF -o ! -f $HTTPD$SUF ];then
$COLOR "缺少相关源码包,请将相关源码包放到${SRC_DIR}" $END
exit
fi
rpm -q httpd &> /dev/null
if [ $? -eq 0 ];then
action "httpd已安装,安装失败" false
exit
fi
}

install_httpd () {
$COLOR "开始安装httpd服务..." $END
yum -q -y install wget bzip2 gcc make pcre-devel openssl-devel expat-devel &>/dev/null
tar xf $APR$SUF;tar xf $APR_UTIL$SUF;tar xf $HTTPD$SUF
mv $APR $HTTPD/srclib/apr
mv $APR_UTIL $HTTPD/srclib/apr-util
cd $HTTPD
./configure \
--prefix=$INS_DIR \
--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
id apache &> /dev/null || { useradd -s /sbin/nologin -r apache ; action "创建apache用户"; }
sed -ri 's/^User.*/User apache/;s/^Group.*/Group apache/' ${INS_DIR}/conf/httpd.conf
echo "PATH=${INS_DIR}/bin:$PATH" > /etc/profile.d/httpd.sh
source /etc/profile.d/httpd.sh
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=/app/httpd24/bin/apachectl start
#ExecStart=/app/httpd24/bin/httpd $OPTIONS -k start
ExecReload=/app/httpd24/bin/apachectl graceful
#ExecReload=/app/httpd24/bin/httpd $OPTIONS -k graceful
ExecStop=/app/httpd24/bin/apachectl stop
KillSignal=SIGCONT
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
systemctl enable --now httpd24
[ $? -ne 0 ] && { $COLOR"httpd启动失败,退出!"$END;exit; }
action "httpd安装完成"
}

main () {
check_httpd
install_httpd
}
main

3>.运行一键安装php脚本
#!/bin/bash
#wget https://www.php.net/distributions/php-7.4.7.tar.gz
#wget https://cn.wordpress.org/latest-zh_CN.tar.gz
. /etc/init.d/functions
SRC_DIR=`pwd`
COLOR='echo -e \E[01;31m'
END='\E[0m'
PHP='php-7.4.7'
SUF='.tar.gz'
INS_DIR=/app/php74
WP='wordpress-5.4.2-zh_CN.tar.gz'
DS='Discuz_X3.4_SC_UTF8【20200818】.zip'
DIR=/data

check_php () {
if [ $UID -ne 0 ];then
action "当前用户不是root,安装失败!" false
exit
fi
cd ${SRC_DIR}
if [ ! -f $PHP$SUF ];then
$COLOR "缺少相关源码包,请将相关源码包放到${SRC_DIR}" $END
exit
fi
rpm -q php &> /dev/null
if [ $? -eq 0 ];then
action "php已安装,安装失败" false
exit
fi
}

install_php () {
$COLOR "开始安装php服务..." $END
yum -y -q install unzip gcc libxml2-devel bzip2-devel libmcrypt-devel sqlite-devel oniguruma-devel &>/dev/null
tar xf $PHP$SUF
cd $PHP
./configure \
--prefix=${INS_DIR} \
--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 \
--enable-opcache \
--disable-fileinfo
make -j 4 && make install
echo "PATH=${INS_DIR}/bin:$PATH" > /etc/profile.d/php.sh
source /etc/profile.d/httpd.sh

#准备php配置文件和启动文件
cp php.ini-production /etc/php.ini
cp sapi/fpm/php-fpm.service /usr/lib/systemd/system/
cd ${INS_DIR}/etc
cp php-fpm.conf.default php-fpm.conf
cd php-fpm.d/
cp www.conf.default www.conf

#修改进程所有者
sed -ri 's/user = nobody/user = apache/;s/group = nobody/group = apache/' ${INS_DIR}/etc/php-fpm.d/www.conf
#支持status和ping页面
sed -ri 's@;(pm.status_path.*)@\1@;s@;(ping.path.*)@\1@' ${INS_DIR}/etc/php-fpm.d/www.conf
#支持opcache加速
# cat >> /etc/php.ini <<EOF
#[opcache]
#zend_extension=opcache.so       
#opcache.enable=1
#EOF
systemctl daemon-reload
systemctl enable --now php-fpm.service
[ $? -ne 0 ] && { $COLOR"php启动失败,退出!"$END;exit; }
action "php安装完成"
}

modify_httpd () {
#修改配置httpd 支持php-fpm
sed -ri 's@^#(LoadModule proxy_module.*)@\1@;s@^#(LoadModule proxy_fcgi_module.*)@\1@' /app/httpd24/conf/httpd.conf
sed -ri 's@(DirectoryIndex) (index.html)@\1 index.php \2@' /app/httpd24/conf/httpd.conf
cat >> /app/httpd24/conf/httpd.conf <<EOF
AddType application/x-httpd-php .php
ProxyRequests Off

<virtualhost *:80>
servername blog.magedu.org
documentroot $DIR/wordpress
<directory $DIR/wordpress>
require all granted
</directory>
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000$DIR/wordpress/$1
ProxyPassMatch ^/(status|ping)$ fcgi://127.0.0.1:9000/$1
CustomLog "logs/access_wordpress_log" common
</virtualhost>

<virtualhost *:80>
servername forum.magedu.org
documentroot $DIR/discuz
<directory $DIR/discuz/>
require all granted
</directory>
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000$DIR/discuz/$1
ProxyPassMatch ^/(status|ping)$ fcgi://127.0.0.1:9000/$1
CustomLog "logs/access_discuz_log" common
</virtualhost>
EOF
systemctl restart httpd24
[ $? -ne 0 ] && { $COLOR"httpd启动失败,退出!"$END;exit; }
action "httpd修改完成"
}

config_wordpress_discuz () {
[ -d "$DIR" ] || mkdir $DIR/
cd ${SRC_DIR}
tar xf $WP
mv wordpress/ $DIR
setfacl -R -m u:apache:rwx $DIR/wordpress/

unzip -d Discuz_X3.4 $DS &> /dev/null
mv Discuz_X3.4/upload/ $DIR/discuz/
setfacl -R -m u:apache:rwx $DIR/discuz/
action "wordpress和discuz配置完成"
}

main () {
check_php
install_php
modify_httpd
config_wordpress_discuz
}
main

4>修改C:\Windows\System32\drivers\etc\hosts文件,添加如下一行
 10.0.0.17 blog.magedu.org forum.magedu.org

5>通过浏览器访问http://blog.magedu.org/以及http://forum.magedu.org/通过WEB界面配置即可。

posted @ 2020-09-10 19:50  小小小小石头  阅读(162)  评论(0)    收藏  举报