1、简述CGI与FASTCGI区别

CGI:Common Gateway Interface 公共网关接口

CGI 在2000年或更早的时候用得比较多,以前web服务器一般只处理静态的请求,如果碰到一个动态请求怎么办呢?web服务器会根据这次请求的内容,然后会 fork 一个新进程来运行外部的 C 程序或者bash,perl脚本等,这个进程会把处理完的数据返回给web服务器,最后web服务器把内容发送给用户,刚才fork的进程也随之退出。 如果下次用户还请求改动态脚本,那么web服务器又再次fork一个新进程,周而复始的进行。CGI 可以让一个客户端,从网页浏览器通过http服务器向执行在网络服务器上的程序传输数据;CGI描述了客户端和服务器程序之间传输的一种标准

请求流程:

Client -- (http协议) --> httpd -- (cgi协议) --> application server (program file) -- (mysql协议) --> mysql

fastcgi的方式是,web服务器收到一个请求时,不会重新fork一个进程(因为这个进程在web服务器启动时就开启了,而且不会退出),web服务器直接把内容传递给这个进程(进程间通信,但fastcgi使用了别的方式,tcp方式通信),这个进程收到请求后进行处理,把结果返回给web服务器,最后自己接着等待下一个请求的到来,而不是退出。

请求流程:

Client -- (http协议) --> httpd -- (fastcgi协议) --> fastcgi服务器 -- (mysql协议) --> mysql

CGI和fastcgi 比较:

CGI: 兼职, 一次性的过河拆桥式的服务

FASTCGI: 专职,全周期的持续式的服务


在web服务器方面

在对数据进行处理的进程方面

CGI

 fork一个新的进程进行处理

读取参数,处理数据,然后就结束生命期

FASTCGI

用tcp方式跟远程机子上的进程或本地进程建立连接

要开启tcp端口,进入循环,等待数据的到来,处理数据

2、编译安装基于fastcgi模式的多虚拟主机的wordpress和discuz的LAMP架构

第十四周学习作业_mysql

2.1安装前软件准备

[root@CentOS84 ~]# tree
.
├── install_offline_mysql5.7or8.0_for_centos.sh
└── mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
[root@centos79 ~]# tree
.
├── apr-1.7.0.tar.gz
├── apr-util-1.6.1.tar.gz
├── httpd-2.4.53.tar.gz
├── install_httpd24.sh
├── install_php74.sh
├── latest-zh_CN.tar.gz
├── liboniguruma5-6.9.7.1-alt1.x86_64.rpm
├── liboniguruma-devel-6.9.7.1-alt1.x86_64.rpm
└── php-7.4.28.tar.gz

2.2二进制数据库安装

##安装脚本
[root@CentOS84 ~]# cat install_offline_mysql5.7or8.0_for_centos.sh

#!/bin/bash
# https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
# https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.27-linux-glibc2.12-x86_64.tar.xz

source /etc/init.d/functions

SRC_DIR=`pwd`
MYSQL='mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz'
#MYSQL='mysql-8.0.27-linux-glibc2.12-x86_64.tar.xz'
COLOR='echo -e \E[01;31m'
END='\E[0m'
MYSQL_ROOT_PASSWORD=mysql123

check(){

if [ $UID -ne 0 ]; then
action "当前用户不是root,安装失败" false
exit=1
fi

cd $SRC_DIR
if [ ! -e $SRC_DIR ]; 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 numactl-libs
cd $SRC_DIR
tar xf $MYSQL -C /usr/local/
MYSQL_DIR=`echo $MYSQL | sed -nr 's/^(.*[0-9]).*/\1/p'`
ln -s /usr/local/$MYSQL_DIR /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=1
log-bin
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
[client]
socket=/data/mysql/mysql.sock
EOF
[ -d /data ] || mkdir /data
chown -R mysql.mysql /usr/local/mysql/
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
service mysqld start
if [ $? -eq 0 ]; then
mysqladmin -uroot password $MYSQL_ROOT_PASSWORD &> /dev/null
action "数据库安装完成!口令:${MYSQL_ROOT_PASSWORD}"
else
echo "数据库启动失败,退出!"
fi
}

check
install_mysql

