经典LAMP架构实现

本章内容:

  • LAMP架构介绍
  • LAMP架构组成
  • LAMP架构多种应用实现

    1 LAMP 介绍

    1.1 动态资源与语言

    WEB资源类型:

  • 静态资源:原始形式与响应内容一致,在客户端浏览器执行

  • 动态资源:原始形式通常为程序文件,需要在服务器端执行之后,将执行结果返回给客户端

注意:静态和动态的区别,不在于网页是否能动态变化,而在于服务端的页面文件和客户端得到页面文件是否一致
范例:静态资源

  1. #客户端主机现在的时间:
  2. <script type="text/javascript">
  3. document.write(new Date();
  4. </script>

Web相关语言
客户端技术: html,JavaScript,css, jpg
服务器端技术: php, jsp, python,asp, JavaScript (Node.js)
范例:

  1. #使用RockyLinux或者RHEL系统
  2. ~ yum install -y httpd
  3. ~ cat > /var/www/html/index.html <<EOF
  4. <script type="text/javascript">
  5. document.write(new Date());
  6. </script>
  7. EOF
  8. ~ systemctl enable --now httpd
  9. ~ systemctl disable --now firewalld.service
  10. #浏览器访问服务器http://<IP地址>/index.html
  11. ~ cat > /var/www/html/test.html <<EOF
  12. <h1>Welcome to kubesphere</h1>
  13. EOF
  14. #浏览器访问服务器http://<IP地址>/test.html
  • 浏览器访问显示界面如下:

image.png
浏览器查看界面的源代码:
image.png

发现浏览器显示的代码与服务器端制作的代码一致,那么该资源为静态资源。

1.2 LAMP 架构组成

image.png
LAM(M)P:
L: linux
A: apache (httpd)
M: mysql, mariadb
M: memcached
P: php, perl, python
image.png

CGI 和 FastCGI 协议可以让 Apache 或者 Web服务把动态请求转发到后端处理动态页面的服务器。

1.3 CGI 和 FastCGI

1.3.1 CGI

CGl: Common Gateway Interface公共网关接口
CG在2000年或更早的时候用得比较多,以前web服务器一般只处理静态的请求,如果碰到一个动态请求怎么办呢? web服务器会根据这次请求的内容,然后会fork一个新进程来运行外部c程序(或bash,perl脚本等),这个进程会把处理完的数据返回给web服务器,最后web服务器把内容发送给用户,刚才fork的进程也随之退出。如果下次用户还请求改动态脚本,那么web服务器又再次fork一个新进程,周而复始的进行。
CGI可以让一个客户端,从网页浏览器通过http服务器向执行在网络服务器上的程序传输数据;CGI描述了客户端和服务器程序之间传输的一种标准
请求流程:
Client — (http协议) —> httpd — (cgi协议)—>application server (program file) —(mysql协议) —>mysql
范例: Httpd 利用CGI 运行 Shell脚本

  1. ~ vim /etc/httpd/conf/httpd.conf
  2. ...省略...
  3. <directory /data/script>
  4. require all granted
  5. </directory>
  6. <IfModule alias_modu1e>
  7. ...省略...
  8. #scriptAlias /cgi-bin/ "/var/www/cgi-bin/"
  9. scriptAlias /sh/ "/data/script/"
  10. </IfModule>
  11. <directory /data/script>
  12. require all granted
  13. </directory>
  14. ...省略...
  15. ~ cat /data/script/cgi.sh
  16. #!/bin/bash
  17. #
  18. cat << EOF
  19. content-Type: text/html
  20. <pre>
  21. My username is: $(id -un)
  22. My id is: $(id -u)
  23. My shell settings are:
  24. $(set)
  25. My environment variables are:
  26. $(env)
  27. Here is the file in /etc:
  28. $(ls -l /etc/redhat-release )
  29. $( cat /etc/redhat-release )
  30. </pre>
  31. EOF
  32. ~ chmod +x /data/script/cgi.sh
  33. ~ ll /data/script/cgi.sh
  34. ~ curl http://10.0.0.50/sh/cgi.sh
  35. #观察错误日志
  36. ~ tail /var/1og/httpd/error_log
  37. #修改cgi.sh最后加一行sleep 100
  38. ~ vim /data/script/cgi.sh
  39. ~ tai7 -3 /data/script/cgi.sh
  40. </pre>
  41. EOF
  42. rm -rf /data/script
  43. sleep 100
  44. #再次运行后,可以观察到下面进程树
  45. ~ curl http://10.0.0.50/sh/cgi.sh

image.png

1.3.2 FastCGI

fastcgi的方式是,web服务器收到一个请求时,不会重新fork一个进程(因为这个进程在web服务器启动时就开启了,而且不会退出),web服务器直接把内容传递给这个进程(进程间通信,但fastcgi使用了别的方式, tcp方式通信),这个进程收到请求后进行处理,把结果返回给web服务器,最后自己接着等待下一个请求的到来,而不是退出。
请求流程:
Client — (http协议) —> httpd — (fastcgi协议) —>fastcgi服务器—(mysql协议) —> mysql

1.3.3 CGI 和 FastCGI

image.png

CGI 协议,相当于Apache激活了 CGI的进程(是Apache的子进程),子进程处理完毕后就销毁了,下一个用户请求时就会又开启。就会频繁的消耗机器的资源性能。会使得CPU从该进程切换到另一个进程,频繁的进行上下文切换。 简单理解:CGI是依附于Apache的子进程,而FastCGI则是独立的服务。

名称 在web服务器方面 在对数据进行处理的进程方面
CGI fork一个新的进程进行处理 读取参数,处理数据,然后就结束生命期
FastCGI 用tcp方式跟远程机子上的进程或本地进程建立连接 要开启tcp端口,进入循环,等待数据的到来,处理数据

1.4 PHP

1.4.1 PHP简介

PHP官网: http://www.php.net/
PHP是通用服务器端脚本编程语言,主要用于web开发实现动态web页面,也是最早实现将脚本嵌入HTML源码文档中的服务器端脚本语言之一。同时,php还提供了一个命令行接口,因此,其也可以在大多数系统上作为一个独立的shell来使用。
Rasmus Lerdorf 于 1994年开始开发PHP,最初是一组被 Rasmus Lerdorf 称作 “Personal Home Page Tool”的 Perl 脚本,可以用于显示作者的简历并记录用户对其网站的访问。后来,Rasmus Lerdorf使用C语言将这些 Perl 脚本重写为CGI程序,还为其增加了运行Web forms的能力以及与数据库交互的特性,并将其重命名为”PersonalHome Page/Forms Interpreter”或”PHP/FI”。此时,PHP/FI 已经可以用于开发简单的动态web 程序了,这即PHP1.0。1995年6月,Rasmus Lerdorf 把它的 PHP 发布于comp.infosystems.www.authoring.cgi Usenet讨论组,从此PHP开始走进人们的视野。1997年,其2.0版本发布
1997年,两名以色列程序员Zeev Suraski和Andi Gutmans重与的PHP的分析器(parser)成为PHP发展到3.0的基础,而且从此将PHP重命名为PHP: Hypertext Preprocessor。此后,这两名程序员开始重写整个PHP核心,并于1999年发布了Zend Engine 1.0,这也意味着PHP4.0的诞生。2004年7月,Zend Engine 2.0发布,由此也将PHP带入了PHP 5时代。PHP5包含了许多重要的新特性,如增强的面向对象编程的支持、支持PDO(PHP Data Objects)扩展机制以及一系列对PHP性能的改进
Zend Engine是开源的、PHP脚本语言的解释器,它最早是由以色列理工学院(Technion)的学生Andi Gutmans 和 zeev Suraski所开发,Zend 也正是此二人名字的合称。后来两人联合创立了Zend Technologies公司
Zend Engine 1.0于1999年随PHP4发布,由C语言开发且经过高度优化,并能够做为PHP的后端模块使用。ZendEngine为PHP提供了内存和资源管理的功能以及其它的一些标准服务,其高性能、可靠性和可扩展性在促进 PHP 成为一种流行的语言方面发挥了重要作用。
Zend Engine的出现将PHP代码的处理过程分成了两个阶段:首先是分析PHP代码并将其转换为称作Zend opcode的二进制格式opcode(类似Java的字节码),并将其存储于内存中;第二阶段是使用Zend Engine去执行这些转换后的Opcode


PHP 各种版本官方支持时间:
https://www.php.net/supported-versions.php
image.png

1.4.2 PHP的Opcode语言

Opcode是一种PHP脚本编译后的中间语言,类似于Java的ByteCode,或者.NET的MSL。
PHP的语言引擎zend执行PHP脚本代码一般会经过如下4个步骤
1、Scanring词法分析,将PHP代码转换为语言片段(Tokens)
2、Parsing语义分析,将Tokens转换成简单而有意义的表达式
3、Compilation将表达式编译成Opcode
4、Execution顺次执行Opcode,每次一条,从而实现PHP脚本的功能
即:扫描—>分析—>编译—>执行

1.4.3 PHP配置

php 的配置文件: /etc/php.ini,/etc/php.d/*.ini 配置文件在php解释器启动时被读取
对配置文件的修改生效方法

  • Modules:重启httpd服务
  • FastCGl:重启php-fpm服务

/etc/php.ini配置文件格式:

[foo]: section Header directive = value

注释符:

  • 以#开头,纯粹的注释信息
  • 以;开头,用于注释可启用的directive

提示:较新的版本中,已经完全使用 “ ; “ 进行注释
php.ini配置参考文档:
php.ini的核心配置选项文档:http://php.net/manual/zh/ini.core.phpphp.ini
配置选项列表:http://php.net/manual/zh/ini.list.php
php常见设置:

  • max_execution_time= 30 最长执行时间30s
  • memory_limit=128M 生产不够,可调大
  • display_errors=off 调试使用,不要打开,否则可能暴露重要信息
  • display_startup_errors=off 建议关闭
  • post_max_size=8M 最大上传数据大小,生产可能调大,比下面参数项大
  • upload_max_filesize =2M 最大上传文件,生产可能要调大
  • max_file_uploads = 20同时上传最多文件数
  • date.timezone = Asia/Shanghai 指定时区
  • short_open_tag=on 开启短标签,如: <? phpinfoO;?>

    1.4.4 PHP语言格式

    PHP 语言有两种使用格式:
    格式1:
    1. <?php
    2. echo "<h1>Hello world!</h1>"
    3. ?>
    格式2:
    1. <h1>
    2. <?php echo "Hello world!" ?>
    3. </h1>
    范例:Apache运行php代码 ```bash

    默认Apache无法处理php程序代码

    服务器需要下载php程序

    yum install -y php

systemctl restart httpd curl http://10.0.0.50/php.php

  1. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/2555283/1656496919527-c06d1b2f-865a-4e07-8f4b-f61261630e5c.png#clientId=u267c828c-1983-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=125&id=ud197e906&margin=%5Bobject%20Object%5D&name=image.png&originHeight=125&originWidth=394&originalType=binary&ratio=1&rotation=0&showTitle=false&size=14760&status=done&style=none&taskId=uefc01b9a-a2e6-4292-ba06-3b41759f730&title=&width=394)
  2. > 查看源代码后发现 PHP程序代码 是动态资源。
  3. <a name="Ca1oX"></a>
  4. ### 1.4.5 PHP测试代码
  5. ```bash
  6. ~ cat /var/www/html/phpinfo.php
  7. <?php
  8. echo date("Y/m/d H:i:s");phpinfo();
  9. ?>
  10. ~ curl 127.0.0.1/phpinfo.php
  11. ~ cat ./ phpinfo.php
  12. #!/bin/php
  13. <?php
  14. phpinfo();
  15. ?>
  16. ~ chmod +x ./phpinfo.php
  17. ./phpinfo.php

1.5 LAMP 实现方式

httpd 接收用户的web请求;静态资源则直接响应;动态资源为php脚本,对此类资源的请求将交由php来运行
httpd与php结合的方式:

  • modules:将php编译成为httpd的模块libphp5.so,只有prefork模式才支持
  • FastCGl

LAMP架构实现:

  • 静态资源:

Client — http —> httpd

  • 动态资源:

Client — http —> httpd —> libphp5.so() — mysql —> MySQL server
Client — http —> httpd —> fastcgi — mysql —> MySQL server

2 实现 LAMP

2.1 利用 rpm 包实现 LAMP 安装部署

经典LAMP架构实现 - 图8
Centos 8:
Module模块方式

#php-mysqlnd 提供了PHP连接MySQL的模块软件
dnf install -y httpd mariadb-server php php-mysqlnd

~ rpm -ql php-mysqlnd
#php-mysqlnd 模块库
~ rpm -ql php-mysqlnd | grep modules

#使用mysql_secure_installation进行mysql安全加固
~ mysql_secure_installation

FastCGl方式

dnf install -y httpd mariadb-server php-fpm php-mysqlnd

Centos 7:
Module模块方式

#php-mysql 提供了PHP连接MySQL的模块软件
yum install -y httpd php php-mysql mariadb-server

FastCGl方式

yum install -y httpd php-fpm php-mysql mariadb-server

CentOS 6:
Module模块方式

yum install httpd php php-mysql mysql-server

FastCGI方式:默认不支持
注意:基于module实现,httpd需要使用prefork模型

2.2 PHP 连接MySQL 的方式

2.2.1 使用 mysql 扩展连接数据库

使用mysql扩展模块mysql.so连接数据,此方式已经在php 7版后淘汰
范例: php使用mysql扩展连接数据库的测试代码

<?php
sconn = mysql_connect('mysqlserver','username','password');
if ($conn)
  echo "OK";
else
  echo "Failure";
  #echo mysql_error();
  mysql_close();
?>

2.2.2 使用 mysqli 扩展连接数据库

使用 mysqli扩展模块 mysqli.so连接数据,此方式只能连接MySQL数据库,不支持其它数据库
范例: php使用mysqli 扩展连接数据库的测试代码

<?php
$mysqli=new mysqli("mysqlserver","username ","password");
if(mysqli_connect_errno()){
  echo "Failure ";
  $mysqli=null;
  exit;
}
echo "OK ";
$mysqli->close();
?>

2.2.3 使用PDO(PHP Data Object)扩展连接数据库

使用PDO扩展模块pdo_mysql.so连接数据库,此方式可以支持连接MySQL,Oracle等多种数据库
范例: php使用pdo扩展连接数据库的测试代码1

<?php
$dsn='mysql:host=mysqlhost;port=3306;dbname=mysq;';
$username= 'root';
$passwd= 'kubesphere';
$dbh=new PDO($dsn, $username , $passwd);
var_dump($dbh);
?>

范例: php使用pdo扩展连接数据库的测试代码2

<?php
try {
$user='root';
$pass='kubesphere';
$dbh = new PDO('mysql:host=mysqlhost;port=3306;dbname=mysql',$user,$pass);
foreach($dbh->query('SELECT user,host from user') as $row) {
print_r($row);
}
$dbh = null;
} catch (PDOException $e) {
print "Error!:" . $e->getMessage() . "<br/>";
die();
}
?>

范例:浏览器访问pdo.php 源代码信息
image.png

3 常见 LAMP 应用实现

3.1 常见LAMP应用介绍

  • PhpMyAdmin是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库,官网: https://www.phpmyadmin.net/
  • WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可把WordPress当作一个内容管理系统(CMS)来使用,官网: https://cn.wordpress.org/
  • PHPWind 是2003年发布了PHPWind的前身版本ofstar,并发展成为包含BBS、CMS、博客、SNS等一系列程序的通用型建站软件,于2008年加入阿里巴巴集团,官网: https://www.phpwind.net/
  • Crossday Discuz! Board (简称Discuz!)是一套通用的社区论坛软件系统。自2001年6月面世以来是覆盖率最大的论坛软件系统之一。例如国内的吾爱破解论坛。2010年8月23日与腾讯达成收购协议,官网: https://www.discuz.net/
  • PowerDNS是一个跨平台的开源DNS服务组件,它是高性能的域名服务器,除了支持普通的BIND配置件,PowerDNS还可从MySQL,Oracle,PostgreSQL等的数据库读取数据。PowerDNS 安装了 Poweradmin(基于 PHP 实现),能实现Web管理DNS记录,非常方便
  • ECShop是一款B2C独立网店系统,适合企业及个人快速构建个性化网上商店。系统是基于PHP语言MYSQL数据库构架开发的跨平台开源程序。2006年6月,ECShop推出第一个版本1.0

    3.2 实现 phpMyadmin 应用部署

    image.png
    范例:CentOS 7利用清华Yum源安装 php 7.2 部署 phpMyAdmin-5.2.0 ```bash hostnamectl set-hostname LAMP-server.kubesphere.com yum install -y https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm yum -y install httpd php72-php php72-php-mbstring php72-php-mysqlnd mariadb-server systemctl enable —now httpd mariadb

wget https://files.phpmyadmin.net/phpMyAdmin/5.0.1/phpMyAdmin-5.0.1-all-languages.zip yum install -y unzip unzip phpMyAdmin-5.0.1-all-languages.zip cd phpMyAdmin-5.0.1-all-languages/ mv phpMyAdmin-5.0.1-all-languages /var/www/html/pma

设置mysql的root密码,phpMyadmin不允许空密码登录

mysql_secure_installation

浏览器访问http://LAMP服务器IP/pma/

![image.png](https://cdn.nlark.com/yuque/0/2022/png/2555283/1656511148592-dc55ddc3-a7f5-454e-8ef3-2a0c3a450737.png#clientId=u267c828c-1983-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=428&id=u9ff7bc5c&margin=%5Bobject%20Object%5D&name=image.png&originHeight=428&originWidth=392&originalType=binary&ratio=1&rotation=0&showTitle=false&size=31072&status=done&style=none&taskId=u2d04d84b-cf4b-455f-ab81-5979e3b9f9f&title=&width=392)<br />范例:CentOS 7利用RPM包部署phpMyAdmin
```bash
~ yum -y install httpd mariadb-server php php-mysql
~ systemctl start mariadb
~ mysql_secure_installation

#下载:https://www.phpmyadmin.net/downloads/
~ unzip phpMyAdmin-4.4.15.10-a17-languages.zip
~ mv phpMyAdmin-4.4.15.10-a17-languages /var/www/html/phpmyadmin
~ cd /var/www/html/phpmyadmin/
~ cp config.sample.inc.php config.inc.php
#如果mysql服务器和phpmyadmin不在同一台主机,还需要修改以下设置
~ vim config.inc. php
$cfg['servers'][$1]['host'] = 'mysqlserverIP';

~ yum -y install php-mbstring
~ systemctl start httpd
#浏览器访问:http://LAMP服务器IP/phpmyadmin,输入root及口令即可登录

3.3 实现 WordPress 应用部署

image.png
范例:RockyLinux 利用RPM部署 wordpress

yum install -y httpd php php-json php-mysqlnd mariadb-server
systemctl start httpd mariadb

#设置mysql的root密码
mysql_secure_installation
mysql 
> create database wordpress;
> grant all on wordpress.* to wordpress@'localhost' identified by 'kubesphere';
> exit

wget https://cn.wordpress.org/latest-zh_CN.tar.gz
tar -xvf latest-zh_CN.tar.gz
mv wordpress/* /var/www/html/
#避免在后续上传资源会报错
chown -R apache:apache /var/www/html/

image.png
配置 Wordpress Web界面数据库信息
image.png
添加WordPress 后台管理员账号
image.png
进入 WordPress 管理界面
image.png
个人博客 搭建完毕
范例:CentOS 7利用RPM部署 wordpress

#下载官网地址: https://cn.wondpress.org/
#解压缩wordPress博客程序到网页站点目录下
unzip wordpress-5.1.1-zh_CN.zip
mv wordpress /var/www/html/

mysql_secure_installation
#新建wordpress库和wordpress用户
mysql> create database wpdb;
mysql> grant all on wordpress.* to wordpress@'%' identified by "kubesphere";
setfacl -R -m u:apache:rwx /var/www/html/wordpress/
#或者chown -R apache:apache /var/www/html/wordpress
#打开http://LAMP服务器IP/wordpress进行页面安装

3.4 实现 Discuz 应用部署

image.png
范例:CentOS 8 利用RPM包部署Discuz

~ setenforce 0 && getenforce 
~ systemctl disable --now firewalld.service

~ yum install -y httpd php php-mysqlnd php-xml mariadb-server 
~ cd /var/www/html
~ wget https://www.discuz.net/files/DiscuzX/3.4/Discuz_X3.4_SC_UTF8_20220518.zip
~ unzip Discuz_X3.4_SC_UTF8_20220518.zip && rm -f Discuz_X3.4_SC_UTF8_20220518.zip
~ chown -R apache.apache /var/www/html/forum
~ systemctl enable --now httpd mariadb

mysql
> create database ultrax;
> grant all on ultrax.* to ultrax@'localhost' identified by 'kubesphere';

image.png
Discuz 检查环境所有OK即可下一步
image.png
登录DISCUZ论坛后台管理界面
image.png
DISCUZ论坛管理中心配置界面
image.png
DISCUZ 论坛就搭建成功了。