作业(七)
通过编写 shell 脚本实现二进制安装 LAMP 架构的 word press
#!/bin/bash
#
#***************************************************
#Author: hukun
#QQ: 429095598
#Date: 2020-10-31
#FuleName: word_press.sh
#Description: The test script
#***************************************************
#二进制安装LAMP架构的word_press
. /etc/init.d/functions
#HTTPD变量
#准备好wordpress程序文件wordpress-5.4.2-zh_CN.tar.gz
HTTP=httpd-2.4.46
APR=apr-1.7.0
APR_UTIL=apr-util-1.6.1
HTTPD_DATA=/apps/httpd
WP=wordpress-5.4.2-zh_CN.tar.gz
WPDATA=${WP%%-*}
#MYSQL变量
#准备好MYSQL二进制安装包mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz
NAME='mysql-5.7.30-linux-glibc2.12-x86_64'
PASS1=123456
MYSQLD_DATA=/apps/mysql
#PHP变量
#准备好PHP源码包php-7.4.7.tar.bz2
PHP=php-7.4.7.tar.bz2
PHPDATA=${PHP%.tar.bz2*}
DATA=/apps/php
http_install (){
#安装相关包
yum -y install wget lbzip2 gcc make pcre-devel openssl-devel expat-devel
#下载源码包
wget -P /usr/local/src/ https://downloads.apache.org//apr/${APR}.tar.bz2
wget -P /usr/local/src/ https://downloads.apache.org//apr/${APR_UTIL}.tar.bz2
wget -P /usr/local/src/ https://downloads.apache.org//httpd/${HTTP}.tar.bz2
#解压源码包
cd /usr/local/src/
tar xf ${APR}.tar.bz2
tar xf ${APR_UTIL}.tar.bz2
tar xf ${HTTP}.tar.bz2
#将apr和apr-util源码与httpd源码合并
mv ${APR} ${HTTP}/srclib/apr
mv ${APR_UTIL} ${HTTP}/srclib/apr-util
#编译安装
cd ${HTTP}/
./configure --prefix=${HTTPD_DATA} --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
#创建apache用户
useradd -s /sbin/nologin -r apache
#指定运行httpd的用户
sed -i -e "s/^User .*/User apache/" -e "s/^Group .*/Group apache/" -e "s/^#LoadModule proxy_module modules\/mod_proxy.so/LoadModule proxy_module modules\/mod_proxy.so/" -e "s/^#LoadModule proxy_fcgi_module modules\/mod_proxy_fcgi.so/LoadModule proxy_fcgi_module modules\/mod_proxy_fcgi.so/" -e "s/DirectoryIndex index.html/DirectoryIndex index.php index.html/" ${HTTPD_DATA}/conf/httpd.conf
#配置环境变量
echo "PATH=/apps/httpd/bin:\$PATH" >> /etc/profile.d/httpd.sh
. /etc/profile.d/httpd.sh
#配置帮助
echo "MANDATORY_MANPATH /apps/httpd/man" >> /etc/man_db.conf
#创建service unit文件
cat > /usr/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=${HTTPD_DATA}/bin/apachectl start
ExecReload=${HTTPD_DATA}/bin/apachectl graceful
ExecStop=${HTTPD_DATA}/bin/apachectl stop
KillSignal=SIGCONT
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
#设置开机启动
systemctl daemon-reload
systemctl enable --now httpd.service
}
mysql_install (){
#安装mysql相关模块文件
yum -y install libaio numactl-libs
#创建mysql用户
useradd -s /sbin/nologin -r mysql
#准备数据库路径、二进制日志文件夹
mkdir -vp /data/mysql
#解压二进制安装文件
tar xf ${NAME}.tar.gz -C /usr/local
cd /usr/local/
ln -s /usr/local/${NAME} ${MYSQLD_DATA}
chown -R root.root ${MYSQLD_DATA}
chown -R mysql.mysql /data/mysql
#设置PATH变量
ln -s ${MYSQLD_DATA}/bin/* /usr/bin/
#修改mysql配置文件
cp /etc/my.cnf{,.bak}
IP=`hostname -I | cut -d. -f4`
cat > /etc/my.cnf << EOF
[mysqld]
server-id=${IP}
datadir=/data/mysql
skip_name_resolve=on
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
basedir=${MYSQLD_DATA}
log_bin
[client]
socket=/data/mysql/mysql.sock
EOF
#生成数据库文件
mysqld --initialize --user=mysql --datadir=/data/mysql
#开机自启脚本复制到系统配置文件里
cp ${MYSQLD_DATA}/support-files/mysql.server /etc/init.d/mysqld
#设置mysql开机自启
chkconfig --add mysqld
service mysqld start
#设置mysql密码
PASS2=`awk '/temporary password/{print $NF}' /data/mysql/mysql.log`
mysqladmin -uroot -p"${PASS2}" password "${PASS1}"
#为wordpress和discuz应用准备数据库和用户账号
mysql -uroot -p"${PASS1}" -e "create database wordpress;"
mysql -uroot -p"${PASS1}" -e "create database discuz;"
mysql -uroot -p"${PASS1}" -e "grant all on wordpress.* to wordpress@'10.0.0.%' identified by '${PASS1}';"
mysql -uroot -p"${PASS1}" -e "grant all on discuz.* to discuz@'10.0.0.%' identified by '${PASS1}';"
}
php_install (){
#安装php相关包
yum -y install bzip2 libxml2-devel bzip2-devel libmcrypt-devel sqlite-devel oniguruma-devel openssl-devel
#编译安装php
tar xf ${PHP}
cd ${PHPDATA}
./configure --prefix=${DATA} --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
#设置环境变量
echo "PATH=/apps/php/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 ${DATA}/etc/
cp php-fpm.conf.default php-fpm.conf
cd php-fpm.d/
cp www.conf.default www.conf
#更改页面配置文件
sed -i -e "s#^user .*#user = apache#" -e "s#^group .*#group = apache#" -e "s#^;pm\.status.*#pm\.status_path = /fpm_status#" -e "s#^;ping\.path .*#ping\.path = /ping#" www.conf
#opcache加速
mkdir /etc/php.d
cat > /etc/php.d/opcache.ini <<EOF
[opcache]
zend_extension=opcache.so
opcache.enable=1
EOF
#启动php服务
systemctl daemon-reload
systemctl enable --now php-fpm.service
}
config (){
cat >> ${HTTPD_DATA}/conf/httpd.conf <<EOF
AddType application/x-httpd-php .php
ProxyRequests Off
<virtualhost *:80>
servername blog.php.local
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
#准备wordpress程序文件
cd
tar xf ${WP}
mv ${WPDATA}/ /data/
chown -R apache:apache /data/wordpress
systemctl restart httpd
}
echo "正在安装apache..."
http_install &> /dev/null && action "apache安装完成!" || { action "apache安装失败,退出!" false ;exit 1; }
echo "正在安装mysql数据库..."
mysql_install &> /dev/null && action "mysql数据库安装完成!" || { action "mysql数据库安装失败,退出!" false ;exit 2; }
echo "正在安装php..."
php_install &> /dev/null && action "php安装完成!" || { action "php安装失败,退出!" false ;exit 3; }
echo "正在准备wordpress程序文件..."
config &> /dev/null && action "配置完成,请使用wordpress!" || { action "配置失败,请检查配置文件!" false ;exit 4; }