编译安装基于 FASTCGI 模式LAMP架构多 虚拟主机WEB应用

Purpose:
实现CentOS 7 编译安装基于 fastcgi 模式的多虚拟主机的wordpress和discuz的LAMP架构
Lab envirronment:

两台主机:
一台C7  10.0.0.60:Apache+php-fpm(fastcgi模式+process+manages )
一台C8  10.0.0.65:Mysql 服务器

软件版本
CentOS 7.8
Mysql 8.0 通用二进制格式
apr-1.7.0.tar.gz
apr-util-1.6.1.tar.gz
httpd-2.4.48.tar.gz
php-7.4.tar.xz 或 php-7.3.tar.bz2
wordpress-5.7.2-zh_CN
Discuz_X3.4_SC_UTF8_20210630 注意最新版X3.4,PHP最低要求5.3,最高7.4(推荐用5.6、7.1等版本兼容性好)


工具包:wget unzip 

 

Mysql配置:
1.通用二进制安装代码:

#!/bin/bash
#
#********************************************************************
#Author:            Caoqinglin
#FileName:            Install_Mysql_binary.sh
#Description:        The test script
#Copyright (C):     2021 All rights reserved
#********************************************************************

COLOR="\E[1;$[RANDOM%7+31]m"
COLOR_END="\E[0m"
MYSQL_URL="https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.24-linux-glibc2.12-x86_64.tar.xz"
MYSQL_FILE="${MYSQL_URL##*/}"
DATE_PATH="/data/mysql"
os_tepy(){
          VERSION=`cat /etc/os-release | sed -rn 's@^ID="?(.*[^"])"?@\1@p'`
       if [ ${VERSION} = "centos" ];then
          echo -e "${COLOR}系统版本为CentOS${COLOR_END}"
       elif [ ${VERSION} = "ubuntu" ];then
          echo -e "${COLOR}系统版本为Ubuntu,不支持该脚本${COLOR_END}"
#       else 
#          echo -e "${COLOR}该脚本仅支持CentOS和Ubuntu${COLOR_END}"
fi       
}

