浅谈LAMP

LAMP介绍

1️⃣LAMP的含义:

  • L: linux
  • A: apache httpd
  • M: mysql, mariadb
  • P: php, python

2️⃣Web资源类型

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

3️⃣Web相关语言

  • 客户端技术:javascript, html,处理静态资源
  • 服务器端技术:php, jsp, python,处理动态资源

4️⃣LAMP工作原理
在这里插入图片描述

  • 当客户端请求静态资源时,web服务器直接把静态资源返回客户端

  • 当客户端请求动态资源时,httpd的php模块会进行动态运算,如果过程需要数据库的数据作为运算参数时,php连接数据库取得相应数据,运算的结果转换为静态资源由web服务器返回客户端

  • CGI(Common Gateway Interface):httpd程序与php之间数据传输的标准

5️⃣php

  • php是一种脚本编程语言,同时也是一种可以嵌入到html中的嵌入式web程序语言

  • Zend Engine:开源的、php脚本语言的解释器

  • Opcode:php脚本编译后的中间语言,顺次执行opcode,每次执行一条,实现php脚本的解释执行

CGI和fastcgi

1️⃣CGI

  • CGI:Common Gateway Interface 公共网关接口
  • CGI 可以让一个客户端,从网页浏览器通过http服务器向执行在网络服务器上的程序传输数据;
  • CGI描述了客户端和服务器程序之间传输的一种标准
  • 请求流程:
    Client -- (http协议) --> httpd -- (cgi协议) --> application server (program file) -- (mysql协议) --> mysql

2️⃣fastcgi

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

3️⃣二者区别
在这里插入图片描述
在这里插入图片描述

PHP详情

1️⃣PHP的Opcode语言
Opcode是一种PHP脚本编译后的中间语言,类似于Java的ByteCode,或者.NET的MSL。
PHP的语言引擎Zend执行PHP脚本代码一般会经过如下4个步骤

  • 1、Scanning 词法分析,将PHP代码转换为语言片段(Tokens)
  • 2、Parsing 语义分析,将Tokens转换成简单而有意义的表达式
  • 3、Compilation 将表达式编译成Opcode
  • 4、Execution 顺次执行Opcode,每次一条,从而实现PHP脚本的功能
    即:扫描–>分析–>编译–>执行