##执行过程
[root@CentOS84 ~]# sh install_offline_mysql5.7or8.0_for_centos.sh
开始安装MySQL数据库...

Upgraded:
numactl-libs-2.0.12-13.el8.x86_64

创建mysql用户 [ OK ]
Starting MySQL. SUCCESS!
数据库安装完成!口令:mysql123 [ OK ]
2.2.1创建wordpress和discuz数据库及登录账户
[root@CentOS84 ~]# mysql -uroot -p'mysql123'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.36-log MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
mysql> create database workpress;
Query OK, 1 row affected (0.06 sec)

mysql> create database discuz;
Query OK, 1 row affected (0.00 sec)

mysql> grant all on wokpress.* to workpress@'10.10.10.%' identified by "mysql123";
Query OK, 0 rows affected, 1 warning (0.05 sec)

mysql> grant all on discuz.* to discuz@'10.10.10.%' identified by "mysql123";
Query OK, 0 rows affected, 1 warning (0.00 sec)

2.3编译安装apache

##安装脚本
[root@centos79 ~]# cat install_httpd24.sh
#/bin/bash
#https://dlcdn.apache.org/httpd/httpd-2.4.53.tar.gz
#https://dlcdn.apache.org/apr/apr-1.7.0.tar.gz
#https://dlcdn.apache.org/apr/apr-util-1.6.1.tar.gz

source /etc/init.d/functions

SRC_DIR=`pwd`
HTTPD='httpd-2.4.53.tar.gz'
APR='apr-1.7.0.tar.gz'
APR_UTIL='apr-util-1.6.1.tar.gz'
INSTALL_DIR='/apps/httpd'
COLOR_Y='echo -e \E[01;33m'
COLOR_G='echo -e \E[01;32m'
END='\E[0m'

check(){
if [ $UID -ne 0 ]; then
action "当前用户不是root,安装失败" false
exit=1
fi
cd $SRC_DIR
if [ ! = $SRC_DIR ]; then
action "缺少$HTTPD,$APR,$APR-UTIL 安装文件,相关文件请放在$SRC_DIR目录下" false
exit=1
fi
$COLOR_Y"开始安装依赖包..."$END
yum install gcc pcre-devel openssl-devel expat-devel vim -y &> /dev/null
$COLOR_G"依赖包,安装完成!"$END
}

