本章内容:
- LAMP架构介绍
- LAMP架构组成
-
1 LAMP 介绍
1.1 动态资源与语言
WEB资源类型:
静态资源:原始形式与响应内容一致,在客户端浏览器执行
- 动态资源:原始形式通常为程序文件,需要在服务器端执行之后,将执行结果返回给客户端
注意:静态和动态的区别,不在于网页是否能动态变化,而在于服务端的页面文件和客户端得到页面文件是否一致
范例:静态资源
#客户端主机现在的时间:
<script type="text/javascript">
document.write(new Date();
</script>
Web相关语言
客户端技术: html,JavaScript,css, jpg
服务器端技术: php, jsp, python,asp, JavaScript (Node.js)
范例:
#使用RockyLinux或者RHEL系统
~ yum install -y httpd
~ cat > /var/www/html/index.html <<EOF
<script type="text/javascript">
document.write(new Date());
</script>
EOF
~ systemctl enable --now httpd
~ systemctl disable --now firewalld.service
#浏览器访问服务器http://<IP地址>/index.html
~ cat > /var/www/html/test.html <<EOF
<h1>Welcome to kubesphere</h1>
EOF
#浏览器访问服务器http://<IP地址>/test.html
- 浏览器访问显示界面如下:
浏览器查看界面的源代码:
发现浏览器显示的代码与服务器端制作的代码一致,那么该资源为静态资源。
1.2 LAMP 架构组成
LAM(M)P:
L: linux
A: apache (httpd)
M: mysql, mariadb
M: memcached
P: php, perl, python
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脚本
~ vim /etc/httpd/conf/httpd.conf
...省略...
<directory /data/script>
require all granted
</directory>
<IfModule alias_modu1e>
...省略...
#scriptAlias /cgi-bin/ "/var/www/cgi-bin/"
scriptAlias /sh/ "/data/script/"
</IfModule>
<directory /data/script>
require all granted
</directory>
...省略...
~ cat /data/script/cgi.sh
#!/bin/bash
#
cat << EOF
content-Type: text/html
<pre>
My username is: $(id -un)
My id is: $(id -u)
My shell settings are:
$(set)
My environment variables are:
$(env)
Here is the file in /etc:
$(ls -l /etc/redhat-release )
$( cat /etc/redhat-release )
</pre>
EOF
~ chmod +x /data/script/cgi.sh
~ ll /data/script/cgi.sh
~ curl http://10.0.0.50/sh/cgi.sh
#观察错误日志
~ tail /var/1og/httpd/error_log
#修改cgi.sh最后加一行sleep 100
~ vim /data/script/cgi.sh
~ tai7 -3 /data/script/cgi.sh
</pre>
EOF
rm -rf /data/script
sleep 100
#再次运行后,可以观察到下面进程树
~ curl http://10.0.0.50/sh/cgi.sh
1.3.2 FastCGI
fastcgi的方式是,web服务器收到一个请求时,不会重新fork一个进程(因为这个进程在web服务器启动时就开启了,而且不会退出),web服务器直接把内容传递给这个进程(进程间通信,但fastcgi使用了别的方式, tcp方式通信),这个进程收到请求后进行处理,把结果返回给web服务器,最后自己接着等待下一个请求的到来,而不是退出。
请求流程:
Client — (http协议) —> httpd — (fastcgi协议) —>fastcgi服务器—(mysql协议) —> mysql
1.3.3 CGI 和 FastCGI
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
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:
格式2:<?php
echo "<h1>Hello world!</h1>"
?>
范例:Apache运行php代码 ```bash<h1>
<?php echo "Hello world!" ?>
</h1>
默认Apache无法处理php程序代码
服务器需要下载php程序
yum install -y php
systemctl restart httpd curl http://10.0.0.50/php.php

> 查看源代码后发现 PHP程序代码 是动态资源。
<a name="Ca1oX"></a>
### 1.4.5 PHP测试代码
```bash
~ cat /var/www/html/phpinfo.php
<?php
echo date("Y/m/d H:i:s");phpinfo();
?>
~ curl 127.0.0.1/phpinfo.php
~ cat ./ phpinfo.php
#!/bin/php
<?php
phpinfo();
?>
~ chmod +x ./phpinfo.php
./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 安装部署
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();
}
?>
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 应用部署
范例: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/
<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 应用部署
范例: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/
配置 Wordpress Web界面数据库信息
添加WordPress 后台管理员账号
进入 WordPress 管理界面
个人博客 搭建完毕
范例: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 应用部署
范例: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';
Discuz 检查环境所有OK即可下一步
登录DISCUZ论坛后台管理界面
DISCUZ论坛管理中心配置界面
DISCUZ 论坛就搭建成功了。