install_package(){
                 rpm -q libaio numactl-libs wget >/dev/null       
               if [ $? -eq 1 ] ;then
                 yum -y install libaio numactl-libs wget &>/dev/null || echo -e ${COLOR}安装依赖包出错,请检查!!!
             fi
               if [ -e /root/${MYSQL_URL##*/} ]; then
                 echo -e ${COLOR} 二进制版本mysql_server已安装完毕,准备进行配置 ${COLOR_END}                 
               elif echo -e ${COLOR} 已开始下载二进制版本mysql_server ${COLOR_END};then
                 wget ${MYSQL_URL}
              fi
}

install_mysql(){
#将下载的mysql压缩包解压到/usr/local
    echo -e ${COLOR}开始解压................... ${COLOR_END}
    tar xf ${MYSQL_FILE} -C /usr/local/  && echo -e ${COLOR}解压成功已解压到 /usr/local ${COLOR_END} || echo -e ${COLOR}解压失败,请检查软件包 ${COLOR_END}
#因为二进制安装是别人已经编译好的程序,指定/usr/local/mysql为mysql的安装路径,因此解压的程序需要创建个软连接指向/usr/local/mysql
 ln -sv /usr/local/${MYSQL_FILE%%.tar*} /usr/local/mysql
}
 
create_mysql-user(){
#创建mysql账号和组并关联。
 groupadd -r -g 306 mysql;useradd -r -g 306 -u 306 -d /data/mysql mysql
#因为软连接mysql目录下的文件所有者和所属组存在问题,因此 通过 -R 的递归功能 将>软连接mysql下的所有文件所有者和所属组都修改成root
  chown -R root:root /usr/local/mysql/
}

#创建mysql存放数据的目录
if [ -e ${DATE_PATH} ];then
        mkdir /data/mysql_bak
        mv -r ${DATE_PATH}/* /data/mysql_bak &>/dev/null
      elif echo -e ${COLOR}${DATE_PATH}为数据库存储数据路径${COLOR_END};then
        mkdir ${DATE_PATH}
fi

#编写mysql配置文件
  rm -rf /etc/my.cnf
  cat > /etc/my.cnf <<-EOF
[mysqld]
datadir=${DATE_PATH}
socket=${DATE_PATH}/mysql.sock
log-error=${DATE_PATH}/mysql.log
pid-file=/${DATE_PATH}/mysql.pid
slow_query_log
#log-bin=/PATH/logbin
#skip_name_resolve=1


[client]
socket=${DATE_PATH}/mysql.sock

[mysql]
 prompt="\\r:\\m:\\s(\\u@\\h) [\\d]>\\_"

EOF

create__path(){
#将此路径存放着一些脚本例如:初始化安全脚本,加入PATH后输入脚本名九可直接运行了。
 echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
#将加入PATH后输出的脚本文件启动,这样PATH才能够彻底加载路径。
 . /etc/profile.d/mysql.sh
#生成数据库文件,并提取root密码,数据库文件的所有者 设置为mysql、存放数据的路径设置事先创建的/data/mysql,运行这个脚本文件夹不能有任何东西否则会报错,--initialize-insecure这个选项代表着创建空密码,创建空密码之后可以再修改密码。
 mysqld --initialize-insecure --user=mysql --datadir=${DATE_PATH}
}
mysql_start(){
#将mysql服务脚本拷贝到init.d目录下并命名mysqld,这样才能将mysqld这个服务加入到服务列表中并将服务启动。
 cp -rf /usr/local/mysql/support-files/mysql.server  /etc/init.d/mysqld
 killall mysqld &>/dev/null
 chkconfig --add mysqld;service mysqld start;
#将空密码修改成指定密码(要符合密码强度)
 mysqladmin password 123456
}

main(){
 os_tepy
 install_package
 install_mysql
 create_mysql-user
 create__path
 mysql_start
}

main

 

 

 1.创建用于wordpress与discuz服务存放数据的数据库及用于连接数据库的账号(生产中严谨起见,连接数据库的账号管理哪个数据库就授予管理哪个数据库的权限)

 create database wordpress; 
 create database discuz;
 create user wordpress@'10.0.0.%' identified by'123456';
 grant all on wordpress.* to wordpress@'10.0.0.%';
 create user discuz@'10.0.0.%' identified by'123456';
 grant all on discuz.* to discuz@'10.0.0.%';

 

 





Apache配置:
编译安装代码如下:

#!/bin/bash
#
#********************************************************************
#Author:                 caoqinglin
#FileName:            install_httpd.sh
#Description:        The test script
#Copyright (C):     2021 All rights reserved
#********************************************************************
CPUS=`lscpu |grep "CPU(s)"|awk '{print $2}'|head -1`
HTTP_URL="https://mirrors.tuna.tsinghua.edu.cn/apache/httpd/httpd-2.4.48.tar.gz"
HTTP_FILE="${HTTP_URL##*/}"
APR_URL="https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-1.7.0.tar.gz"
APR_FILE="${APR_URL##*/}"
APR_UTIL_URL="https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-util-1.6.1.tar.gz"
APR_UTIL_FILE="${APR_UTIL_URL##*/}"

INSTALL_DIR="/apps/httpd"

install_package(){
  grep "Ubuntu" /etc/issue &> /dev/null
    if [ $? -eq 0 ] ;then
      apt -y install build-essential libpcre3 libpcre3-dev openssl libssl-dev libexpat1-dev wget
    fi
  grep "Kernel" /etc/issue &> /dev/null
    if [ $? -eq 0 ] ;then
      yum -y install gcc make pcre-devel openssl-devel expat-devel wget
    fi

  wget ${HTTP_URL} && wget ${APR_URL} && wget ${APR_UTIL_URL}
}

install_http(){
  
  tar xvf ${HTTP_FILE} && tar xvf ${APR_FILE} && tar xvf ${APR_UTIL_FILE}
  mv ${APR_FILE%.tar*} ${HTTP_FILE%.tar*}/srclib/apr
  mv ${APR_UTIL_FILE%.tar*} ${HTTP_FILE%.tar*}/srclib/apr-util
  cd ${HTTP_FILE%.tar*}
  ./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

  make -j ${CPUS} && make install
  #环境
  echo "PATH=${INSTALL_DIR}/bin:$PATH" > /etc/profile.d/http24.sh
  . /etc/profile.d/http24.sh
  #创建用户
  useradd -s /sbin/nologin -r apache 
  #更改运行用户
  sed -Ei "s/daemon/apache/g" ${INSTALL_DIR}/conf/httpd.conf
  #创建service
  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 enable --now httpd
}

main(){
  install_package
  install_http
}

main

 

 

1.Apache配置文件进行修改

 
 #需开启Apache自身的代理功能否则fcgi代理及ProxyRequests Off(反向代理)都无法使用,如果装载了fcgi模块Apache服务也会因此无法启动。
 sed -ri.bak 's@#(LoadModule proxy_module .*)@\1@' /apps/httpd/conf/httpd.conf                 
 #开启fcgi的代理功能
 sed -ri.bak 's@#(LoadModule proxy_fcgi_module.*)@\1@' /apps/httpd/conf/httpd.conf              
 #增加一个php程序的索引文件(主页面),放在index。html前面意思就是优先级高于index.html显示。
 sed -ri.bak 's@(.*DirectoryIndex) (index.html)@\1 index.php \2@' /apps/httpd/conf/httpd.conf

 

 

 

 2.安装并解压wordpress与discuz压缩包将其关键文件移动到适合提供服务的路径。

 wget https://cn.wordpress.org/wordpress-5.7.2-zh_CN.zip
 unzip /root/wordpress-5.7.2-zh_CN.zip
 mv /root/wordpress /data/wordpress
 chown -R apache:apache /data/wordpress/;chmod -R 766 /data/wordpress/

 wget https://gitee.com/3dming/DiscuzL/attach_files/759935/download
 unzip download
 mv /root/upload/ /data/discuz
 chown -R apache:apache /data/discuz/;chmod -R 766 /data/discuz/

 

 

 
3.基于域名的方式创建用于wordpress和Discuz服务的虚拟主机

cat > /root/virtualhost <<-EOF

AddType application/x-httpd-php .php
ProxyRequests Off

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

<virtualhost *:80>
servername forum.qinglin.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>
EOF

 

 

 

 <将虚拟主机配置文件置入Apache主配置文件末尾后重启Apache>

cat /root/virtualhost >> /apps/httpd/conf/httpd.conf 
systemctl enable --now httpd
systemctl restart httpd

 

 


php-fpm配置:
1.将依赖包、工具进行下载并下载php-fpm及将其解压。

yum -y install gcc libxml2-devel bzip2-devel libmcrypt-devel sqlite-devel oniguruma-devel php-xml php-json php-mysqlnd wget unzip
wget https://www.php.net/distributions/php-7.4.21.tar.gz
tar xf php-7.4.21.tar.gz

2.进入php-fpm包编译,通过./configure --help 可查看需要启用的功能。
PS:
1)编译安装如果提示缺少某个包那么缺少的一般是 -devel包,可用provides配合通配符查询
2)抽取当前CPU核数作为Var,进行make的时候调动,这样可以充分利用当前资源进行编译。< cat /proc/cpuinfo | grep 'cpu cores'| awk '{print $4}' >

