LAMP架构

LAMP架构
L:linux操作系统,常见centos
A:apche网站服务
M:mysql数据库
P:php程序

LAMP是一个多C/S架构的平台,最初级为web客户端基于TCP/IP通过http协议发起传送,这个请求可能是动态的,也可能是静态的。
所以web服务器通过发起请求的后缀来判断,如果是静态的资源就由web服务器自行处理,然后将资源发给客户端。如果是动态这时web服务器会通过CGI(Common Gateway interface)协议发起给php。
这里但是如果php是以模块形式与Web服务器联系。那么他们是通过内部共享内存的方式。如果是php单独的放置与一台服务器,那么他们是通过sockets套接字监听的方式通信(这又是一个C/S架构)。
这时php会相应的执行一段程序,如果在执行程序时,需要用到数据。那么php就会通过mysql协议发送给mysql服务器(也可以看作是一个C/S架构)。由mysql服务器处理,将数据供给php程序。
LAMP架构
LAMP架构

根据上图中访问数据流可知,处理一次动态页面请求,服务器主要经历:Apache处理请求——通过CGI接口访问PHP的的应用程序——PHP应用程序调用PHP解释器执行PHP代码——PHP程序访问调用数据库——最后给客户做反馈
apache主要实现如下功能:
第一:处理http的请求、构建响应报文等自身服务;
第二:配置让Apache支持PHP程序的响应(通过PHP模块)
mariadb主要实现如下功能:
第一:提供PHP程序对数据的存储;
第二:提供PHP程序对数据的读取(通常情况下从性能的角度考虑,尽量实现数据库的读写分离)。
php主要实现如下功能:
第一:建立和前端apache动态网页的联系,支持处理动态页面,动态页面内容是php语言写的,融合了很多java等环境组,网页灿烂的内容是开发那边基于java等各种语言汇编而成的
第二:也是最重要的一点,建立和后端数据库的连接,当用php写的网页内容需要调用后端关联数据库如mysql里面内容时,就需要执行php程序调用,注意关联数据库里面都是字符的那种表数据,php程序只是调用数据库内容,具体内容还需要到动态网页文件里面java环境组里面处理运算优化等。

LAMP流程:

  1. 用户发送http请求到达httpd服务器
  2. 服务器httpd解析url获取需要的资源的路径,如是静态资源,则构建响应报文,发回给用户
  3. 如果是动态资源网页,将资源地址发给php解析器,解析php文件(动态网页),解析完毕将内容发回给httpd,httpd构建响应报文,发回给用户
  4. 如果涉及到数据库操作,则利用php-mysql驱动,获取数据库数据,返回给PHP解析器

A,M,P是怎么联动起来工作的呢:
1、apache + php结合的方式大概几种
第一种:把php编译时直接编译成apache的模块、module模块化的方式进行工作(apahce默认的这种方式,我们接下来的配置也是这中方式)。
第二种:CGI、通用网关接口、apache基于CGI跟hph通信,还记得我们在apache预编译的时候enable --cgi-bin开启了cgi网关程序支持扩展功能吗,这种比价繁琐,所以不常用
php是做为一个模块或都是php解析器运行的,是让别人调用为一个进程使用的,apache不会跟数据库打交道,他是个静态web服务器,跟数据库打交道的是应用程序php,作为php的驱动能够基于某个API(应用程序的接口)有点涉及到开发了这里,跟服务器之间建立会话,而后他会通过我们的mysql语句发送给数据库,数据库再将结果返回给应用程序,不是php进程,而是php进程中所执行的代码
所以php被httpd所调用就需要在apache配置文件里面写一些支持php程序的语句,同时编译成apache的模块,那么他的执行位置应该在/usr/local/httpdapache基目录下
2、php + mysql的通信
首先httpd并不具备解析代码的能力,他要依赖于php的解析器,接着php本身不依赖于mysql,他只是一个解析器,能执行代码就OK了,那他什么时候用到mysql呢,动态网页的处理需要调用后端mysql数据库内容,或查或增删
php语言要想联系mysql,通常用到php的驱动,rpm包的叫php_mysql,php跟mysql没有一点关系,只有程序员在php中编写mysql语句时才连接mysql来执行sql语句的。
基于php-mysql驱动php去连接mysql只使用一个函数mysql_connect();而mysql_connect()正是php-mysql提供的一个API,只要指明要连接的服务器即可。

