编译安装基于 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) 编辑 收藏 举报