install_httpd(){
$COLOR_Y"开始安装配置httpd..."$END
tar xf ${HTTPD} && tar xf ${APR} && tar xf ${APR_UTIL}
mv ${APR%.tar.*} ${HTTPD%.tar.*}/srclib/apr
mv ${APR_UTIL%.tar.*} ${HTTPD%.tar.*}/srclib/apr-util
cd ${HTTPD%.tar.*}
$COLOR_Y"开始安装编译httpd..."$END
./configure --prefix=${INSTALL_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 &> /tmp/configure.log
if [ $? -eq 0 ]; then
rm -rf /tmp/configure.log
else
echo "configure 失败!,请查看/tmp/configure.log,进行分析!"
exit 0
fi
make -j $CPUS &> /tmp/make.log && make install &>> /tmp/make.log
if [ $? -eq 0 ]; then
rm -rf /tmp/make.log
else
echo "configure 失败!,请查看/tmp/make.log,进行分析!"
exit 0
fi
$COLOR_G"编译httpd完成"$END
$COLOR_Y"配置环境变量"$END
echo "PATH=${INSTALL_DIR}/bin:$PATH" > /etc/profile.d/apache.sh && source /etc/profile.d/apache.sh
$COLOR_Y"创建apache账户..."$END
id apache &> /dev/null || { useradd -s /sbin/nologin -r apache ; $COLOR_G"创建apache用户完成"$END;}
#修改配置文件中的运行账户,修改ServerName启动时的告警信息
sed -i.bak 's/daemon/apache/' $INSTALL_DIR/conf/httpd.conf
sed -i '/^#ServerName www.*/s/^#//' $INSTALL_DIR/conf/httpd.conf
$COLOR_Y"配置启动服务"$END
cat > /lib/systemd/system/httpd.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
ExecStart=${INSTALL_DIR}/bin/apachectl start
ExecReload=${INSTALL_DIR}/bin/apachectl graceful
ExecStop=${INSTALL_DIR}/bin/apachectl stop
KillSignal=SIGCONT
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload && systemctl start httpd
if [ $? -eq 0 ]; then
$COLOR_G"httpd启动完成!!"$END
else
action "服务启动失败!!" false
fi
}
check
install_httpd
## 执行过程
[root@centos79 ~]# sh install_httpd24.sh
开始安装依赖包...
依赖包,安装完成!
开始安装配置httpd...
开始安装编译httpd...
编译httpd完成
配置环境变量
创建apache账户
创建apache用户完成 [ OK ]
配置启动服务
httpd启动完成!!

2.4编译安装PHP

##安装脚本
[root@centos79 ~]# cat install_php74.sh
#/bin/bash
#https://www.php.net/distributions/php-7.4.28.tar.gz
#依赖包
#http://ftp.altlinux.org/pub/distributions/ALTLinux/Sisyphus/x86_64/RPMS.classic/liboniguruma-devel-6.9.7.1-alt1.x86_64.rpm
#http://ftp.altlinux.org/pub/distributions/ALTLinux/Sisyphus/x86_64/RPMS.classic/liboniguruma5-6.9.7.1-alt1.x86_64.rpm

source /etc/init.d/functions

SRC_DIR=`pwd`
PHPFILE='php-7.4.28.tar.gz'
INSTALL_DIR='/apps/php74'
COLOR_Y='echo -e \E[01;33m'
COLOR_G='echo -e \E[01;32m'
COLOR_R='echo -e \E[01;31m'
END='\E[0m'
CPUS=`lscpu |awk '/^CPU\(s\)/{print $2}'`

check(){
if [ $UID -ne 0 ]; then
action "当前用户不是root,安装失败" false
exit=1
fi
cd $SRC_DIR
if [ ! = $SRC_DIR ]; then
action "缺少$PHPFILE 安装文件,相关文件请放在$SRC_DIR目录下" false
exit=1
fi
$COLOR_Y"开始安装依赖包..."$END
yum install -y gcc libxml2-devel bzip2-devel libmcrypt-devel sqlite-devel freetype freetype-devel libpng-devel libjepg-devel liboniguruma-devel-6.9.7.1-alt1.x86_64.rpm liboniguruma5-6.9.7.1-alt1.x86_64.rpm &> /dev/null
$COLOR_G"依赖包,安装完成!"$END
}

install_php(){
$COLOR_Y"开始安装配置php..."$END
tar xf ${PHPFILE}
cd ${PHPFILE%.tar.*}
$COLOR_Y"开始安装编译php..."$END
./configure --prefix=${INSTALL_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 --disable-fileinfo --enable-gd &> /tmp/configure.log
if [ $? -eq 0 ]; then
rm -rf /tmp/configure.log
else
action "configure 失败!,请查看/tmp/configure.log,进行分析!" false
exit 0
fi
make -j $CPUS &> /tmp/make.log && make install &>> /tmp/make.log
if [ $? -eq 0 ]; then
rm -rf /tmp/make.log
else
action "make 失败!请查看/tmp/make.log,进行分析!" false
exit 0
fi

$COLOR_G"编译php完成"$END
$COLOR_Y"配置环境变量"$END
echo 'PATH=${INSTALL_DIR}/bin:$PATH' > /etc/profile.d/php.sh && source /etc/profile.d/php.sh
id apache &> /dev/null || { useradd -s /sbin/nologin -r apache ; action "创建apache用户";}
$COLOR_Y"准备php配置文件和启动文件"$END
cp ${SRC_DIR}/${PHPFILE%.tar.*}/php.ini-production /etc/php.ini
cp ${SRC_DIR}/${PHPFILE%.tar.*}/sapi/fpm/php-fpm.service /usr/lib/systemd/system/
cp ${INSTALL_DIR}/etc/php-fpm.conf.default ${INSTALL_DIR}/etc/php-fpm.conf
cp ${INSTALL_DIR}/etc/php-fpm.d/www.conf.default ${INSTALL_DIR}/etc/php-fpm.d/www.conf
$COLOR_Y"修改进程所有者"$END
sed -ri 's/(user = )nobody/\1apache/' ${INSTALL_DIR}/etc/php-fpm.d/www.conf
sed -ri 's/(group = )nobody/\1apache/' ${INSTALL_DIR}/etc/php-fpm.d/www.conf
# $COLOR_Y"支持status和ping页面"$END
# sed -ri 's/;pm.status_path = \/status/pm.status_path = \/fpm_status/' ${INSTALL_DIR}/etc/php-fpm.d/www.conf
# sed -ri '/^;ping.response = pong/s/^;//' ${INSTALL_DIR}/etc/php-fpm.d/www.conf
$COLOR_Y"支持opcache加速"$END
mkdir /etc/php.d/
cat > /etc/php.d/opcache.ini <<EOF
[opcache]
zend_extension=opcache.so
opcache.enable=1
EOF
systemctl daemon-reload
systemctl start php-fpm.service
if [ $? -eq 0 ]; then
$COLOR_G"php-fpm服务启动完成!!"$END
else
action "服务启动失败!!" false
fi
}
check
install_php
##执行过程
[root@centos79 ~]# sh install_php74.sh
开始安装依赖包...
依赖包,安装完成!
开始安装配置php...
开始安装编译php...
编译php完成
配置环境变量
准备php配置文件和启动文件
修改进程所有者
支持opcache加速
php-fpm服务启动完成!!

2.5配置apache 支持PHP

##编辑httpd.conf 文件
[root@centos79 conf]# vim /apps/httpd/conf/httpd.conf
#取消下面两行的注释
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
#修改下面行,增加index.php
DirectoryIndex index.php index.html
#增加加下面行
AddType application/x-httpd-php .php
#AddType application/x-httpd-php-source .phps
ProxyRequests Off
Include conf/extra/blog.conf
Include conf/extra/forum.conf
## 新建Virtual hosts配置文件
##blog vhost 配置文件
[root@centos79 conf]# pwd
/apps/httpd/conf
[root@centos79 conf]# cat extra/blog.conf
<virtualhost *:80>
servername blog.test.org
documentroot /data/wordpress
<directory /data/wordpress>
require all granted
</directory>
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/data/wordpress/$1
#实现status和ping页面
#ProxyPassMatch ^/(fpm_status|ping)$ fcgi://127.0.0.1:9000/$1
CustomLog "logs/access_wordpress_log" common
</virtualhost>

## forum vhost配置文件
[root@centos79 conf]# cat extra/forum.conf
<virtualhost *:80>
servername forum.test.org
documentroot /data/discuz
<directory /data/discuz/>
require all granted
</directory>
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/data/discuz/$1
CustomLog "logs/access_discuz_log" common
</virtualhost>
##检查语法,重新启动apache服务
[root@centos79 ~]# httpd -t
Syntax OK
[root@centos79 ~]# systemctl restart httpd.service

2.6 准备wordpress和discuz 相关文件

##wordpress
[root@centos79 ~]# mkdir /data
[root@centos79 ~]# tar xf latest-zh_CN.tar.gz -C /data/
[root@centos79 ~]# setfacl -R -m u:apache:rwx /data/wordpress/

##discuz
[root@centos79 discuz]# unzip Discuz_X3.4_SC_UTF8_20220131.zip
[root@centos79 discuz]# mv upload /data/discuz
[root@centos79 discuz]# setfacl -R -m u:apache:rwx /data/discuz/

2.7登录blog.test.org和forum.test.org进行初始化

2.7.1 blog.test.org初始化

第十四周学习作业_php_02

第十四周学习作业_centos_03

第十四周学习作业_php_04

第十四周学习作业_mysql_05

第十四周学习作业_centos_06

第十四周学习作业_mysql_07

2.7.2forum.test.org进行初始化

第十四周学习作业_mysql_08

第十四周学习作业_centos_09

第十四周学习作业_centos_10

第十四周学习作业_mysql_11

第十四周学习作业_centos_12

3、通过loganalyzer展示数据库中的日志

第十四周学习作业_php_13

3.1下载loganalyzer准备介质

[root@centos79 ~]# wget https://download.adiscon.com/loganalyzer/loganalyzer-4.1.12.tar.gz
[root@centos79 ~]# tar -xf loganalyzer-4.1.12.tar.gz
[root@centos79 ~]# mv loganalyzer-4.1.12/src /data/loganalyzer
[root@centos79 ~]# setfacl -R -m u:apache:rwx /data/loganalyzer

3.2配置Apache 虚拟主机,运行loganalyzer项目

[root@centos79 data]# vim /apps/httpd/conf/httpd.conf
##增加:
Include conf/extra/log.conf
##增加虚拟主机配置文件
[root@centos79 data]# cat /apps/httpd/conf/extra/log.conf
<virtualhost *:80>
servername log.test.org
documentroot /data/loganalyzer
<directory /data/loganalyzer>
require all granted
</directory>
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/data/loganalyzer/$1
#实现status和ping页面
#ProxyPassMatch ^/(fpm_status|ping)$ fcgi://127.0.0.1:9000/$1
CustomLog "logs/access_loganalyzer_log" common
</virtualhost>
##说明编译PHP 支持gb 需要安装依赖包freetype freetype-devel libpng-devel libjepg-devel 编译PHP时,请增加--enable-gd 不然运行loganalyzer不出现图表
[root@centos79 data]# systemctl restart httpd

3.3配置apache服务器rsysconfig log写入logserver 测试logserver可以接收log

[root@centos79 ~]# vim /etc/rsyslog.conf
##再此行下*.info;mail.none;authpriv.none;cron.none /var/log/messages 增加
*.info;mail.none;authpriv.none;cron.none @@10.10.10.11:514
[root@centos79 ~]# systemctl restart rsyslog.service

3.4配置LogServer 安装连接mysql模块相关的程序包

[root@logserver ~]#  yum install -y rsyslog-mysql
[root@logserver ~]# rpm -ql rsyslog-mysql
/usr/lib/.build-id
/usr/lib/.build-id/e6
/usr/lib/.build-id/e6/aa0e40c19a2e0524d72780eee3b1698684cbe7
/usr/lib64/rsyslog/ommysql.so
/usr/share/doc/rsyslog/mysql-createDB.sql

##拷贝 /usr/share/doc/rsyslog/mysql-createDB.sql 到数据库服务器中
[root@logserver ~]# scp /usr/share/doc/rsyslog/mysql-createDB.sql 10.10.10.10:~/

##数据库服务器操作
mysql> source /root/mysql-createDB.sql;
Query OK, 1 row affected (0.01 sec)

Database changed
Query OK, 0 rows affected (0.01 sec)

Query OK, 0 rows affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| Syslog |
| discuz |
| mysql |
| performance_schema |
| sys |
| workpress |
+--------------------+
7 rows in set (0.00 sec)

mysql> grant all on rsyslog.* to syslog@'10.10.10.%' identified by "mysql123";
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> use Syslog;
Database changed
mysql> show tables;
+------------------------+
| Tables_in_Syslog |
+------------------------+
| SystemEvents |
| SystemEventsProperties |
+------------------------+
2 rows in set (0.00 sec)

3.5修改logserver rsysconfig配置文件

增加两行
module(load="ommysql") ##增加连接数据库模块
*.info;mail.none;authpriv.none;cron.none :ommysql:10.10.10.10,Syslog,rsyslog,mysql123

开启监听tcp端口 取消注释
module(load="imtcp") # needs to be done just once
input(type="imtcp" port="514")

[root@logserver ~]# systemctl restart rsyslog.service
[root@logserver ~]# ss -nltp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=971,fd=5))
LISTEN 0 25 0.0.0.0:514 0.0.0.0:* users:(("rsyslogd",pid=10581,fd=4))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=971,fd=7))
LISTEN 0 25 [::]:514 [::]:* users:(("rsyslogd",pid=10581,fd=5))

3.6登录页面配置进行配置

第十四周学习作业_centos_14

第十四周学习作业_centos_15

第十四周学习作业_mysql_16

第十四周学习作业_mysql_17

第十四周学习作业_mysql_18

第十四周学习作业_mysql_19

第十四周学习作业_mysql_20

第十四周学习作业_php_21