cd php-7.*

 

./configure \
--prefix=/apps/php \
--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 8 && make install

 

<编译成功图>

 

 

<查看opcache加速器是否开启,如果为disable则表示默认可以关闭,已经默认开启的意思>

 

3)将php-fpm程序文件添加到PATH路径中,使用 php -verssion 可查看其版本号。

echo 'PATH=/apps/php/bin:$PATH' >/etc/profile.d/lamp.sh
chmod +x /etc/profile.d/lamp.sh
source /etc/profile.d/lamp.sh

 

 

4)将源码包中的php-fpm配置文件拷贝到/etc/php.ini ,并对其配置进行修改。

 \cp  /root/php-7.4.21/php.ini-production /etc/php.ini                            #php的配置文件(生产版)
 cp /apps/php/etc/php-fpm.conf.default /apps/php/etc/php-fpm.conf                 #将default去掉,php-fpm的配置文件
 cp /apps/php/etc/php-fpm.d/www.conf.default /apps/php/etc/php-fpm.d/www.conf     #将default去掉,php-frpm节点的配置

 


sed -ri.bak 's@;(date.timezone =).*@\1 Asia/Shanghai@' /etc/php.ini                 #修改时区
 sed -ri.bak 's@(post_max_size =) 8M@\1 20M @' /etc/php.ini                          #最大上传数据大小。
 sed -ri.bak 's@(upload_max_filesize =) 2M@\1 20M@' /etc/php.ini                     #最大上传文件大小
 sed -ri.bak 's@(expose_php =).*@\1 Off@' /etc/php.ini                               #关闭php版本号信息
 sed -ri.bak 's@;(error_log = log/php-fpm.log)@\1@' /apps/php/etc/php-fpm.conf       #开启错误日志功能
 sed -ri.bak 's@;(pm.status_path = /status)@\1@' /apps/php/etc/php-fpm.d/www.conf    #开启status页功能
 sed -ri.bak 's@;(ping.path = /ping)@\1@' /apps/php/etc/php-fpm.d/www.conf           #开启ping功能
 sed -ri.bak 's@;(ping.response = pong)@\1@' /apps/php/etc/php-fpm.d/www.conf        #如果ping通则返回pong
 sed -ri.bak 's@(user =) nobody@\1 apache@' /apps/php/etc/php-fpm.d/www.conf         #修改所有者为apache
 sed -ri.bak 's@(group =) nobody@\1 apache@' /apps/php/etc/php-fpm.d/www.conf        #修改所属组为apache
 sed -ri.bak 's@(pm.max_children =) .*@\1 60@' ${INSTALL_DIR_PHP}/etc/php-fpm.d/www.conf  ###pm.max不得超过这个值

 sed -ri.bak 's@(pm.start_servers =).*@\1 20@' /apps/php/etc/php-fpm.d/www.conf      #启动服务立即开启多少个进程给用户连接
 sed -ri.bak 's@(pm.min_spare_servers =) .*@\1 15@' /apps/php/etc/php-fpm.d/www.conf #最小开启多少个进程数给用户连接
 sed -ri.bak 's@(pm.max_spare_servers =) .*@\1 50@' /apps/php/etc/php-fpm.d/www.conf #最大开启多少个进程数给用户连接