2️⃣php配置

  • php 的配置文件/etc/php.ini, /etc/php.d/*.ini

  • 配置文件在php解释器启动时被读取

  • 对配置文件的修改生效方法

    • Modules:重启httpd服务
    • FastCGI:重启php-fpm服务
  • /etc/php.ini配置文件格式

[foo]:Section Header
directive = value

注释符:以 ; 开头,用于注释可启用的directive

  • php.ini 配置参考文档
    php.ini的核心配置选项文档: http://php.net/manual/zh/ini.core.php
    php.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 开启短标签,:<? phpinfo(); ?>

3️⃣php语言格式

  • php语言有两种使用格式:
/  格式1 html代码嵌入php代码中
<?php
echo "<h1>Hello world!</h1>"
?>

/ 格式2 php代码嵌入html代码中
<h1>
<?php echo "Hello world!" ?>
</h1>

/ php测试代码
<?php
echo date("Y/m/d H:i:s");
phpinfo();
?>
  • 示例:测试php
vim /var/www/html/index.php
<h1>
<?php
echo "hellp php1!"
?>
</h1>

<?php
echo "<h1> hello php2!</h1>"
?>

<?php
echo date("y/m/d");
phpinfo();
?>

在这里插入图片描述

LAMP实现方式

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

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

2️⃣LAMP架构实现

  • 静态资源:
    Client -- http --> httpd
  • 动态资源:
    Client -- http --> httpd --> libphp5.so () -- mysql --> MySQL server
    Client -- http --> httpd -->fastcgi-- mysql --> MySQL server

3️⃣利用rpm包实现LAMP安装部署

  • CentOS 8

    • Module 模块方式
      dnf install httpd mariadb-server php php-mysqlnd
    • FastCGI 方式
      dnf install httpd mariadb-server php-fpm php-mysqlnd
  • CentOS 7

    • Module 模块方式
      yum install httpd php php-mysql mariadb-server
    • FastCGI 方式
      yum install httpd php-fpm php-mysql mariadb-server
  • CentOS 6:

    • Module 模块方式
      yum install httpd, php, php-mysql, mysql-server
    • FastCGI方式:默认不支持
      注意:基于module实现,httpd 需要 使用prefork模型

PHP连接MySQL的方式

  • 使用mysql扩展连接数据库
    使用mysql扩展模块mysql.so连接数据,此方式已经在php 7版后淘汰
    范例:php使用mysql扩展连接数据库的测试代码
<?php
$conn = mysql_connect('mysqlserver','username','password');
if ($conn)
echo "OK";
else
echo "Failure";
#echo mysql_error();
mysql_close();
?>
  • 使用mysqli扩展连接数据库
    使用mysqli扩展模块mysqli.so连接数据,此方式只能连接MySQL数据库,不支持其它数据库
  • 范例:php使用mysqli扩展连接数据库的测试代码
vim /var/www/html/index2.php
<?php
$mysqli=new mysqli("localhost", "test", "centos");
if(mysqli_connect_errno()){
echo "Failure";
$mysqli=null;
exit;
}
echo "OK";
echo date("Y/m/d H:i:s");
$mysqli->close();
?>

在这里插入图片描述

  • 使用PDO(PHP Data Object)扩展连接数据库(基本都是这个)
    使用PDO扩展模块pdo_mysql.so连接数据库,此方式可以支持连接MySQL,Oracle等多种数据库
  • 范例:php使用pdo扩展连接数据库的测试代码
/ 测试代码1
[root@Centos7 ~]# vim /var/www/html/pdo1.php
<?php
$dsn='mysql:host=localhost;dbname=mysql';
$username='test';
$passwd='centos';
$dbn=new pdo($dsn,$username,$passwd);
var_dump($dbh);
echo "OK"
?>
/ 测试代码2
[root@Centos7 ~]# vim /var/www/html/pdo3.php
<?php
try {
$user='test';
$pass='centos';
$dbh = new PDO('mysql:host=localhost;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();
}

在这里插入图片描述
在这里插入图片描述

CentOS 7环境下部署phpmyadmin

1️⃣安装相应的LAMP程序

/ 配置清华php源
yum install https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-
7.rpm
yum install httpd php72-php php72-php-mysqlnd php72-php-mbstring mariadb-server
systemctl start httpd
systemctl start mariadb
/ 修改mysql的root密码 phpMyadmin不允许空密码登录
mysqladmin -uroot passoword 'centos'

2️⃣安装配置的PHPmyadmin程序

wget https://files.phpmyadmin.net/phpMyAdmin/4.9.2/phpMyAdmin-4.9.2-all-languages.tar.gz
tar xf phpMyAdmin-4.9.2-all-languages.tar.gz -C /var/www/html
cd /var/www/html
mv phpMyAdmin-4.9.2-all-languages pma

3️⃣直接IP地址/pma打开
在这里插入图片描述
在这里插入图片描述

CentOS 7环境下部署wordpress

1️⃣安装相应的LAMP程序

/ 配置清华php源
yum install https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-
7.rpm
yum install httpd php72-php php72-php-mysqlnd mariadb-server
systemctl start httpd mariadb

2️⃣安装配置wordpress

/  下载官网地址:https://cn.wordpress.org/
cd /var/www/html
[root@Centos7 html]# tar xf wordpress-5.3-zh_CN.tar.gz 
[root@Centos7 html]# ls
pma  wordpress  wordpress-5.3-zh_CN.tar.gz
/ 配置wordpress权限
chown -R apache.apache wordpress
/ mysql配置
CREATE DATABASE wordpress CHARACTER SET = utf8;
GRANT ALL ON wordpress.* TO 'wordpress'@'%' IDENTIFIED BY 'wordpress';
/ 如果mysql跟wordpress不分离就必须创建本地连接账户
GRANT ALL ON wordpress.* TO 'wordpress'@'localhost' IDENTIFIED BY 'wordpress';

3️⃣直接IP地址/wordpress打开安装
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4️⃣测试php性能
ab -c 10 -n 100 http://172.20.54.2/wordpress/
如下图,当前每秒处理请求数约为6-7 性能极差
在这里插入图片描述

php加速器

1️⃣实现原理

php的加速器:

  • 基于PHP的特殊扩展机制如opcode缓存扩展也可以将opcode缓存于php的共享内存中,从而可以让同一段代码的后续重复执行时跳过编译阶段以提高性能。
  • 这些加速器并非真正提高了opcode的运行速度,而仅是通过分析opcode后并将它们重新排列以达到快速执行的目的

2️⃣常用php加速器

  • XCache加速php 5.X
    快速而且稳定的PHP opcode缓存,经过严格测试且被大量用于生产环境。
    项目地址:http://xcache.lighttpd.net/, 收录EPEL源
  • PHP自带的opcache加速php 7.X

CentOS 7环境下编译安装php-xcache支持php 5.X

1️⃣准备安装环境

/ 配置清华源
[root@Centos7 ~]# yum -y install https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm
[root@Centos7 ~]# yum -y install php56-php php56-php-mysqlnd mariadb-server httpd
/ 开机启动
[root@Centos7 ~]# systemctl enable --now httpd mariadb
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
/ 准备mysql账号
MariaDB [(none)]> CREATE DATABASE wordpress;
MariaDB [(none)]> GRANT  ALL wordpress.* TO 'wordpress'@'localhost' IDENTIFIED BY 'wordpress';

2️⃣准备wordpress

[root@Centos7 html]# tar xf wordpress-5.2.4-zh_CN.tar.gz -C /var/www/html
cd /var/www/html
/ 更改所属组
chown -R apache.apache wordpress
/ 配置wordpress
http://172.20.54.3/wordpress

3️⃣编译安装

/ 配置编译环境
[root@Centos7 html]# yum -y install gcc php56-php-devel
#下载并解压缩xcache-3.2.0.tar.bz2
[root@centos7 ~]#tar xf xcache-3.2.0.tar.gz
#生成编译环境
[root@centos7 ~]#cd xcache-3.2.0/
[root@Centos7 xcache-3.2.0]# /opt/remi/php56/root/usr/bin/phpize
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226
[root@Centos7 xcache-3.2.0]# ./configure --enable-xcache --with-php-config=/opt/remi/php56/root/usr/bin/php-config

[root@centos7 xcache-3.2.0]#make && make install
...省略...
Installing shared extensions: /opt/remi/php56/root/usr/lib64/php/modules/
[root@centos7 xcache-3.2.0]#cat xcache.ini >> /opt/remi/php56/root/etc/php.ini
#安装base源中执行即可cp xcache.ini /etc/php.d/
[root@centos7 ~]#systemctl restart httpd

/ 测试性能
ab -c 10 -n 100 http://172.20.54.3/wordpress/
如下图,性能提高了一倍

在这里插入图片描述

CentOS 8环境下安装opcache支持php 7.X

[root@centos8 ~]#dnf install php-opcache
[root@centos8 ~]#rpm -ql php-opcache
/etc/php.d/10-opcache.ini
/etc/php.d/opcache-default.blacklist
/usr/lib/.build-id
/usr/lib/.build-id/71
/usr/lib/.build-id/71/55ebb00f7ebcab9d708c1d5c7b7e634cce259c
/usr/lib64/php/modules/opcache.so
[root@centos8 ~]#grep opcache /etc/php.d/10-opcache.ini
zend_extension=opcache
opcache.enable=1
...省略...

php-fpm 模式实现LAMP

1️⃣fastcgi模式介绍

  • fastcgi模式下php以独立程序状态运行,有独立的进程、端口号

  • php-fpm软件包:专用于将php运行于fastcgi模式,与php软件包不能够同时安装

  • httpd2.4支持fastcgi模式,httpd2.2不支持该模式,故CentOS 6环境需要编译httpd2.4才能使用fastcgi模式

2️⃣安装php-fpm

/ BASE源安装PHP-FPM
yum install php-fpm

/ 清华大学yum源安装较新版的PHP-FPM(依赖EPEL源)
yum install https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-
7.rpm
#安装php-fpm5.6版
yum install php56-php-fpm php56-php-mysql
#安装php-fpm7.3版
yum install php73-php-fpm php73-php-mysql

3️⃣配置php-fpm

  • 查看php-fpm所对应的配置文件
rpm -ql php-fpm
/usr/lib/systemd/system/php-fpm.service
/etc/logrotate.d/php-fpm
/etc/php-fpm.conf
/etc/php-fpm.d
/etc/php-fpm.d/www.conf
/etc/sysconfig/php-fpm
/run/php-fpm
  • php-fpm 主要配置文件:
    /etc/php-fpm.conf
    /etc/php-fpm.d/*.conf
  • 官方文档:
    http://php.net/manual/zh/install.fpm.configuration.php
  • PHP-FPM常见配置
daemonize = no //是否将程序运行在后台
listen = 127.0.0.1:9000 //FPM 监听地址
listen = /var/run/php.sock //UDF模式使用,指定生成的unix socket文件的路径
listen.owner = apache //UDF模式使用,指定生成的unix socket文件的所有者
listen.group = apache //UDF模式使用,指定生成的unix socket文件的所属组
listen.mode= 0666 //UDF模式使用,,指定生成的unix socket文件的权限
listen.acl_users = apache,nginx //指定用户访问unix socket文件,listen.owner 和listen.group
将无效
listen.backlog = -1 //等待队列的长度 -1表示无限制
listen.allowed_clients = 127.0.0.1 //仅允许哪些主机访问
pm = dynamic|static //static 固定数量的子进程, //dynamic子进程数据以动态模式管理
pm.max_childen //static 固定数量的子进程
pm.start_servers
pm.min_spare_servers
pm.max_spare_servers
pm.max_requests = 500
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session //设置session存放位置
  • session目录
    确保运行php-fpm进程的用户对session目录有读写权限
mkdir /var/lib/php/session
chown apache.apache /var/lib/php/session
  • 启动PHP-FPM
    systemctl start php-fpm
  • 范例:php-fpm配置生产案例
cat /etc/php-fpm.d/www.conf
[www]
listen = 127.0.0.1:9000 #监听地址及IP
listen.allowed_clients = 127.0.0.1 #允许客户端从哪个源IP地址访问,要允许所有行首加 ;注释
即可
user = apache #php-fpm启动的用户和组,会涉及到后期文件的权限问题
group = apache
pm = dynamic #动态模式进程管理
pm.max_children = 500 #静态方式下开启的php-fpm进程数量,在动态方式下他限定php-fpm的最大进
程数
pm.start_servers = 100 #动态模式下初始进程数,必须大于等于pm.min_spare_servers和小于等
于pm.max_children的值。
pm.min_spare_servers = 100 #最小空闲进程数
pm.max_spare_servers = 200 #最大空闲进程数
pm.max_requests = 500000 #进程累计请求回收值,会重启
pm.status_path = /pm_status #状态访问URL
ping.path = /ping #ping访问动地址
ping.response = ping-pong #ping返回值
slowlog = /var/log/php-fpm/www-slow.log #慢日志路径
php_admin_value[error_log] = /var/log/php-fpm/www-error.log #错误日志
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files #phpsession保存方式及路径
php_value[session.save_path] = /var/lib/php/session #当时使用file保存session的文件
路径

4️⃣配置httpd 支持fastcgi

注意:在HTTPD服务器上必须启用proxy_fcgi_module模块,才能充当php-fpm客户端

  • 查看基础模块
/ 查看fcgi模块
[root@Centos7 ~]# httpd -M| grep fcgi
 proxy_fcgi_module (shared)
/ 查看MPM模式是否prefork
[root@Centos7 ~]# httpd -M| grep mpm
 mpm_prefork_module (shared)
  • 创建httpd的配置文件 /etc/httpd/conf.d/fcgi.conf ,内容如下
DirectoryIndex index.php
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://php-fpm服务器IP:9000/var/www/html/$1
#以上开启FCGI反向代理,^/”这处的”/“相对于后面的/var/www/html而言,后面的$1是指前面
的/(.*.php)
  • 说明:如果php-fpm和httpd在同一台主机,也可以用 UDS(unix domain socket)方式
ProxyPassMatch ^/(.*\.php)$
unix:/var/run/php.sock|fcgi://localhost/app/httpd24/htdocs/$1
  • 参看:http://httpd.apache.org/docs/2.4/mod/mod_proxy_fcgi.html

实战案例:CentOS 7 利用yum安装基于PHP-FPM模式的LAMP

/ 安装基本包
[root@Centos7 ~]# yum -y install httpd php-fpm
#查看Httpd mod_fcgi模块是否加载
httpd -M | grep fcgi
proxy_fcgi_module (shared)
/ 查看MPM模式
[root@Centos7 ~]# httpd -M | grep mpm
 mpm_prefork_module (shared)
/ 修改配置文件
vim /etc/httpd/conf.d/fcgi.conf      //添加/etc/httpd/conf.d/fcgi.conf配置文件
DirectoryIndex index.php
ProxyRequests Off                    //关闭正向代理
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1      //开启fcgi反向代理
[root@Centos7 ~]# httpd -t
[root@Centos7 ~]# systemctl start httpd php-fpm.service

在这里插入图片描述

  • 配置wordpress跟mysql
[root@Centos7 ~]# tar xf wordpress-5.2.4-zh_CN.tar.gz -C /var/www/html
[root@Centos7 ~]# yum -y install mariadb-server php-mysqlnd
MariaDB [(none)]> CREATE DATABASE wordpress;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> GRANT ALL ON wordpress.* TO 'wordpress'@'localhost' IDENTIFIED BY 'wordpress';
Query OK, 0 rows affected (0.00 sec)

[root@Centos7 ~]# chown -R apache.apache /var/www/html/wordpress

/ 安装wordpress
http://172.20.54.4/wordpress

实验:php_fpm环境下虚拟主机设置

  • 新增虚拟主机配置文件
rm -f  /etc/httpd/conf.d/fcgi.conf     //将上个实验的fcgi配置文件删除
vim /etc/httpd/conf.d/vhosts.conf
DirectoryIndex index.php
<virtualhost *:80>
        ServerName "www.hello.com"
        DocumentRoot "/app/website1/"
        <directory /app/website1>
                require all granted
        </directory>
        ProxyRequests Off
        ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/app/website1/$1
</virtualhost>

<virtualhost *:80>
        ServerName "www.bye.com"
        DocumentRoot "/app/website2/"
        <directory /app/website2>
                require all granted
        </directory>
        ProxyRequests Off
        ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/app/website2/$1
</virtualhost>
  • 准备php文件
mkdir /app/website{1,2}
vim /app/website1/index.php 
<?php
echo "<h1>welcome to www.hello.com</h1>";
phpinfo();
?>

vim /app/website2/index.php
<?php
echo "<h1>welcome to www.bye.com</h1>";
phpinfo();
?>
  • 准备win10的hosts文件
c:\Windows\System32\drivers\etc\hosts
172.20.54.4 www.hello.com
172.20.54.4 www.bye.com
systemctl restart httpd

在这里插入图片描述
在这里插入图片描述


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值