作业七
## 基于二进制一键安装 LAMP 架构的 word press脚本
### (1) 实现目标
**实现CentOS 7编译安装基于 fastcgi 模式的wordpress**
### (2)软件版本
- CentOS 7.8
- mariadb-10.5.6-linux-systemd-x86_64.tar.gz通用二进制格式(https://mirrors.tuna.tsinghua.edu.cn/mariadb//mariadb-10.5.6/bintar-linux-systemd-x86_64/mariadb-10.5.6-linux-systemd-x86_64.tar.gz)
- apr-1.7.0.tar.bz2 (https://downloads.apache.org/apr/apr-1.7.0.tar.bz2)
- apr-util-1.6.1.tar.bz2 (https://downloads.apache.org/apr/apr-util-1.6.1.tar.bz2)
- php-7.4.12(https://www.php.net/distributions/php-7.4.12.tar.bz2)
- wordpress-5.4.2-zh_CN.tar.gz(https://cn.wordpress.org/latest-zh_CN.tar.gz)
### (3) 一键安装部署脚本
```bash
[root@centos7 scripts]#vim install_lamp_wordpress.sh
#!/bin/bash
#
#********************************************************************
#Author: Tangtao
#QQ: 1812237069
#Date: 2020-10-31
#FileName: install_lamp_wordpress.sh
#Website(URL): http://www.magedu.com
#Description: The test script
#Copyright (C): 2020 All rights reserved
#********************************************************************
#set -u
#set -e
. /etc/init.d/functions
#编译安装mariadb
install_mariadb() {
mariadb_package=mariadb-10.5.6-linux-systemd-x86_64.tar.gz
mysql_dir=`echo $mariadb_package | sed -nr "s/^(.*[0-9]).*/\1/p"`
mysql_data_dir="/data/mysql"
wordpress_user=wordpress
wordpress_pass=\'123456\'
wordpress_net=\'10.0.0.%\'
#检查环境用户
if [ $UID -ne 0 ] ;then
action "当前用户不是root,安装失败" false
exit
fi
#创建mysql系统用户
id mysql &>/dev/null || useradd -r -s /sbin/nologin mysql
if [ ! -d ${mysql_data_dir} ];then
mkdir -pv ${mysql_data_dir}
chown mysql.mysql ${mysql_data_dir}
fi
echo -e "\e[1;32m 开始编译安装mariadb...\e[0m" && sleep 1
#安装相关依赖包
yum -y install autoconf libaio perl-Data-Dumper ncurses-compat-libs wget &> /dev/null
#下载源码包
cd /usr/local/src
wget https://mirrors.tuna.tsinghua.edu.cn/mariadb//mariadb-10.5.6/bintar-linux-systemd-x86_64/$mariadb_package
#解包并创建软连接为/usr/local/mysql
tar xf $mariadb_package
ln -sv /usr/local/src/$mysql_dir /usr/local/mysql
chown -R root.root /usr/local/mysql
#准备配置文件/etc/my.cnf
cat > /etc/my.cnf <<EOF
[mysqld]
server-id=1
log-bin
datadir=$mysql_data_dir
innodb_file_per_table = on
skip_name_resolve = on #禁止主机名解析,建议使用
#socket=$mysql_data_dir/mysql.sock
[mysqld_safe]
log-error=$mysql_data_dir/mysql.log
pid-file=${mysql_data_dir}/mysql.pid
#[client]
#socket=${mysql_data_dir}/mysql.sock
EOF
#创建数据库文件
cd /usr/local/mysql
./scripts/mysql_install_db --datadir=${mysql_data_dir} --user=mysql
#准备服务脚本,实现启动服务并开机自启
#方法一:当没有对应的support-files/systemd/XXXX.service文件时:
#cp ./support-files/mysql.server /etc/init.d/mysqld
#cd /etc/init.d/
#chkconfig --add mysqld
#service mysqld start
#方法二:当有对应的support-files/systemd/XXXX.service文件时:
cp support-files/systemd/mariadb.service /usr/lib/systemd/system/
systemctl daemon-reload
systemctl enable --now mariadb
systemctl restart mariadb
#创建软连接或者指定PATH路径...
#指定PATH路径:
#echo 'PATH=/user/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
#. /etc/profile.d/mysql.sh
#创建软连接:
ln -s /usr/local/mysql/bin/* /usr/bin/
action 'mariadb编译安装成功' && sleep 1
#为wordprss应用准备数据库和用户帐号
mysql -uroot -e ' create database wordpress '
mysql -uroot -e ' grant all on wordpress.* to ${wordpress_user}@${wordpress_net} identified by ${wordpress_pass} '
action "wordprss和discuz应用数据库和用户帐号准备完成" && sleep 1
}
#编译安装httpd2.4
install_httpd24 () {
echo -e "\e[1;32m 开始编译安装httpd...\e[0m" && sleep 1
package_dir=/usr/local/src
apr_version=apr-1.7.0
apr_util_version=apr-util-1.6.1
httpd_version=httpd-2.4.46
install_dir=/apps/httpd24
index_dir=/var/www/html
#安装相关依赖包
yum -y install gcc make pcre-devel openssl-devel expat-devel wget bzip2
#下载源代码并解压
cd $package_dir
wget https://downloads.apache.org//{apr/{${apr_version},${apr_util_version}},httpd/${httpd_version}}.tar.bz2
tar xf ${apr_version}.tar.bz2
tar xf ${apr_util_version}.tar.bz2
tar xf ${httpd_version}.tar.bz2
#创建系统用户
id apache &> /dev/null || useradd -r -s /sbin/nologin apache && echo "apache 用户已存在"
action "httpd服务环境准备完毕,开始编译安装"
#将apr和apr-util源码与httpd源码合并
cd $package_dir
mv ${apr_version} ${httpd_version}/srclib/apr
mv ${apr_util_version} ${httpd_version}/srclib/apr-util
#编译安装
cd $package_dir/$httpd_version
./configure \
--prefix=${install_dir} \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewarite \
--with-zlib \
--with-pcre \
--with-included-apr \
--enable-modules=most \
--enable-mpms-shared=all \
--with-mpm=event
make -j `lscpu | grep "^CPU(s)" | awk '{print $NF}'` && make install
action "编译安装完成,开始配置httpd服务" && sleep 1
#指定运行httpd的用户
sed -i "/^User/c User apache" ${install_dir}/conf/httpd.conf
sed -i "s/^Group.*/Group apache/" ${install_dir}/conf/httpd.conf
#配置PATH路径
echo "PATH=${install_dir}/bin:$PATH" > /etc/profile.d/httpd24.sh
. /etc/profile.d/httpd24.sh
#配置man帮助
sed -i "/^#MANDATORY_MANPATH/a MANDATORY_MANPATH /apps/httpd24/man" /etc/man_db.conf
#创建service unit文件,设置开机自
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
#EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/apps/httpd24/bin/apachectl start
#ExecStart=/apps/httpd24/bin/httpd \$OPTIONS -k start
ExecReload=/apps/httpd24/bin/apachectl graceful
#ExecReload=/apps/httpd24/bin/httpd \$OPTIONS -k graceful
ExecStop=/apps/httpd24/bin/apachectl stop
KillSignal=SIGCONT
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
#修改配置文件,设置主页目录为${index_dir}
mkdir -p ${index_dir}
sed -i "/^DocumentRoot.*/c DocumentRoot ${index_dir}" /apps/httpd24/conf/httpd.conf
sed -i "/^DocumentRoot.*/a </Directory>" /apps/httpd24/conf/httpd.conf
sed -i "/^DocumentRoot.*/a Require all granted" /apps/httpd24/conf/httpd.conf
sed -i "/^DocumentRoot.*/a <Directory ${index_dir}>" /apps/httpd24/conf/httpd.conf
action "httpd服务配置完成,启动服务" && sleep 1
systemctl daemon-reload
systemctl enable --now httpd.service && action "httpd服务已启动完成"
}
#编译安装php-7.4
install_php() {
echo -e "\e[1;32m 开始编译安装php...\e[0m" && sleep 1
php_package=php-7.4.12.tar.xz
php_dir=`echo $php_package | sed -nr 's/^(.*[0-9]).tar.*/\1/p'`
php_install_dir=/apps/php74
#安装相关包,依赖EPEL源
yum -y install gcc libxml2-devel bzip2-devel libmcrypt-devel sqlite-devel oniguruma-devel
#下载源码包并解压
cd /usr/local/src
#此包下载非常慢,可能因无法下载导致编译安装失败,建议先下载包,然后导入到/usr/local/src目录中
wget https://www.php.net/distributions/$php_package
tar xf $php_package
#编译安装PHP
cd $php_dir
./configure \
--prefix=/apps/php74 \
--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 `lscpu | grep "^CPU(s)" | awk '{print $NF}'` && make install
#准备PATH变量
echo "PATH=${php_install_dir}/bin:$PATH" > /etc/profile.d/lamp.sh
. /etc/profile.d/lamp.sh
#准备PHP配置文件
cp php.ini-production /etc/php.ini
cp sapi/fpm/php-fpm.service /usr/lib/systemd/system/
cd /apps/php74/etc
cp php-fpm.conf.default php-fpm.conf
cd php-fpm.d/
cp www.conf.default www.conf
#修改进程所有者
sed -i "/^user.*/c user = apache" /apps/php74/etc/php-fpm.d/www.conf
sed -i "/^group.*/c group = apache" /apps/php74/etc/php-fpm.d/www.conf
sed -ri "s#^;(pm.status_path).*#\1 = /fpm_status#" /apps/php74/etc/php-fpm.d/www.conf
sed -ri "s#^;(ping.path.*)#\1#" /apps/php74/etc/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 status php-fpm.service
systemctl enable --now php-fpm.service
action "php编译安装完成" && sleep 1
}
#修改配置httpd支持php-fpm
httpd_config() {
sed -ri "s@^#(LoadModule proxy_module modules/mod_proxy.so)@\1@" /apps/httpd24/conf/httpd.conf
sed -ri "s@^#(LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so)@\1@" /apps/httpd24/conf/httpd.conf
sed -ri "s@(DirectoryIndex) (index.html)@\1 index.php \2@" /apps/httpd24/conf/httpd.conf
cat >> /apps/httpd24/conf/httpd.conf <<EOF
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
ProxyRequests Off
ProxyPassMatch ^/(.*.php) fcgi://127.0.0.1:9000/var/www/html/\$1
EOF
action "httpd配置支持php-fpm完成" && sleep 1
}
#准备wordpress
wordpress() {
#此处index_dir必须与install_http24函数中的对应
index_dir=/var/www/html
echo -e "\e[1;32m 开始准备wordpress...\e[0m" && sleep 1
#wordpress下载源码包
cd /usr/local/src
#此包下载非常慢,可能因无法下载导致编译安装失败,建议先下载包,然后导入到/usr/local/src目录中
wget https://cn.wordpress.org/latest-zh_CN.tar.gz
tar xf latest-zh_CN.tar.gz
mv wordpress ${index_dir}
chown -R apache.apache ${index_dir}/wordpress
action "wordpress 部署完成" && sleep 1
}
#调用函数
install_mariadb
install_httpd24
install_php
httpd_config
wordpress
```
浙公网安备 33010602011771号