注:1. pm.start_servers不得小于pm.min_spare_servers不得大于pm.spare_servers 及pm.spare_servers不得大于pm.max_children

  2. ;listen.allowed_clients = 127.0.0.1  #需注释,否则php-fpm只接受本机通过fastcgi发送来的请求,这就导致了Web服务器与php-fpm服务器间分离的失败。


 

5)开启opcache加速器、将php-fpm的服务脚本拷贝到服务列表中并将其启动。
<开启opcache>

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

 

 

\cp /root/php-7.4.21/sapi/fpm/php-fpm.service /lib/systemd/system/

 

 


<平滑加载php-fpm配置并启动服务>

systemctl daemon-reload
systemctl enable --now  php-fpm.service
systemctl restart  php-fpm.service

 

 <查看服务情况,立马开启20个进程等待用户连接>



 

 

 测试环节:
1)找到windows 的 C:\Windows\System32\drivers\etc 下的hosts文件,打开后模拟DNS解析。
<将虚拟主机配置中标注的域名与物理机进行相互映射>

 

 

 

 

 

 2)安装服务和连接数据库。

 

 

 

 

 

 

 

 

 

 

 










 

 

 

 






 

 

 





























 

posted on 2021-07-04 17:07  1251618589  阅读(5)  评论(0编辑  收藏  举报

导航