接下来是具体配置项,以及详解,apache前面已经编译安装好了,我们直接从mysql数据库和php程序讲起,并结合抓包测试动态网页深入理解LAMP架构

LAMP架构配置

http://httpd.apache.org/download.cgi
http://apr.apache.org/download.cgi
http://mirrors.sohu.com/mysql/
http://www.php.net/downloads.php
https://www.phpmyadmin.net/
http://www.awstats.org/#DOWNLOAD

-----------使用MD5校验文件完整性-------
1、下载文件如httpd-2.4.29.tar.bz2
2、将网站上该文件的MD5值复制到文件 httpd-2.4.29.tar.bz2.md5 中
3、使用 md5sum -c httpd-2.4.29.tar.bz2.md5 校验,如果OK就没有问题。

--------安装Apache(一主两从包)----下面两个插件从包是httpd2.4以后的版本所需要-----
tar xf apr-1.6.2.tar.gz
tar xf apr-util-1.6.0.tar.gz //apr包是为了缓解降低并发进程
tar xf httpd-2.4.28.tar.gz //apache主包http
mv apr-1.6.2 httpd-2.4.29/srclib/apr //包三合一
mv apr-util-1.6.0 httpd-2.4.29/srclib/apr-util
安装apache依赖的环境语言包
yum -y install \
gcc \
gcc-c++ \
make \
pcre-devel \
expat-devel \
perl

cd httpd-2.4.29
执行apache环境的预编译(执行基目录下configure脚本)
./configure \
--prefix=/usr/local/httpd \ //指定服务程序的基目录
--enable-so \ //开启动态加载模块,给apache后续加入各种模 块比如php模块等提供一个开启开关把,不开启动态加 载,安装成什么样apache就固定死了
--enable-rewrite \ //开启网页的重写功能
--enable-charset-lite \ //开启字符集
--enable-cgi //开启服务cgi网关扩展程序功能,比如php可以通过cgi脚本支持运行,也可以模块化编译安装到apache的模块下,两种方式

make && make install //编译make安装make install

cp /usr/local/httpd/bin/apachectl /etc/init.d/httpd
//源码编译的文件systemctl(chkconfig的后生)不能识别,需要把apache的启动文件apachect1复制到系统保存各类启动文件的/etc/init.d下并且重命名httpd,加入到系统启动中

vi /etc/init.d/httpd

chkconfig: 35 85 21 //35级别自动运行 第85个启动 第21个关闭

description: Apache is a World Wide Web server**

// chkconfig:后面定义的使启动服务的运行级别(例子中使35启动该服务),以及 关闭和启动服务的顺序(上例中启动服务的顺序是85,关闭的顺序是21)。这就是两条注释说明语句,定义启动级别

执行命令:
chkconfig --add httpd
//将httpd加入到systemctl管理器中,这样apache的启动等由systemctl统一管理

ln -s /usr/local/httpd/conf/httpd.conf /etc/httpd.conf
ln -s /usr/local/httpd/bin/* /usr/local/bin/
//做一个apache主配置文件的软链接到/etc/httpd.conf,做一个apache命令的软链接到 /usr/local/bin/,方便识别系统统一管理,一个服务最重要的用的改的最多的不就是配置文件和各种程序命令文件(bin)吗,所以做个软链接好找

systemctl stop firewalld.service //关闭防火墙 ,如果开启需在防火墙区域里面开启http服务选项
setenforce 0 //关闭内核防火墙selinux

httpd -t //检查配置文件有没有语法错误,没有就有个OK字样
apachectl -t

service httpd start //启动apache
netstat -anpt | grep 80 //检查服务是否正常运行,默认tcp80端口在监听

-----虚拟目录----

虚拟目录的作用,是将WWW服务器上的某个目录,通过apache软件共享出去,让相关权限的用户可以直接访问目录中的内容。(包括两种权限,一种是匿名,一种是授权)

需求:需要所有人可以访问服务器上的/usr/share/doc目录中的帮助手册。

配置方法:见附件vdir

-----虚拟web主机-----
详见附件:vhost-7(一定要看,很重要)
————————————————————————————————————————————————

-----------------------------以mysql数据库简介和安装----------------------------------------------------
mysql:是一种关系数据库,关系数据库是现在应用最广泛的数据库,和Excel 工作表一样,它也采用由行和列组成的二维表来管理数据,简单易懂(表1),同时,它还使用专门的SQL(Structured Query Language,结构化查询语言)对数据进行操作
LAMP架构
LAMP架构

数据库内容本质上是保存在硬盘上的,数据库由专门管理数据库的服务、程序RDBMS服务器管理,但是我们安装mysql的时候是安装的mysql数据库系统,服务程序都一并装上了,所以为了方便我们一般就把mysql叫做mysql数据库,其实他是一个数据库服务系统

yum -y install \
ncurses \
ncurses-devel \
bison \
cmake
//mysql所需要的依赖的环境包,注意cmake工具,它是执行mysql预编译的工具

useradd -s /sbin/nologin mysql
//建立一个程序形用户专门运行服务的用户mysql

tar xf mysql-boost-5.7.20.tar.gz
cd mysql-5.7.20/
// 解压mysql包,解压出来文件名叫mysql-5.7.20

cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1
//对mysql进行一些预编译 ,指定mysql数据库服务的基目录,sock连接文件位置,配置文件目录,进程文件位置,支持字符集,数据库记录的内容文件位置等等
mysql的两种连接方式

1:TCP/IP 方式
这种方式会在TCP/IP 连接上建立一个基于网络的连接请求,一般是client连接跑在Server上的MySQL实例,2台机器通过一个TCP/IP 网络连接
LAMP架构

2:socket连接
对mysql.sock文件来说,其作用是客户端与与mysqlserver服务器处于同一台机器,发起本地连接时可用,说白了sock连接就是自己登陆自己,cs架构吗,机器既想作为mysqlserver的服务器端又想作为客户端去验证的登陆mysql,必须有并且制定sock文件也就是mysql.sock位置
LAMP架构

make && make install //编译安装

chown -R mysql.mysql /usr/local/mysql/ //递归让程序用户mysql去管理mysql服务

vi /etc/my.cnf //mysql的默认主配置文件-
===在末尾添加===

[client]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock

[mysql]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock

[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
LAMP架构

//这里配置主要定义了mysql客户端和服务器端mysqld的相关属性,监听端口,sock连接文件等字符集呀,sql_mode开启数据库工作的一些支持模式

chown mysql:mysql /etc/my.cnf //配置文件的属主也改成mysql

echo 'PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile (可以识别mysql中的命令)
echo 'export PATH' >> /etc/profile
source /etc/profile
//系统环境变量PATH中设置添加mysql命令行程序在任何shell中都可以执行,编辑/etc.profile文件让PATH系统环境变量生效

初始化数据库:
cd /usr/local/mysql/

bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
//执行mysqlbin下面的mysqld命令,对数据库进行一些初始化的设置,initialize-insecure,设置数据库空密码 。user=mysql,mysql用户身份去初始化mysql服务,--basedir=/usr/local/mysql --datadir=/usr/local/mysql/data,指定基目录,数据存放目录

cp usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
//systemctl管理只能识别/etc/init.d下面的启动文件,apache是吧apachect1文件复制到改目录下还重命名新建为httpd,这里我们不用新建,直接复制启动文件脚本
systemctl daemon-reload

systemctl start mysqld
netstat -anpt | grep 3306

systemctl enable mysqld //mysql加入开机自启动项

mysqladmin -u root -p password "abc123" //给root账号设置密码
//mysqladmin,安装好后自带的一个登陆设置先关命令mysqladmin,用来给登陆mysql数据库的用户设置登录密码-u给哪个用户 -p设置登录mysql服务的密码

登陆:
mysql -u root -p
//-p后面可以跟密码,这样密码就是明文显示,不跟密码,会提示你输入密码,密码就是密文方式显示

授权远程登录:
grant all privileges on . to 'root'@'%' identified by 'abc123' with grant option;
所有的库都给root用户权限,并且允许他在任何主机地方登陆,登陆时候以密码abc123登陆
grant all privileges on 库.表 to '用户'@在'所有地方%‘ 密码验证为 abc123 ,权限最大了的了

flush privileges; //刷新才能生效

可用navicat工具远程管理

===================数据库基本操作==========================
数据结构:库---》表---》数据
mysql> show databases; //查看库
create database school; //创建school这个库
create table info (id int,name char(10),score decimal(5,2));
desc info; 查看表结构
mysql> user school; 使用school这个库,不就是进入这个库吗
mysql> show tables;在school库里去查看表,注意mysql没有提示符,都是mysql所以得清楚自己在哪
select * from info;
为空!
插入数据:insert into info (id,name,score) values (1,'zhangsan',70.5);
修改数据:
update info set name='wangjiu' where id=1;
删除数据:
delete from info where id=2;
删除整表(库):
drop table info;
drop database school;

-----------------以下安装PHP-----------

yum -y install \
libjpeg \
libjpeg-devel \
libpng libpng-devel \
freetype freetype-devel \
libxml2 \
libxml2-devel \
zlib zlib-devel \
curl curl-devel \
openssl openssl-devel

//以上都是php程序的依赖环境组包

vi /usr/local/httpd/bin/apxs
#!/usr/bin/perl -w

//apxs是apache安装扩展模块的工具,它的存在可以不需要再次执行configure脚本,执行enable-php开启php模块然后重新编译安装,apxs很好用,所以这里我们要安装扩展模块php,那么vi这个文件,第一行加入语句#!/usr/bin/perl -w 告诉apxs工具我新扩展增加了一个模块php,程序执行路径为/usr/bin/per -w,#!是unix中的符号,不止vi编辑器中的#注释哦,要注意 -w表示写的程序不容易出现问题,他是一种语法警告
apxs即Apache extension stool,用于把Apache编译安装时候没有安装的模块制作成so(share object)文件,利用mod_so模块提供的loadmodule功能把这些模块加载进Apache,使Apache支持这些模块的功能,当然在安装的时候就加载这些模块更好。

tar xjvf php-7.1.10.tar.bz2
cd php-7.1.10
./configure \
--prefix=/usr/local/php \
--with-apxs2=/usr/local/httpd/bin/apxs \
--with-mysql-sock=/usr/local/mysql/mysql.sock \
--with-mysqli \
--with-zlib \
--with-curl \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-openssl \
--enable-mbstring \
--enable-xml \
--enable-session \
--enable-ftp \
--enable-pdo \
--enable-tokenizer \
--enable-zip

//解压这个php主包,进行环境预编译,比如指定程序安装的基目录,和apache联动,比如依赖apache的apxs扩展模块,里面有perl程序吗,和mysql联动,需要调用mysql的socket连接文件,还有一些依赖程序比如gd库图形化的库等,enable开启一些自己相应的模块功能

make && make install

cp php.ini-development /usr/local/php/lib/php.ini
vi /usr/local/php/lib/php.ini
-------------加入两句--------------
mysqli.default_socket = /usr/local/mysql/mysql.sock
date.timezone = Asia/Shanghai
//把php的模板配置文件复制到基目录下,因为预编译的时候指了基目录在/usr/local/php下面,编辑php的配置文件,告诉php调用mysql数据库的时候,如果需要用到socket连接,执行sock文件即可

/usr/local/php/bin/php -m //验证安装的模块(看看而已)

vi /etc/httpd.conf //在mime模块区域里新增下面两条语句
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
LAMP架构

全局配置里新增
DirectoryIndex index.php index.html
//这三句就是apache和php的联动,告诉apache什么样的网页文件可以执行php解析器,实质就是在apache配置区域mime里面添加可以执行php的文件类型,mime区域就是干这个事的,可以解析什么样类型的文件,具体解析是linux调用程序是解析,比如解析php文件就是调用php程序中的phpshell解释器,解析gzip压缩文件就是调用linux系统中的gzip程序,比如你再加上一行“AddType application/x-httpd-php .htm”,则.htm文件也可以被php解析器解析,你甚至还可以添加上一行“AddType application/x-httpd-php .txt”,让普通的文本文件格式也能运行php解析器

上述配置没问题的话后又以下两个文件生成

LoadModule php7_module modules/libphp7.so

--------------------------------------测试php和apache的联动-----------------------------------------------------
接下来我们去访问php语言写的一个动态网页,动态网页里面的展现内容是结合很多开发语法展现的,不做过多研究,只需知道php后缀的文件是动态网页,并且它是php语言写的,php程序模块执行的
vi /usr/local/httpd/htdocs/index.php

<?php
phpinfo();
?>
//phpinfo();网页主题内容调用了一个函数模块,是展现php信息的参数的网页

http://192.168.80.185/

--------------------------下面测试php和数据库的连接--------------------------
mysql -u root -p

CREATE DATABASE myadm;
GRANT all ON myadm. TO 'myadm'@'%' IDENTIFIED BY 'admin123';
GRANT all ON myadm.
TO 'myadm'@'localhost' IDENTIFIED BY 'admin123';
flush privileges;
//创建一个myadm数据库,然后允许myadm用户在本机、任何地方,用密码admin123登陆myadm数据库的所有地方,myadm.*表示myadm数据库下的所有内容
myadm是mysql数据库创建好的时候自带本地用户,只有mysql的本地用户,才能登陆数据库,mysql数据库的用户在mysql库中,在user表中

vi /usr/local/httpd/htdocs/index.php

<?php
$link=mysqli_connect('192.168.80.183','myadm','admin123');
if($link) echo "<h1>Success!!</h1>";
else echo "Fail!!";
?>
//这个动态网页就用到了后端的数据库,在php网页里面启动连接数据库的语句mysqli_connect('192.168.80.183','myadm','admin123');,这是一个函数,语句含义以什么样身份用户名连接到哪台主机上的mysql数据库中,$link引用这个函数,if语句,如果函数执行成功就是php连接数据库成功,那么就会显示success,连接后端数据库不成功就会显示fail。
LAMP架构

---------------------------------phpmyadmin管理套件----------------------------------

phpMyAdmin 是一个使用 PHP 语言编写,用来管理 MySQL 数据库的 Web 程序。通过该套件提供的网页界面,即便是对 SQL 语句不太熟悉的人,也能够非常容易地对 MySQL数据库进行管理和维护。
理解:phpadmin是用php语言写的程序·,可以理解为一个工具,是干嘛的,以web形式图形化简单化管理后端mysql数据库的一个网页应用,一个工具。

------------------------------------以下安装phpMyadmin----------------------------------------

unzip phpMyAdmin-4.7.6-all-languages.zip -d /opt/
//用unzip解压指定解压文件位置是-d参数,大多数还是用tar解压
mv phpMyAdmin-4.7.6-all-languages /usr/local/httpd/htdocs/myadm
//既然他最终要展示一个web页面,我们就把整个运行文件拉到apache家目录下,重命名为myadm
cd /usr/local/httpd/htdocs/myadm
cp config.sample.inc.php config.inc.php
//把phpMyadmin模板配置文件重命名一下,好识别

vi config.inc.php
第31行
$cfg['Servers'][$i]['host'] = '127.0.0.1'; //把localhost 改成IP ,不识别localhost,只能识别ip,这个ip是mysql数据库服务器的ip,也可以是mysql所在服务器的主机名,其实这个配置文件里面应该都是和mysql相关的配置,毕竟他是管理mysql的吗

http://192.168.80.182/myadm
//这里的访问涉及到一个虚拟目录的概念,载网站根目录下
LAMP架构

我们访问192.168.80.182的index.php文件的时候,并没有在后面加个后缀跟文件名,因为在apache配置文件里面这条语句DirectoryIndex index.php index.html说明了apache默认识别的文件类型是php和html,没有myadm,所以myadm并不能识别,所以需要在ip后面指定路径,myadm里面一定是有php后缀的网页文件,不然怎么这个工具以网页文件显示在web服务器上
LAMP架构
LAMP架构

上一篇:docker安装lamp环境


下一篇:LAMP