ITPub博客

首页 > 数据库 > 数据库开发技术 > Linux云计算-17_Linux Web服务器之LAMP企业架构实战

Linux云计算-17_Linux Web服务器之LAMP企业架构实战

原创 数据库开发技术 作者:shuchaoyang 时间:2021-08-30 08:30:00 36 删除 编辑

Linux下LAMP(Linux+Apache+MySQL/MariaDB+Perl/PHP/Python)是一组用来搭建动态网站的开源软件架构,本身是各自独立的软件服务,放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的Web应用程序平台。

本章向读者介绍互联网主流企业架构LAMP应用案例、PHP解释性语言详解、LAMP组合通信原理、LAMP企业源码架设、LAMP拓展及使用Redis提升LAMP性能优化等。

1.1  LAMP企业架构简介

随着开源潮流的蓬勃发展,开放源代码的LAMP已经与J2EE和.Net商业软件形成三足鼎立之势,并且该软件开发的项目在软件方面的投资成本较低,因此受到整个IT界的关注。LAMP架构受到大多数中小企业的运维、DBA、程序员的青睐,Apache默认只能发布静态网页,而LAMP组合可以发布静态+PHP动态页面。

静态页面通常指不与数据库发生交互的页面,是一种基于w3c规范的一种网页书写格式,是一种统一协议语言,所以称之为静态网页。静态页面被设计好之后,一般很少去修改,不随着浏览器参数改变而内容改变,需注意的是动态的图片也是属于静态文件。从SEO角度来讲,HTML页面更有利于搜索引擎的爬行和收录。常见的静态页面以.html、.gif、.jpg、.jpeg、.bmp、.png、.ico、.txt、.js、.css等结尾。

动态页面通常指与数据库发生交互的页面,内容展示丰富,功能非常强大,实用性广。从SEO角度来讲,搜索引擎很难全面的爬行和收录动态网页,因为动态网页会随着数据库的更新、参数的变更而发生改变,常见的动态页面以.jsp、.php、.do、.asp、.cgi、.apsx等结尾。

1.2  Apache与PHP工作原理

LAMP企业主流架构最重要的三个环节,一是Apache Web服务器,二是PHP(PHP: Hypertext Preprocessor),三是MySQL数据库。

Apache Web服务器主要是基于多模块工作,依赖PHP SAPI处理方式中的PHP_MODULE去解析PHP结尾的文件,如图1-1所示:

PHP是一种适用于Web开发的动态语言,PHP语言内核基于C语言实现包含大量组件的软件框架,是一种功能强大的解释型脚本语言。PHP底层运行机制如图所示:

PHP底层工作原理包括4个部分:

  • Zend引擎

属于PHP内核部分,它负责将PHP代码解析为可执行opcode的处理并实现相应的处理方法、实现基本的数据结构、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕Zend实现。

  • Extensions

围绕着Zend引擎,Extensions通过组件的方式提供各种基础服务,各种内置函数、标准库等都是通过Extension来实现。

  • SAPI

服务端应用编程接口(Server Application Programming Interface,SAPI),SAPI通过一系列钩子函数,基于SAPI可以让PHP与外部进行数据交互。

常见的SAPI编程接口处理方法包括:apache2handler:以apache作为webserver,采用MOD_PHP模式运行时候的处理方式;cgi:webserver和PHP直接的另一种交互方式,FastCGI协议;cli:命令行调用的应用模式。

  • APP代码应用

又称之为PHP代码程序,基于SAPI接口生成不同的应用模式,从而被PHP引擎解析。

当用户在浏览器地址中输入域名或者域名+PHP页面,向HTTP Web服务器Apache发起HTTP请求,Web服务器接受该请求,并根据其后缀判断如果请求的页面是以.php结尾,Web服务器从硬盘或者内存中取出该PHP文件,将其发送给PHP引擎程序。

PHP引擎程序将会对Web服务器传送过来的文件进行扫描并根据命令从后台读取、处理数据、并动态地生成相应的HTML页面。然后PHP引擎程序将生成的HTML页面返回给Web服务器,最终Web服务器将HTML页面返回给客户端浏览器,浏览器基于MIME类型进行解析展示给用户页面。

1.3  LAMP企业安装配置

构建LAMP架构有两种方法,一是使用yum在线安装,另外一种是基于LAMP源码编译安装,yum在线安装方法如下:

# yum install httpd httpd-devel mysql mysql-server mysql-devel php php-devel php-mysql -y
# systemctl restart httpd
# systemctl restart mariadb

yum方式安装简单、快捷,但如果需要添加扩展的功能和模块,需使用源码包的方式来编译安装LAMP。如下为LAMP源码编译安装的步骤:

1.3.1 Apache源码编译安装

1.3.1.1 Apache安装前准备

  1. 关闭防火墙

# systemctl stop firewalld && systemctl disable firewalld

  1. 临时关闭selinux

# setenforce 0

  1. 永久关闭selinux

# sed -i 's/=enforcring/=disabled/' /etc/selinux/config

1.3.1.2 Apache安装依赖包

# yum install gcc gcc-c++ ncurses-devel ncurses pcre pcre-devel openssl-devel zlib-devel expat-devel -y

1.3.1.3 Apache下载源码包

下载目前稳定版本httpd-2.4.48版本及相关apr。

# wget https://mirrors.tuna.tsinghua.edu.cn/apache/httpd/httpd-2.4.48.tar.gz
# wget https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-1.7.0.tar.gz
# wget https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-util-1.6.1.tar.gz

1.3.1.4 批量解压apr,apr-util,httpd安装包

# for z in apr-1.7.0.tar.gz apr-util-1.6.1.tar.gz httpd-2.4.48.tar.gz; do tar xf $z; done

1.3.1.5 将apr和apr-util源码与httpd源码合并

# cp -ar ./apr-1.7.0 ./httpd-2.4.48/srclib/apr
# cp -ar ./apr-util-1.6.1 ./httpd-2.4.48/srclib/apr-util

1.3.1.6 Apache编译安装

# cd httpd-2.4.48
# ./configure \
--prefix=/usr/local/apache2 \
--sysconfdir=/etc/apache2/conf \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--enable-zlib \
--enable-pcre \
--with-included-apr \
--with-mpm=event \
--enable-deflate \
--enable-mpms-shared=all \
--enable-modules=all
# make && make install

1.3.1.7 Apache安装后配置

  1. 创建用户

# useradd -s /sbin/nologin -r apache

  1. 指定运行httpd的用户

编辑httpd.conf配置文件,修改默认用户和组daemon为apache

# sed -ri.bak.`date +%F` 's/^User.*/User apache/' /etc/apache2/conf/httpd.conf
# sed -i 's/^Group.*/Group apache/' /etc/apache2/conf/httpd.conf

  1. 配置环境变量

# echo 'PATH=/usr/local/apache2/bin:$PATH' > /etc/profile.d/httpd.sh && . /etc/profile.d/httpd.sh

  1. 运行Apache服务并设为开机启动

a.创建服务

通用配置创建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
ExecStart=/usr/local/apache2/bin/apachectl start
ExecReload=/usr/local/apache2/bin/apachectl graceful
ExecStop=/usr/local/apache2/bin/apachectl stop
KillSignal=SIGCONT
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF

b.设置开机启动

# systemctl daemon-reload && systemctl enable --now httpd.service

1.3.1.8 测试Apache是否正常工作

  1. 查看Apache版本

# httpd -v
# httpd -V

  1. 查看Apache服务运行状态

# systemctl status httpd

  1. 查看Apache端口开启状态

# ss -ntl | grep 80

  1. 测试Apache网页

yum安装默认网站根目录在 /var/www/html/index.html编译安装默认网站根目录在/安装目录/htdocs/index.html

a. 本机测试

# curl -I 127.0.0.1
# curl 127.0.0.1

b. 其它linux主机测试

# curl -I 192.168.1.181
# curl 192.168.1.181

c. 浏览器访问

输入Linux主机IP地址即可访问

1.3.2 MySQL数据库源码编译安装

基于MySQL 5.7编译安装,通过cmake、make、make install三个步骤实现。

1.3.2.1 MySQL安装前准备

  1. 因为CentOS系统自带了mariadb,我们需要把它先卸载。

# rpm -qa|grep mariadb
# yum remove mariadb mariadb-server mariadb-libs -y

  1. 创建用户

# useradd -s /sbin/nologin -M mysql      # 如果提示mysql已存在可以忽略此步骤

  1. 创建目录并修改权限

# mkdir -p /data/mysql
# chown -R mysql.mysql /data

  1. 安装MySQL相关依赖包

# yum install -y gcc gcc-devel gcc-c++ gcc-c++-devel libaio* autoconf* automake* zlib* libxml* ncurses-devel ncurses libgcrypt* libtool* cmake openssl openssl-devel bison bison-devel perl-Data_Dumper boost boost-doc boost-devel

  1. 下载源码并解压

# cd /usr/src/
# wget https://mirrors.tuna.tsinghua.edu.cn/mysql/downloads/MySQL-5.7/mysql-5.7.35.tar.gz
# ls
# tar xf mysql-5.7.35.tar.gz
# cd mysql-5.7.35/

  1. 下载boost(5.7版本更新之后有很多变化,比如现在安装必须要安装这个boost库了)

# mkdir ./boost
# cd ./boost
# wget https://mirrors.tuna.tsinghua.edu.cn/mysql/downloads/MySQL-5.7/mysql-boost-5.7.35.tar.gz

说明:解压等操作编译的时候程序会做,这里只需把包下载或者拷贝到这里即可。

1.3.2.2 MySQL编译安装

  1. 编译

# cd ../
# cmake \
-DBUILD_CONFIG=mysql_release \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/mysql \
-DSYSCONFDIR=/etc \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DSYSTEMD_PID_DIR=/data/mysql \
-DMYSQL_USER=mysql \
-DWITH_SYSTEMD=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DMYSQL_TCP_PORT=3306 \
-DENABLED_LOCAL_INFILE=1 \
-DENABLE_DOWNLOADS=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_DEBUG=0 \
-DMYSQL_MAINTAINER_MODE=0 \
-DWITH_SSL:STRING=system \
-DWITH_ZLIB:STRING=bundled \
-DDOWNLOAD_BOOST=1 \
-DWITH_BOOST=./boost

  1. 编译参数介绍

cmake \
-DBUILD_CONFIG=mysql_release \ #此选项使用Oracle使用的相同构建选项配置源分发,以生成官方MySQL版本的二进制分发。
-DCMAKE_BUILD_TYPE=RelWithDebInfo \ #要生成的构建类型 = 启用优化并生成调试信息。这是默认的MySQL构建类型。
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ #选项表示基本安装目录。
-DMYSQL_DATADIR=/data/mysql \ #MySQL数据目录的位置。
-DSYSCONFDIR=/etc \ #默认my.cnf选项文件目录。
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ #服务器侦听套接字连接的Unix套接字文件路径。这必须是绝对路径名。默认是/tmp/mysql.sock。
-DSYSTEMD_PID_DIR=/usr/local/mysql \ #当MySQL由systemd管理时,在其中创建PID文件的目录的名称。默认是 /var/run/mysqld; 这可能会根据INSTALL_LAYOUT值隐式更改 。
-DMYSQL_USER=mysql \ #指定MySQL的启动用户
-DWITH_SYSTEMD=1 \ #安装systemd支持文件
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DMYSQL_TCP_PORT=3306 \ #配置 MySQL 监听的端口号
-DENABLED_LOCAL_INFILE=1 \ #使mysql客户端具有load data infile的功能,该功能具有安全隐患 load data infile语句从一个文本文件中以很高的速度读入一个表
-DENABLE_DOWNLOADS=1 \ #googlemock发行版的路径,用于基于Google Test的单元测试。=1,CMake将从GitHub下载发行版。
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \ #服务器字符集
-DDEFAULT_COLLATION=utf8_general_ci \ #服务器排序规则
-DWITH_DEBUG=0 \ #不包含调试支持。
-DMYSQL_MAINTAINER_MODE=0 \ #是否启用MySQL维护者特定的开发环境。如果启用,此选项会导致编译器警告变为错误。
-DWITH_SSL:STRING=system \
-DWITH_ZLIB:STRING=bundled \
-DDOWNLOAD_BOOST=1 \ #是否下载Boost库。默认是OFF。
-DWITH_BOOST=./boost #指定Boost库目录位置。
  1. 查看编译是否有异常

# echo $?              #返回结果为0说明编译无异常

  1. 源码安装

# make && make install

这个过程比较漫长,耐心等待一下,

  1. 查看安装是否有异常

# echo $?              #返回结果为0说明编译无异常

1.3.2.4 MySQL安装后配置

  1. 添加systemd服务控制

# cp ./scripts/mysqld.service /usr/lib/systemd/system

  1. 添加环境变量

# cat > /etc/profile.d/mysql.sh << EOF 
PATH=/usr/local/mysql/bin:$PATH
export PATH
EOF
# source /etc/profile

  1. 空密码初始化数据库

# /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql

  1. 配置MySQL启动

# systemctl daemon-reload && systemctl enable --now mysqld.service
# systemctl status mysqld.service

1.3.3 PHP源码编译安装

1.3.3.1 安装PHP依赖环境

# yum install epel-release -y
# yum install gd gd-devel curl curl-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libcurl libcurl-devel gmp gmp-devel readline readline-devel libxslt libxslt-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel ncurses gdbm-devel libXpm-devel libX11-devel expat-devel xmlrpc-c xmlrpc-c-devel libicu-devel libmemcached-devel sqlite-devel oniguruma oniguruma-devel -y

1.3.3.2 PHP编译安装

  1. 下载php

# cd /usr/src
# wget https://www.php.net/distributions/php-7.4.20.tar.gz

  1. 新增用户组,用户,用于编译使用

# useradd -s /sbin/nologin -r www

  1. 解压包

# tar xf php-7.4.20.tar.gz
# cd php-7.4.20

  1. 预编译

 # ./configure \
--prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--with-apxs2=/usr/local/apache2/bin/apxs \
--with-fpm-user=www \
--with-fpm-group=www \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-curl \
--enable-gd \
--with-gettext \
--with-iconv-dir \
--with-kerberos \
--with-libdir=lib64 \
--with-mysqli \
--with-openssl \
--with-pdo-mysql \
--with-pdo-sqlite \
--with-pear \
--with-xmlrpc \
--with-xsl \
--with-zlib \
--with-bz2 \
--with-mhash \
--enable-fpm \
--enable-bcmath \
--enable-inline-optimization \
--enable-mbregex \
--enable-mbstring \
--enable-opcache \
--enable-pcntl \
--enable-shmop \
--enable-soap \
--enable-sockets \
--enable-sysvsem \
--enable-sysvshm \
--enable-xml \
--enable-fpm
# echo $?

  1. 编译、安装

# make && make install
# echo $?

1.3.3.3 PHP安装后配置

  1. 添加环境变量

# cat > /etc/profile.d/php.sh << EOF 
PATH=/usr/local/php/bin:$PATH
export PATH
EOF
# source /etc/profile

  1. 生成php配置文件

# cp php.ini-development /usr/local/php/etc/php.ini
# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
# cp /usr/local/php/etc/php-fpm.d/.default /usr/local/php/etc/php-fpm.d/

  1. 配置php启动脚本

# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
# chmod +x /etc/init.d/php-fpm

  1. 启动php-fpm

# sed -ri.bak.`date +%F` 's#;pid = run/php-fpm.pid#pid = run/php-fpm.pid#g' /usr/local/php/etc/php-fpm.conf
# echo "[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target

[Service]
Type=forking
PIDFile=/usr/local/php/var/run/php-fpm.pid
ExecStart=/usr/local/php/sbin/php-fpm
ExecReload=/bin/kill -USR2 $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target" > /usr/lib/systemd/system/php-fpm.service
# systemctl daemon-reload && systemctl enable --now php-fpm.service
# systemctl status php-fpm.service

  1. 检查安装的php版本

1.3.4 Apache+PHP源码整合

PHP需与Apache、MySQL进行整合,如图1-3所示,参数命令如下:

为了能让Apache发布PHP页面,需要将PHP安装完成后的libphp7.so模块与Apache进行整合,vim /etc/apache2/conf/httpd.conf编辑配置文件,加入如下代码:

# vim /etc/apache2/conf/httpd.conf
AddType application/x-httpd-php .php
DirectoryIndex index.php index.html index.htm

1.3.5 测试Apache+PHP环境

创建PHP测试页面,在/usr/local/apache/htdocs目录下创建index.php测试页面,执行如下命令自动创建:


# cat > /usr/local/apache2/htdocs/index.php << EOF
<?php
phpinfo();
?>
EOF
# systemctl restart httpd.service

重新启动Apache服务,浏览器输入Apache Web IP/index.php访问,如图所示,即代表LAMP源码环境整合成功。

1.3.6 Discuz PHP论坛安装

LAMP源码整合完毕之后,Discuz官网下载Discuz开源PHP软件包,将软件包解压并发布在Apache Htdocs发布目录,代码如下:

# cd /usr/src
# rz
# unzip Discuz_X3.4_SC_UTF8_20210630.zip -d /usr/local/apache2/htdocs/
# cd /usr/local/apache2/htdocs/;\mv upload/* .
# chmod 757 -R data/ uc_server/ config/ uc_client/

通过浏览器访问Apache Web IP/index.php,如图所示,选择“我同意”

进入如图1-6界面,数据库安装,如果不存在则需要新建数据库并授权。

MySQL数据库命令行中创建PHP连接MySQL的数据库、用户及密码,命令如下:

mysql> create database discuz charset=utf8;  
mysql> grant all on discuz.* to root@'localhost' identified by "123456";

单击下一步,点击《您的论坛已完成安装,点此访问》

1.4  LAMP企业架构拓展实战

如上LAMP服务均安装至单台服务器,随着用户访问量不断的增加,单台服务器压力逐渐增加,那如何优化LAMP架构,如何拆分LAMP架构呢,怎么把Apache和MySQL分开放在不同的机器呢。

LAMP架构拆分的目的在于缓解单台服务器的压力,可以将PHP、MySQL单独安装至多台服务器,本节将实现LAP+MySQL的架构,也即是把MySQL单独拆分出去。部署方法有两种:

1.4.1 yum安装LAMP多机方案

在Apache Web服务器只需执行如下代码:

# yum install httpd httpd-devel php php-devel php-mysql -y  

在MySQL数据库服务器只需执行如下代码:

# yum install mysql-server mysql mysql-devel mysql-libs -y  

1.4.2 源码安装LAMP多机方案

源码安装LAMP多机方式,Apache Web服务与MySQL数据库服务分别部署在不同的服务器即可,PHP与Apache服务部署在一台服务器,PHP编译参数时加入如下代码进行LAMP的整合,mysqlnd为PHP远程连接MySQL数据库服务器的一种方式:

# ./configure \
--prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--with-apxs2=/usr/local/apache2/bin/apxs \
--with-fpm-user=www \
--with-fpm-group=www \
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd
# make && make install


欢迎关注我的微信公众号【超哥的IT私房菜】获取更多技术干货!

有什么吐槽或反馈意见,直接告诉我!

我会解决您说的问题,进一步更好的服务您哦!

温馨提示:如出现二维码失效也可直接添加微信号:ysc13803862469。


原文作者:超哥的IT私房菜;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
专注于IT系统集成、运维、架构二十年的IT职场老兵,拥有CCNA、OCA、OCP、PGCA、PGCE认证证书,公众号:超哥的IT私房菜,知识星球:超哥的IT私房菜,目前是多家IT厂商的咨询顾问。

注册时间:2021-08-27

  • 博文量
    552
  • 访问量
    303455