您的位置:首页 > 运维架构 > 网站架构

LAMP架构

2020-07-16 06:03 751 查看

文章目录

  • 4. lamp自动安装脚本
  • 1. 概述

    什么是LAMP?

    • 所谓的lamp,是由
      Linux、Apache、MySQL/MariaDB、PHP/Perl/Python
      组成的一个动态网站或者服务器的开源软件
    • 除Linux外其它各部件本身都是各自独立的程序,可以安装在不同服务器之上,但是因为经常被放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的Web应用程序平台。

    各服务提供什么功能?

    • Apache 处理http的请求、构建响应报文等自身服务
    • 配置让Apache支持PHP程序的响应(通过PHP模块或FPM)
    • 配置Apache具体处理php程序的方法,如通过反向代理将php程序交给fcgi处理
  • PHP/Perl/Python
      提供apache的访问接口,即CGI或Fast CGI
    • 提供PHP程序的解释器
    • 提供mairadb数据库的连接函数的基本环境
  • MySQL/MariaDB
      提供PHP程序对数据的存储
    • 提供PHP程序对数据的读取

    2. web服务器工作流程

    如上图所示:

    1. 用户在浏览器上访问资源,浏览器通过http协议向web服务器发送访问请求
    2. 如果访问的是静态资源,则会在本地磁盘或本地缓存中找到资源然后返还给浏览器
    3. 如果访问的是动态资源,web服务器则会通过FastCGI协议向php服务器发送请求
    4. php服务器会通过FastCGI master进程,让多个FastCGI worker进程处理请求,然后将处理后的输出返还给web服务器,最后由web服务器返还给浏览器
    5. 如果web服务器请求的资源,需要查询数据库,则php服务器上的php程序通过mysql协议连接数据库,并查询资源,php服务器将查询到的资源返还给web服务器,最后web服务器将资源返还给浏览器

    什么是静态资源,什么是动态资源?

    • 静态资源就是指静态内容,客户端从服务器获得的资源的表现形式与原文件相同。可以简单的理解为就是直接存储于文件系统中的资源
    • 动态资源通常是程序文件,不是将程序文件直接返还给客户端,而是需要将程序执行后输出的结果返还给客户端,输出的结果就是动态资源

    cgi与fastcgi是什么?

    • CGI(Common Gateway Interface)通用网关接口 是一种让web服务器与应用程序进行通信的协议,用来规范web服务器传输到php解释器中的数据类型以及数据格式
    • CGI可以用任何一种具有标准输入、输出和环境变量的语言编写,如php、perl、python等,不同类型语言写的程序只要符合cgi标准,就能作为一个cgi程序与web服务器交互
  • FastCGI(Fast Common Gateway Interface)快速通用网关接口
      通用网关接口(CGI)的增强版本,主要用来提高CGI程序性能,类似于CGI,FastCGI也是一种让交互程序与Web服务器通信的协议
    • CGI是通过启用一个解释器进程来处理每个请求,耗时且耗资源,而FastCGI则是通过master-worker形式来处理每个请求
    • 启动一个master主进程,然后根据配置启动几个worker进程,当请求进来时,master会从worker进程中选择一个去处理请求,这样就避免了重复的生成和杀死进程带来的频繁cpu上下文切换而导致耗时

    httpd与php结合的方式:

    • modules:php将以httpd的扩展模块形式存在,需要加载动态资源时,httpd可以直接通过php模块来加工资源并返回给客户端 httpd prefork:libphp5.so(多进程模型的php)
    • httpd event or worker:libphp5-zts.so(线程模型的php)
  • CGI:httpd需要加载动态资源时,通过CGI与php解释器联系,获得php执行的结果,此时httpd负责与php连接的建立和断开等
  • FastCGI:利用php-fpm机制,启动为服务进程,php自行运行为一个服务,https通过socket与php通信

  • 3. LAMP平台搭建实例

    环境:

    系统 主机名 IP 服务
    CentOS 7 node1 192.168.207.129 httpd2.4、mysql5.7、php7.4

    3.1 安装httpd

    配置yum源

    下载wget:
    [root@node1 ~]# rpm -ivh http://mirror.centos.org/centos/7/os/x86_64/Packages/wget-1.14-18.el7_6.1.x86_64.rpm
    下载163的源:
    [root@node1 ~]# mv /etc/yum.repos.d/* /opt
    [root@node1 ~]# wget -O /etc/yum.repos.d/CentOS7-Base-163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
    [root@node1 ~]# ls /etc/yum.repos.d/
    CentOS7-Base-163.repo
    配置源:
    [root@node1 ~]# sed -i 's/\$releasever/7/g' /etc/yum.repos.d/CentOS7-Base-163.repo
    [root@node1 ~]# sed -i 's/^enabled=.*/enabled=1/g' /etc/yum.repos.d/CentOS7-Base-163.repo
    安装epel源:
    [root@node1 ~]# yum -y install epel-release vim

    安装开发工具包

    [root@node1 ~]# yum groups mark install 'Development Tools'

    创建apache服务的用户和组

    [root@node1 ~]# useradd -r -M -s /sbin/nologin apache
    [root@node1 ~]# id apache
    uid=997(apache) gid=995(apache) groups=995(apache)

    安装依赖包

    [root@node1 ~]# yum -y install openssl-devel pcre-devel expat-devel libtool gcc gcc-c++

    下载并解压apr和apr-util

    [root@node1 ~]# wget http://mirror.bit.edu.cn/apache/apr/apr-1.7.0.tar.gz
    [root@node1 ~]# wget http://mirror.bit.edu.cn/apache/apr/apr-util-1.6.1.tar.gz
    [root@node1 ~]# tar xf apr-1.7.0.tar.gz
    [root@node1 ~]# tar xf apr-util-1.6.1.tar.gz
    [root@node1 ~]# ls
    apr-1.7.0         apr-util-1.6.1
    apr-1.7.0.tar.gz  apr-util-1.6.1.tar.gz

    安装apr

    [root@node1 ~]# cd apr-1.7.0
    [root@node1 apr-1.7.0]# vim configure
    ...
    cfgfile=${ofile}T
    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
    $RM "$cfgfile"  //将此行注释或者删除
    ...
    [root@node1 apr-1.7.0]# ./configure --prefix=/usr/local/apr
    [root@node1 apr-1.7.0]# make && make install

    安装apr-util

    [root@node1 apr-1.7.0]# cd /root/apr-util-1.6.1
    [root@node1 apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
    [root@node1 apr-util-1.6.1]# make && make install

    下载并编译安装httpd

    [root@node1 ~]# wget https://mirror.bit.edu.cn/apache/httpd/httpd-2.4.43.tar.gz
    [root@node1 ~]# tar xf httpd-2.4.43.tar.gz
    [root@node1 ~]# cd httpd-2.4.43
    [root@node1 httpd-2.4.43]# ./configure --prefix=/usr/local/apache \
    --sysconfdir=/etc/httpd24 \
    --enable-so \
    --enable-ssl \
    --enable-cgi \
    --enable-rewrite \
    --with-zlib \
    --with-pcre \
    --with-apr=/usr/local/apr \
    --with-apr-util=/usr/local/apr-util/ \
    --enable-modules=most \
    --enable-mpms-shared=all \
    --with-mpm=prefork
    [root@node1 httpd-2.4.43]# make && make install

    配置httpd

    [root@node1 ~]# echo 'export PATH=/usr/local/apache/bin:$PATH' > /etc/profile.d/httpd.sh
    [root@node1 ~]# source /etc/profile.d/httpd.sh
    [root@node1 ~]# ln -s /usr/local/apache/include /usr/include/httpd
    [root@node1 ~]# echo 'MANPATH /usr/local/apache/man' >> /etc/man_db.conf
    [root@node1 ~]# sed -i '/#ServerName/s/#//g' /etc/httpd24/httpd.conf

    启动apache

    [root@node1 ~]# apachectl start
    [root@node1 ~]# ss -antl |grep 80
    LISTEN     0      128         :::80                      :::*

    3.2 安装mysql

    安装依赖包

    [root@node1 ~]# yum -y install ncurses-devel openssl-devel openssl cmake mariadb-devel

    创建mysql用户和组

    [root@node1 ~]# useradd -r -M -s /sbin/nologin -u 306 mysql
    [root@node1 ~]# id mysql
    uid=306(mysql) gid=306(mysql) groups=306(mysql)

    下载mysql安装包

    [root@node1 ~]# wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz

    解压至/usr/local目录中

    [root@node1 ~]# tar xf mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz -C /usr/local/

    创建软连接并配置文件属组

    [root@node1 ~]# cd  /usr/local/
    [root@node1 local]# ln -s mysql-5.7.30-linux-glibc2.12-x86_64/ mysql
    [root@node1 local]# chown -R mysql.mysql mysql*
    [root@node1 local]# ll -d mysql
    lrwxrwxrwx. 1 mysql mysql 36 Jul  6 09:39 mysql -> mysql-5.7.30-linux-glibc2.12-x86_64/

    配置环境变量

    [root@node1 ~]# echo 'export PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
    [root@node1 ~]# source /etc/profile.d/mysql.sh

    创建数据存放目录

    [root@node1 ~]# mkdir /opt/data
    [root@node1 ~]# chown -R mysql.mysql /opt/data
    [root@node1 ~]# ll -d /opt/data
    drwxr-xr-x. 2 mysql mysql 6 Jul  6 09:43 /opt/data

    初始化数据库

    [root@node1 ~]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/opt/data
    2020-07-06T13:44:51.876666Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
    2020-07-06T13:44:52.265532Z 0 [Warning] InnoDB: New log files created, LSN=45790
    2020-07-06T13:44:52.307992Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
    2020-07-06T13:44:52.370653Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: de47700e-bf8e-11ea-be6e-000c2997c366.
    2020-07-06T13:44:52.371432Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
    2020-07-06T13:44:53.460356Z 0 [Warning] CA certificate ca.pem is self signed.
    2020-07-06T13:44:53.590140Z 1 [Note] A temporary password is generated for root@localhost: P*3rieAe%#G3
    //记住这里的root用户登录的临时密码,这里是:P*3rieAe%#G3

    配置mysql

    [root@node1 ~]# ln -s /usr/local/mysql/include /usr/local/include/mysql
    [root@node1 ~]# echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf
    [root@node1 ~]# ldconfig

    生成配置文件

    [root@node1 ~]# cat > /etc/my.cnf <<EOF
    [mysqld]
    basedir = /usr/local/mysql
    datadir = /opt/data
    socket = /tmp/mysql.sock
    port = 3306
    pid-file = /opt/data/mysql.pid
    user = mysql
    skip-name-resolve
    EOF

    配置服务启动脚本

    [root@node1 ~]# cp -a /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
    [root@node1 ~]# sed -ri 's#^(basedir=).*#\1/usr/local/mysql#g' /etc/init.d/mysqld
    [root@node1 ~]# sed -ri 's#^(datadir=).*#\1/opt/data#g' /etc/init.d/mysqld

    启动mysql

    [root@node1 ~]# chkconfig mysqld on    //设置为开机自动启动
    [root@node1 ~]# service mysqld start
    [root@node1 ~]# ss -antl |grep 3306
    LISTEN     0      80          :::3306                    :::*

    修改密码

    [root@node1 ~]# mysql --connect-expired-password -uroot -p'P*3rieAe%#G3' -e "set password = password('123')"
    [root@node1 ~]# mysql -uroot -p123
    mysql> exit
    Bye

    3.3 安装php

    配置yum源

    [root@node1 ~]# wget http://rpms.remirepo.net/enterprise/remi-release-7.rpm
    [root@node1 ~]# rpm -Uvh remi-release-7.rpm
    [root@node1 ~]# yum clean all
    [root@node1 ~]# yum makecache --enablerepo=remi-php74

    安装依赖包

    [root@node1 ~]# yum -y install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libcurl libcurl-devel libicu-devel libjpeg libjpeg-devel libpng libpng-devel openldap-devel  pcre-devel freetype freetype-devel gmp gmp-devel libmcrypt libmcrypt-devel readline readline-devel libxslt libxslt-devel mhash mhash-devel php74-php-mysqlnd

    下载并安装php

    [root@node1 ~]# wget https://www.php.net/distributions/php-7.4.7.tar.gz
    [root@node1 ~]# tar xf php-7.4.7.tar.gz
    [root@node1 ~]# cd php-7.4.7
    [root@node1 ~]# ./configure --prefix=/usr/local/php7  \
    --with-config-file-path=/etc \
    --enable-fpm \
    --enable-inline-optimization \
    --disable-debug \
    --disable-rpath \
    --enable-shared \
    --enable-soap \
    --with-openssl \
    --enable-bcmath \
    --with-iconv \
    --with-bz2 \
    --enable-calendar \
    --with-curl \
    --enable-exif  \
    --enable-ftp \
    --enable-gd \
    --with-jpeg \
    --with-png \
    --with-zlib-dir \
    --with-freetype \
    --with-gettext \
    --enable-json \
    --enable-mbstring \
    --enable-pdo \
    --with-mysqli=mysqlnd \
    --with-pdo-mysql=mysqlnd \
    --with-readline \
    --enable-shmop \
    --enable-simplexml \
    --enable-sockets \
    --enable-zip \
    --enable-mysqlnd-compression-support \
    --with-pear \
    --enable-pcntl \
    --enable-posix
    //这里如果报错需要安装两个依赖包,安装好后再次执行上面的命令
    [root@node1 php-7.4.7]# yum -y install libsqlite3x-devel
    [root@node1 php-7.4.7]# yum -y install oniguruma-devel

    编译并安装

    //-j指定内核数,后面的命令取出内核数量,多核的执行此条命令编译速度比单核的要快
    [root@node1 php-7.4.7]# make -j $(cat /proc/cpuinfo |grep processor|wc -l)
    [root@node1 php-7.4.7]# make install

    配置环境变量

    [root@node1 ~]# echo 'export PATH=/usr/local/php7/bin:$PATH' > /etc/profile.d/php7.sh
    [root@node1 ~]# source /etc/profile.d/php7.sh
    [root@node1 ~]# php -v
    PHP 7.4.7 (cli) (built: Jul  6 2020 10:33:25) ( NTS )
    Copyright (c) The PHP Group
    Zend Engine v3.4.0, Copyright (c) Zend Technologies

    配置php-fpm

    [root@node1 ~]# cp php-7.4.7/php.ini-production /etc/php.ini
    [root@node1 ~]# cp php-7.4.7/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
    [root@node1 ~]# chmod +x /etc/rc.d/init.d/php-fpm
    [root@node1 ~]# cp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf
    [root@node1 ~]# cp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf
    [root@node1 ~]# vim /usr/local/php7/etc/php-fpm.conf
    //添加以下四行
    pm.max_children = 50       //最多同时提供50个进程提供50个并发服务
    pm.start_servers = 5       //启动时启动5个进程
    pm.min_spare_servers = 2   //最小空闲进程数
    pm.max_spare_servers = 8   //最大空闲进程数

    启动php-fpm

    [root@node1 ~]# service php-fpm start
    Starting php-fpm  done
    [root@node1 ~]# chkconfig php-fpm on
    [root@node1 ~]# ss -antl |grep 9000
    LISTEN     0      128    127.0.0.1:9000                     *:*

    配置监听所有IP

    [root@node1 ~]# vim /usr/local/php7/etc/php-fpm.d/www.conf
    ;   '/path/to/unix/socket' - to listen on a unix socket.
    ; Note: This value is mandatory.
    listen = 127.0.0.1:9000     `//将这里的127.0.0.1改为0.0.0.0`
    [root@node1 ~]# service php-fpm restart
    Gracefully shutting down php-fpm . done
    Starting php-fpm  done
    [root@node1 ~]# ss -antl |grep 9000
    LISTEN     0      128          *:9000                     *:*

    3.4 配置apache

    启用代理模块

    [root@node1 ~]# sed -i '/proxy_module/s/#//g' /etc/httpd24/httpd.conf
    [root@node1 ~]# sed -i '/proxy_fcgi_module/s/#//g' /etc/httpd24/httpd.conf

    配置虚拟主机

    [root@node1 ~]# cd /usr/local/apache/htdocs/
    [root@node1 htdocs]# mkdir game.com
    [root@node1 htdocs]# chown -R apache.apache /usr/local/apache/htdocs/
    
    //编辑主配置文件
    [root@node1 ~]# vim /etc/httpd24/httpd.conf
    ...
    # probably should define those extensions to indicate media types:
    #
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddType application/x-httpd-php .php          //添加此行
    AddType application/x-httpd-php-source .phps  //添加此行
    ....
    //在最后添加以下内容
    <VirtualHost *:80>
    DocumentRoot "/usr/local/apache/htdocs/game.com"
    ServerName game.com
    ProxyRequests Off     //关闭正向代理
    ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/usr/local/apache/htdocs/game.com/$1
    <Directory "/usr/local/apache/htdocs/game.com">
    Options none
    AllowOverride none
    Require all granted
    </Directory>
    </VirtualHost>
    [root@node1 ~]# sed -i '/    DirectoryIndex/s/index.html/index.php index.html/g' /etc/httpd24/httpd.conf

    配置网站文件

    [root@node1 ~]# cd game/zytd/WWW/
    [root@node1 WWW]# ls
    class  game      game - 副本.php  index.php         js   pay      reguser.php
    css    game.php  images           index - 副本.php  npc  pdo.php  renwu
    [root@node1 WWW]# vim pdo.php
    <?php
    $sqlname='root';      //这里改为自己的数据库登录用户
    $sqlpass='123';       //数据库登录密码
    $dbhost='localhost';  //数据库登录IP
    $dbname='game';       //数据库名称
    [root@node1 WWW]# mv * /usr/local/apache/htdocs/game.com/
    [root@node1 WWW]# mysql -uroot -p123
    mysql> create database game;
    mysql> use game;
    mysql> source /root/game/zytd/game.sql;
    mysql> exit
    Bye

    重启apache和mysql服务

    [root@node1 ~]# service mysqd restart
    [root@node1 ~]# apachectl stop
    [root@node1 ~]# apachectl start
    [root@node1 ~]# ss -antl |grep 80
    LISTEN     0      80          :::3306                    :::*
    LISTEN     0      128         :::80                      :::*

    3.5 访问验证

    修改hosts文件,添加域名:

    访问验证:

    4. lamp自动安装脚本

    执行脚本前需要下载install目录中的安装包

    //查看脚本目录,lamp.sh是安装脚本,install目录是安装包存放目录
    [root@node2 lamp]# ls
    install  lamp.sh
    [root@node2 lamp]# ls install/
    apr-1.7.0.tar.gz
    apr-util-1.6.1.tar.gz
    httpd-2.4.43.tar.gz
    mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz
    php-7.4.7.tar.gz
    remi-release-7.rpm
    wget-1.14-18.el7_6.1.x86_64.rpm
    
    //查看安装脚本
    [root@node2 lamp]# cat lamp.sh
    #!/bin/bash
    
    #定义apache安装路径
    apache_install=/usr/local/apache
    #定义mysql安装路径
    mysql_install=/usr/local
    #定义数据存放目录
    datadir=/opt/data
    #定义数据登录密码
    passwd=123
    #定义php安装路径
    php_install=/usr/local/php7
    #定义虚拟主机目录
    vh_dir=$apache_install/htdocs/game
    
    #关闭防火墙和selinux
    systemctl stop firewalld
    setenforce 0
    
    #安装wget
    rpm -ivh install/wget-1.14-18.el7_6.1.x86_64.rpm &>/dev/null
    #配置yum源
    mv /etc/yum.repos.d/* /opt
    wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo &>/dev/null
    sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
    yum clean all &>/dev/null
    #安装epel源
    echo '正在安装epel源和开发工具包...'
    yum -y install vim &>/dev/null
    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo &>/dev/null
    
    #安装开发工具包
    yum clean all &>/dev/null
    yum groups mark install 'Development Tools' &>/dev/null
    if [ $? -ne 0 ];then
    echo '安装失败'
    exit
    fi
    
    #创建apache服务的用户和组
    id apache &>/dev/null
    if [ $? -ne 0 ];then
    useradd -r -M -s /sbin/nologin apache
    fi
    
    #安装依赖包
    echo '正在安装依赖包...'
    yum -y install openssl-devel pcre-devel expat-devel libtool gcc gcc-c++ &>/dev/null
    
    #解压并安装apr和apr-util
    if [ ! -d /usr/local/apr ];then
    tar xf install/apr-1.7.0.tar.gz
    cd apr-1.7.0
    sed -ri '/^(....\$RM."\$cfgfile")$/d' configure
    echo '正在编译安装apr...'
    ./configure --prefix=/usr/local/apr &>/dev/null
    make &>/dev/null
    make install &>/dev/null
    if [ $? -ne 0 ];then
    echo "apr安装失败"
    exit
    fi
    cd ..
    fi
    if [ ! -d /usr/local/apr-util ];then
    tar xf install/apr-util-1.6.1.tar.gz
    cd apr-util-1.6.1
    echo '正在编译安装apr-util...'
    ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr &>/dev/null
    make &>/dev/null
    make install &>/dev/null
    if [ $? -ne 0 ];then
    echo "apr-util安装失败"
    exit
    fi
    cd ..
    fi
    
    #解压并安装httpd
    if [ ! -d $apache_install ];then
    tar xf install/httpd-2.4.43.tar.gz
    cd httpd-2.4.43
    echo '正在编译安装httpd...'
    ./configure --prefix=${apache_install} \
    --sysconfdir=/etc/httpd24 \
    --enable-so \
    --enable-ssl \
    --enable-cgi \
    --enable-rewrite \
    --with-zlib \
    --with-pcre \
    --with-apr=/usr/local/apr \
    --with-apr-util=/usr/local/apr-util/ \
    --enable-modules=most \
    --enable-mpms-shared=all \
    --with-mpm=prefork &>/dev/null
    make &>/dev/null
    make install &>/dev/null
    if [ $? -ne 0 ];then
    echo "apr-util安装失败"
    exit
    fi
    cd ..
    fi
    
    #配置httpd
    echo "export PATH=${apache_install}/bin:\$PATH" > /etc/profile.d/httpd.sh
    ln -s ${apache_install}/include/ /usr/include/httpd
    grep 'MANPATH /usr/local/apache/man' /etc/man_db.conf &>/dev/null
    if [ $? -ne 0 ];then
    echo 'MANPATH /usr/local/apache/man' >> /etc/man_db.conf
    fi
    sed -i '/#ServerName/s/#//g' /etc/httpd24/httpd.conf
    
    #启动apache
    ${apache_install}/bin/apachectl start &>/dev/null
    grep "${apache_install}/bin/apachectl start" /etc/rc.local
    if [ $? -ne 0 ];then
    echo "${apache_install}/bin/apachectl start" >> /etc/rc.local
    fi
    chmod +x /etc/rc.d/rc.local
    ss -antl |grep 80 &>/dev/null
    if [ $? -ne 0 ];then
    echo 'apache服务安装失败'
    exit
    else
    echo 'apache服务安装成功'
    fi
    
    #安装mysql依赖包
    yum -y install ncurses-devel openssl-devel openssl cmake mariadb-devel &>/dev/null
    
    #创建mysql用户和组
    id mysql &>/dev/null
    if [ $? -ne 0 ];then
    useradd -r -M -s /sbin/nologin -u 306 mysql
    fi
    
    #安装mysql
    echo '正在安装mysql...'
    if [ ! -d $mysql_install/mysql-5.7.30-linux-glibc2.12-x86_64 ];then
    mkdir -p $mysql_install
    tar xf install/mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz -C $mysql_install
    fi
    
    #创建软连接,并设置属主和属组
    ln -s $mysql_install/mysql-5.7.30-linux-glibc2.12-x86_64 $mysql_install/mysql
    chown -R mysql.mysql $mysql_install/mysql*
    
    #配置环境变量
    echo "export PATH=${mysql_install}/mysql/bin:\$PATH" > /etc/profile.d/mysql.sh
    
    #配置数据存放目录
    mkdir -p $datadir &>/dev/null
    chown -R mysql.mysql $datadir
    
    #初始化数据库
    wc=$(ls $datadir |wc -l)
    if [ $wc -eq 0 ];then
    echo '正在初始化数据库...'
    $mysql_install/mysql/bin/mysqld --initialize-insecure --user=mysql --datadir=$datadir &>/dev/null
    fi
    
    #配置mysql
    ln -s $mysql_install/mysql/include/ $mysql_install/include/mysql
    echo "${mysql_install}/mysql/lib" > /etc/ld.so.conf.d/mysql.conf
    ldconfig
    
    #生成配置文件
    cat > /etc/my.cnf <<EOF
    [mysqld]
    basedir = $mysql_install/mysql
    datadir = $datadir
    socket = /tmp/mysql.sock
    port = 3306
    pid-file = $datadir/mysql.pid
    user = mysql
    skip-name-resolve
    EOF
    
    #配置服务启动脚本
    \cp -a $mysql_install/mysql/support-files/mysql.server /etc/init.d/mysqld
    sed -ri "s#^(basedir=).*#\1${mysql_install}/mysql#g" /etc/init.d/mysqld
    sed -ri "s#^(datadir=).*#\1${datadir}#g" /etc/init.d/mysqld
    
    #启动mysql
    chkconfig mysqld on &>/dev/null
    service mysqld start &>/dev/null
    $mysql_install/mysql/bin/mysql -uroot -e "set password = password('$passwd')" &>/dev/null
    ss -antl |grep 3306 &>/dev/null
    if [ $? -ne 0 ];then
    echo 'mysql服务启动失败'
    exit
    else
    echo "数据库安装成功,登录密码为$passwd"
    fi
    
    #配置安装php依赖包的yum源
    echo '开始安装php,正在配置yum源...'
    yum -y localinstall install/remi-release-7.rpm &>/dev/null
    yum clean all &>/dev/null
    yum makecache --enablerepo=remi-php74 &>/dev/null
    
    #安装依赖包
    echo '正在安装依赖包...'
    yum -y install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libcurl libcurl-devel libicu-devel libjpeg libjpeg-devel libpng libpng-devel openldap-devel  pcre-devel freetype freetype-devel gmp gmp-devel libmcrypt libmcrypt-devel readline readline-devel libxslt libxslt-devel mhash mhash-devel php74-php-mysqlnd &>/dev/null
    
    #编译并安装php
    if [ ! -d $php_install ];then
    echo '正在编译安装php...'
    tar xf install/php-7.4.7.tar.gz
    yum -y install libsqlite3x-devel oniguruma-devel &>/dev/null
    cd php-7.4.7
    ./configure --prefix=/usr/local/php7  \
    --with-config-file-path=/etc \
    --enable-fpm \
    --enable-inline-optimization \
    --disable-debug \
    --disable-rpath \
    --enable-shared \
    --enable-soap \
    --with-openssl \
    --enable-bcmath \
    --with-iconv \
    --with-bz2 \
    --enable-calendar \
    --with-curl \
    --enable-exif  \
    --enable-ftp \
    --enable-gd \
    --with-jpeg \
    --with-png \
    --with-zlib-dir \
    --with-freetype \
    --with-gettext \
    --enable-json \
    --enable-mbstring \
    --enable-pdo \
    --with-mysqli=mysqlnd \
    --with-pdo-mysql=mysqlnd \
    --with-readline \
    --enable-shmop \
    --enable-simplexml \
    --enable-sockets \
    --enable-zip \
    --enable-mysqlnd-compression-support \
    --with-pear \
    --enable-pcntl \
    --enable-posix &>/dev/null
    make -j $(cat /proc/cpuinfo |grep processor|wc -l) &>/dev/null
    make install &>/dev/null
    if [ $? -ne 0 ];then
    echo 'php安装失败'
    exit
    else
    echo 'php安装成功'
    fi
    cd ..
    fi
    
    echo "export PATH=${php_install}/bin:\$PATH" > /etc/profile.d/php7.sh
    
    #配置php-fpm
    \cp php-7.4.7/php.ini-production /etc/php.ini
    \cp php-7.4.7/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
    chmod +x /etc/rc.d/init.d/php-fpm
    \cp ${php_install}/etc/php-fpm.conf.default ${php_install}/etc/php-fpm.conf
    \cp ${php_install}/etc/php-fpm.d/www.conf.default ${php_install}/etc/php-fpm.d/www.conf
    grep 'pm.max_children = 50' ${php_install}/etc/php-fpm.conf &>/dev/null
    if [ $? -ne 0 ];then
    cat >> ${php_install}/etc/php-fpm.conf <<EOF
    pm.max_children = 50
    pm.start_servers = 5
    pm.min_spare_servers = 2
    pm.max_spare_servers = 8
    EOF
    fi
    
    #启动php-fpm
    service php-fpm start &>/dev/null
    chkconfig php-fpm on &>/dev/null
    ss -antl |grep 9000 &>/dev/null
    if [ $? -ne 0 ];then
    echo 'php-fpm启动失败'
    fi
    
    #配置9000端口监听所有IP
    sed -i 's/listen = 127.0.0.1:9000/listen = 0.0.0.0:9000/' ${php_install}/etc/php-fpm.d/www.conf
    service php-fpm restart &>/dev/null
    
    #启动代理模块
    sed -i '/proxy_module/s/#//g' /etc/httpd24/httpd.conf
    sed -i '/proxy_fcgi_module/s/#//g' /etc/httpd24/httpd.conf
    
    #配置虚拟主机
    mkdir -p $vh_dir
    chown -R apache.apache $apache_install/htdocs
    cat > $vh_dir/index.php <<EOF
    <?php
    phpinfo();
    ?>
    EOF
    grep "$vh_dir" /etc/httpd24/httpd.conf
    if [ $? -ne 0 ];then
    sed -ir '/    AddType application\/x-gzip .gz .tgz/a \    AddType application/x-httpd-php-source .phps' /etc/httpd24/httpd.conf
    sed -ir '/    AddType application\/x-gzip .gz .tgz/a \    AddType application/x-httpd-php .php' /etc/httpd24/httpd.conf
    sed -i '/    DirectoryIndex/s/index.html/index.php index.html/g' /etc/httpd24/httpd.conf
    cat >> /etc/httpd24/httpd.conf <<EOF
    <VirtualHost *:80>
    DocumentRoot "$vh_dir"
    ServerName game.com
    ProxyRequests Off
    ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000$vh_dir/$1
    <Directory "$vh_dir">
    Options none
    AllowOverride none
    Require all granted
    </Directory>
    </VirtualHost>
    EOF
    fi
    
    #重启apache服务
    /usr/local/apache/bin/apachectl restart &>/dev/null
    
    #判断服务是否启动成功
    lamp_port=ss -antl |grep -E '80|3306|9000' |wc -l
    if [ $lamp_port -eq 3 ];then
    echo 'lamp架构搭建完成'
    else
    echo '服务启动失败'
    fi
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: