一、LAMP概述二、安装与配置LAMP三、深入理解LAMP(yum)四、Xcache五、php-fpm一、LAMP概述LAMP: A:apache,M:mysql/Mariadb,P:php/perl/python httpd:接受用户的所有请求{动态/静态};静态直接响应,动态资源为php脚本,对此类资源的请求,交给php来运行,并将运行结果返回httpd PHP:运行php程序 Mariadb:数据管理系统;WEB资源类型 静态资源:原始形式与响应内容一致 动态资源:原始形式通常为程序文件,需要在服务器端执行之后,将执行结果返回给客户端 客户端技术:javascript 服务器端技术:php,jsp1.CGIcommond gateway interface //是一种标准 可以让一个client,从网页浏览器向执行在网络服务器上的程序传输数据;CGI描述了客户端和服务器程序之间传输的一种标准 client---[内核空间]-----{http_s-----后台应用程序} c获取到的内容中有需要填写的表单,c填好后,发送给http_s,http_s通过cgi协议,发送给其他应用程序,进行接受执行 获取到的数据,可以看做是后台应用程序运行的参数信息 CGI:可以与众多的,php,perl,c,c++进行交互 子进程的目的:是为父进程完成某一个目的的 父进程可以生成多个子进程如图一:
CGI默认是没有启动的,client请求httpd服务: 静态:向本地的内核发起系统调用,通过IO请求,加载本地文件,返回即可 动态:httpd进程通过cgi协议,向后端运行cgi程序的环境,提请一个进程,加载到cgi脚本到用户空间,让子进程运行;子进程运行的结果用cgi协议返回给server 静态:client--http-->httpd 动态:client--http-->httpd--->cgi-->libphp5.so() 可以把libphp5.so理解为php引擎 动态资源:client--[http]-->httpd--->libphp5.so()--[mysql]--->mysql server //php自己是不会和mysql交互的,但是php中的代码可能用到mysql对于http来说,我返回的都是纯文本数据流,//动态的返回的也是运行后的结果而已 http负责响应client请求以及管理后端的cgi进程程序=指令+数据数据模型:分类 1.概念数据模型 现实世界--[抽象]---信息世界---[转换]----计算机世界 2.逻辑数据模型: //对应的数据库称之为关系型数据库,如MySQL,在1的基础上加了各个实体的属性 层次模型: 网状模型: 关系模型:execl行和列,就是一种关系,表和表之间也可能有关系 3.物理数据模型://数据在物理介质上的具体组织结构 关系模型:Oracle,Sybase,Infomix //后两个的定位太具有前瞻性 IBM:DB2,SQL Server[联合sybase做的],MySQL,PostgreSQL, MySQL-->MariaDB指令:代码文件数据:数据存储系统、文件 client======httpd_s=======cgi运行环境=======数据存储系统 http协议 cgi协议 mysql协议请求流程: clinet-httpd协议-->httpd[动态]---cgi协议-->application server(program file)---mysql协议--->mysql server连接Mysql的组件,是mysql驱动2.php:通用编程语言 PHP是通用服务器端脚本编程语言,其主要用于web开发以实现动态web页面,它也是最早实现将脚本嵌入HTML源码文档中的服务器端脚本语言之一。同时,php还提供了一个命令行接口,因此,其也可以在大多数系统上作为一个独立的shell来使用。 1999.Zend Enginx1.0,PHP4.0诞生 2004.Zend Engine2.0 PHP5.0 编译:opcode[php编译后的中间语言] 执行:opcode拿到引擎上执行 Zend Engine:PHP的解释器,将php代码的处理分成了两段 编译阶段:运行阶段 PHP--Zend Opcode{二进制格式,类似java字节码}存储于内存中--->使用Zend Engine去执行OpcodeOpcode是一种php脚本编译后的中间语言,PHP的脚本代码四个阶段 1.Scanning(Lexing)将php代码装换为语言片段(Tokens) 2.Parsing--将Tokens转换成简单而有意义的表达式 3.Compilation--将表达式编译成Opcode 4.Execution--顺次执行Opcode,每次一条,从而实现PHP脚本的功能 扫描-->分析-->编译--->执行 //scanning-->parsing-->Comilation--->Excution //生成的Opcode可以复用,实现加速PHP加速器 基于pHP的特殊扩展机制和opcode缓存扩展也可以将opcode缓存于php共享内存中,从而可以让同一段代码的后续重复执行时跳过编译阶段直接运行,提高性能。 这些加速器,并非真正提高了opcode的运行速度,而仅是通过分析opcode后并将它们重新排列已达到快速执行的目的 1.APC:Alternative PHP Cache //遵循PHP License的开源框架,PHP opcode缓存加速器,目前的版本不适用于PHP 5.4。项目地:http://pecl.php.net/package/APC。 2.eAcceleator //源于Turck MMCache,早期的版本包含了一个PHP encoder和PHP loader,目前encoder已经不在支持。项目地址, http://eaccelerator.net/。 3.XCache http://xcache. //快速而且稳定的PHP opcode缓存,经过严格测试且被大量用于生产环境。项目地址,http://xcache.lighttpd.net/ 4.Zend Optimlzer和Zend Guard Loader //Zend Optimizer并非一个opcode加速器,它是由Zend Technologies为PHP5.2及以前的版本提供的一个免费、闭源的PHP扩展,其能够运行由Zend Guard生成的加密的PHP代码或模糊代码。 而Zend Guard Loader则是专为PHP5.3提供的类似于Zend Optimizer功能的扩展。项目地址,http://www.zend.com/en/products/guard/runtime-decoders 5.NuSphere PhpExpress //NuSphere的一款开源PHP加速器,它支持装载通过NuSphere PHP Encoder编码的PHP程序文件,并能够实现对常规PHP文件的执行加速。项目地址,http://www.nusphere.com/products/phpexpress.htmPHP:脚本编程语言,嵌入到html中的嵌入式web程序开发语言 无需编译,zend以后可以编译了,基于zend编译成opcode(二进制的字节码,重复运行,可省略编译环境) 3.php与http结合的方式 CGI //通过cgi协议,不常见,传统模式,创建子进程完成后销毁,不建议 FastCGI //可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式) modules //模块方式,用的最多,把php编译成httpd的模块,当有人请求动态资源的时候,就不必启动一个php或者cgi进程来单独响应了 //httpd直接利用该模块运行即可 二、安装与配置LAMP http2.4与php-5.5.28的通信方式。基于cgi通信:不建议基于fastcgi 通信:安装配置脚复杂,这需要将PHP独立出来专门执行.php的代码。相较于模块安装响应速度快。 //php-fpm: 启动为服务进程基于module 的通信:安装配置方便但速度较慢。 prefork模式需要的模块:libphp5.so worker, event模式需要的模块:libphp5-zts.so编译安装:如何实现1)编译安装php-5.5
[root@example.com ~]# tar xf php-5.5.28.tar.gz[root@example.com ~]# cd php-5.5.28[root@example.com php-5.5.28]# yum groupinstall Development tools Server Platform Development -y[root@example.com php-5.5.28]# yum -y groupinstall Desktop Platform Development[root@example.com php-5.5.28]# yum -y install bzip2-devel libmcrypt-devel libxml2-devel openssl-devel[root@example.com php-5.5.28]# ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --with-apxs2=/usr/local/apache/bin/apxs --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --enable-maintainer-zts[root@example.com php-5.5.28]# make && make install
1、为了支持apache的worker或event这两个MPM,编译时使用了--enable-maintainer-zts选项。2、如果使用PHP5.3以上版本,为了链接别处MySQL数据库,可以指定mysqlnd,这样在本机就不需要先安装MySQL或MySQL开发包了。mysqlnd从php 5.3开始可用,可以编译时绑定到它(而不用和具体的MySQL客户端库绑定形成依赖),但从PHP 5.4开始它就是默认设置了。# ./configure --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd2)配置httpd
[root@example.com php-5.5.28]# vim /etc/httpd/httpd.confLoadModule php5_module modules/libphp5.so //查看此模块是否加载#在文件内添加下面的内容,位置最好在AddType下面的行: AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps#在此行中添加index.phpDirectoryIndex index.php index.html
3)测试环境
[root@example.com php-5.5.28]# cd /usr/local/apache/htdocs/[root@example.com htdocs]# vim index.php
4)mysql授权mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.%.%' IDENTIFIED BY 'redhat' ;Query OK, 0 rows affected (0.20 sec)浏览器登录查看是否连接成功yum安装实现:Centos7yum install php mariadb httpdsystemctl reload httpd 1.测试php: cd /var/www/html;vim index.php <?php phpinfo();?> 2.测试mariadb和phpCentOS6:httpd,php,mysql-server,php-mysqlCentOS7:httpd,php,mariadb-server,php-mysqlmysql -uroot -h127.0.0.1 -p //初始密码为空支持SQL语句对数据管理DDL,DML,DCL DDL:create,alter,drop,show DML:instert,delete,select,update授权能够远程的链接用户 granto all privileges on db_name.table_name to username@host identified by "passwd" grant all on testdb.* to testuser@'192.168.4.%' identified by 'testuser'; flush privilegesvim /etc/my.cnf [mysqld] skip_nameresolve on//关闭mysql反解,ip为用户名systemctl restart mariadb//假如没有ok的话, yum install php-mysql serivice httpd reload测试页面<?php $conn = mysql_connect('192.168.4.100','testuser','testuser'); if ($conn) echo "OK"; else echo "False"?>3.安装wordpress
yum install wordpress -y[root@node103 html]# ln -sv /usr/share/wordpress/ wordpress[root@node103 html]# cp /usr/share/wordpress/wp-config-sample.php /etc/wordpress/wp-config.php 预先在数据库中创建一个库给wordpress用。cp wp-config-sample.conf.php wp-config.phpMariadb:grant all on wordpress.* to wordpp@'127.0.0.1' identified by 'wordpp'vim wp-config.php修改对应信息
三、深入理解LAMP服务器自身存储有error_page: /usr/share/httpd/error/ :错误页面可以自定义静态资源处理模型://如图 静态:client-->内核空间-->用户空间[httpd进程]-->内核空间-->加载磁盘文件--->[内核空间]--->用户空间[httpd进程封装]->[内核空间]-->发送给用户Send file机制://用的不多,在内核中直接构建响应。 client--httpd请求-->内核空间-->加载磁盘文件[封装]-->发送给client prefork或者worker模型: 进程睡眠:不可中断睡眠+可中断睡眠 一次IO:数据从磁盘到用户空间,在此阶段进程处于阻塞状态[睡眠],IO结束,则唤醒进程 一个进程进来后:加载文件的时候,该进程处于阻塞,其他请求是进不来的 在一个进程处理多个请求的http模型的时候 event就是这种机制: 基于callback机制,该进程在等待IO完成的过程中,也可以接受其他请求,内核在资源加载完成后,callback该进程,让进程完成后续操作 :该进程复制内核空间已经加载的请求所需数据,然后复制到用户空间的内存中 水平触发:数据加载完毕,我通知你来复制,没有回应,就再次通知 边缘触发:只通知一次 IO: 阻塞IO和非阻塞IO 同步IO和异步IO AIO:异步IO //内核加载好数据后,直接复制数据到进程可访问内存中,告诉进程ok了 IO过程分两段: 1.进程向内核发起调用 2.内核从disk加载然后送到进程可访问内存,然后告诉进程ok了 用户发起调用就有了两种模式: 阻塞:我就一直等着,加载完成,再继续下一个流程 非阻塞:基于事件驱动机制,基于epoll()调用实现event driven, 动态资源: 如果php和mysql在同一个主机上,基于unix socket会更快//让mysql监听unix socket上 必须监听在127.0.0.1或者localhost主机名才能基于unix socket mysql对用户名和主机名(ip)特别敏感://ip和主机名必须对应 php和http结合主要适合modules,cgi用的很少//注:moudle和fcgi不能共存cgi:http进程接收到一个动态网页请求,于是fork一个子进程,运行php引擎,加载并执行php脚本,最后返回结果给主进程 假如有200个请求,http就需要创建200个子进程,而且cgi不能被复用 每次都需要创建子进程,然后销毁子进程 基于cgi只能在同一个主机上,mysql只能在本地fastcgi:把php运行为一个服务,监听在一个套接字上,这个服务有主控进程,可以根据需要创建空闲进程,不再需要httpd自己创建 php服务直接处理和响应http请求,以及回复,类似于prefork模型 php=http===>httpd===fastcgi===>php 服务器 监听在套接字,可以跨主机使用 yum install php-fpmclient---[http]--->httpd---[fastcgi]-->php 服务器---[mysql]--->mysqld http扮演fastcgi的客户端[加载mod_proxy_fcgi],帮忙请求php服务器, php扮演mysql的客户端,请求mysql_s中的数据 //php中有专门链接mysql的库,调用该库即可 http2.2默认没有fcgi模块,不能使用fcgi http2.4,mode_proxy_fcgi CentOS7: 1.[Modules]httpd,php,php-mysql,mariadb-server 2.[FastCGI]httpd,php-fpm,php-mysql,mariadb-server //这两种不能同时使用CentOS6: httpd,php,php-mysql,mysql-server //fast-cgi需要编译安装 PHP:脚本语言解释器 配置文件:/etc/php.ini,/etc/php.d/*.ini 配置文件在php解释器启动时被读取,因此对配置文件的修改如何生效? Modules:重启httpd服务 FastCGi:重启php-fpm服务 CGI:会自动修改,http单独启动该进程rpm -ql php-common //提供php.ini配置文件/etc/php.ini [foo]:开头 directive = value 注释符号: # 纯粹的注释信息 ; 可启用的directoryphp.ini核心配置选项文档:php.net/manual/zh/ini.core.php php.ini配置选项列表:php.net/manual/zh/ini.list.php date.timezone = Asia/Shanghaisystemctl start httpd Mariadb(mysql)数据模型:层次模型,网状模型,关系模型关系模型: 二维关系: 表:row,column 索引:index 视图:view //保存的是一个语句 SQL接口:Strunctured Query Language 类似于OS的shell接口;也提供了编程能力 ANSI:SQL标准,SQL-86,SQL-89,SQL-92,SQL-99,SQL-03 例如SQL-86有中级,低级和高级,一般只能达到中级 DDL:data define language create,alter,drop DML:date mantapulating language //操作 insert,delete,update,select DCL:date control language 是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句 grant,deny,revoke 编程接口:选择、循环 SQL代码: 存储过程:storge 存储函数:function 触发器:trigger 事件调度器:event scheduler 附件一.fcgi的实现fastcgi将PHP从httpd中独立出来,httpd用来处理用户的请求,遇到PHP代码就将其转到后方的php-fpm服务器,释放了httpd服务器的压力(专注于处理静态的内容),http作为反向代理,需要安装proxy-fcgi模块。然而生产环境中有专门做方向代理的服务器有HA-proxy和nginx,这两种的处理请求方面的速度远远大于httpd本实验只是学习下httpd是如何工作于反向代理的模式,httpd-2.2所带的模块没有proxy-fcgi,需要下载proxy-fcgi源码编译安装,而httpd-2.4就直接安装的有此模块,此实验就是基于httpd-2.4的。实验环境:CentOS7,Mariadb-server,http2.4.6,yum install mariadb-server php httpd php-mysql php-fpm php-xcache//php -m验证意境加载的模块=====================================================1.配置httpd
cat /etc/httpd/conf.modules.d/00-proxy.conf //已经配置 LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so LoadModule proxy_scgi_module modules/mod_proxy_scgi.so/etc/httpd/conf.modules.d/00-mpm.conf //修改默认http工作模型cat 01-cgi.conf // LoadModule cgid_module modules/mod_cgid.so LoadModule cgid_module modules/mod_cgid.so LoadModule cgi_module modules/mod_cgi.sovim httpd.conf #在文件内添加下面的内容,位置最好在AddType下面的行: AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps
2.配置 [root@node112 httpd]# cp /etc/php-fpm.conf{,.bak}[root@node112 httpd]# vim /etc/php-fpm.d/www.conf //主配置文件为/etc/php-fpm.conf #配置fpm的相关选项为你所需要的值m.max_children = 50 #最大子进程数pm.start_servers = 5 #开机预启动子进程数pm.min_spare_servers = 2 #最小空闲子进程数pm.max_spare_servers = 8 #最大空闲子进程数启动php-fpm,查看是否正常启动:[root@example.com etc]# service php-fpm start[root@example.com etc]# ss -tunl |grep 9000tcp LISTEN 0 128 127.0.0.1:9000 3.配置index.php <h1><?php phpinfo();?>4.配置Xcache[root@node112 html]# vim /etc/php.d/xcache.iniextension = xcache.so //也可以使用绝对路径,yum安装的意境配置好status界面查看Xcache是否启动 //php -m |grep -i xcache httd的工作模型:prefork,worker,event //httpd -M |grep 看当前工作模型四、Xcache 1.Xcache的实现的加速phpyum install php-xcachexcache-admin 类似于phpmyadmin配置文件;/etc/php.d/xcache.inixcache是在内存中缓存的vim xcache.ini //不用修改 xcache.size = 60M 缓存大小 xcache.slots = 8K //每个槽大小 xcache.ttl = 0systemctl restart php-fpm.service测试页:phpinfo(); 会显示xcache的信息xcache和module的php结合xcache和php-fpm结合关闭xcache,移走配置文件,重启服务即可xcache在centos7上效果不是很明显 2.编译安装xcache其他都是rpm包安装的1.yum install php-devel tar xf xcache-3.2.0 cd xcache-3.2.0 phpize //生成config文件,因为是php的组件,所以php告诉其当前php的环境是什么 //配置php编译环境 ./confiure --enable-xcache -with-php-config=/usr/bin/php-config //后面的可以不给 make && make install /usr/lib64/modules/ 安装到了目录 cp 源码包/xcache.ini /etc/php.d/xcache.ini systemctl restart httpd //因为默认php是编译到http中的编译安装的加速效果比rpm包要好 最多并发500已经达到上限了
ab -n 1000 -c 100 http://192.168.4.100/pmd/index.php //总共1000个,一次100个ab命令结果解释Concurrency Level: 100 //并行级别,同时100个请求Time taken for tests: 19.233 seconds //Complete requests: 1000 //在这100个并发请求上,请求了1000次Failed requests: 0Total transferred: 8336614 bytesHTML transferred: 7540000 bytes //整个场景中的HTML内容传输量Requests per second: 51.99 [#/sec] (mean) //每s处理的请求数量,平均值Time per request: 1923.346 [ms] (mean) //每个请求需要的时间,1923/100是单个请求所需时间,mean:平均值Time per request: 19.233 [ms] (mean, across all concurrent requests)Transfer rate: 423.28 [Kbytes/sec] receivedConnection Times (ms) min mean[+/-sd] median max Connect: 0 5 60.6 0 1328 //建立链接Processing: 53 1888 2110.5 1090 9474 //处理过程Waiting: 40 1823 2044.5 1052 8825 //等待c接受请求Total: 75 1894 2112.6 1091 9476Percentage of the requests served within a certain time (ms)50% 109366% 124775% 137380% 149390% 406195% 439898% 560899% 7368100% 7785 (longest request)
整个场景中所有请求的响应情况。在场景中每个请求都有一个响应时间,其中50%的用户响应时间小于1093 毫秒,60% 的用户响应时间小于1247 毫秒,最大的响应时间小于7785 毫秒由于对于并发请求,cpu实际上并不是同时处理的,而是按照每个请求获得的时间片逐个轮转处理的,所以基本上第一个Time per request时间约等于第二个Time per request时间乘以并发请求数 测试尽量在远程主机上测试 c----http_s //c发送到s http_s------响应 //获取资源,运行完毕,构建响应报文 https_s----发往c //s构建后发送到c 第一阶段:慢:服务器负载较大,带宽 第二阶段:s自身处理速度慢 第三阶段:带宽有限,c接受能力有限注:phpmyadmin假如出现,不能打开/var/lib/php/sesion等信息 1.创建目录 2.chown -R apache.apache 五、php-fpmLAMP: httpd+php: module: //php包 cgi fcgi:php工作为一个服务 //php-fpm包 php-fpm: 有主进程,接受请求后,生成子进程[事先也有创建的],响应用户请求 类似于httpd的prefork模型 yum list all |grep php //查看mpm模块1.php-fpm事先yum install php-fpmrpm -ql php-fpm /etc/php-fpm.conf /etc/php-fpm.d/www.conf /etc/sysconfig/php-fpm //脚本配置文件 /usr/lib/systemd/system/php-fpm.serviceCentOS6: PHP-5.3.2之前默认不支持fpm机制,需要自行打补丁,并编译安装 http-2.2:默认也不支持fcgi协议,需要自行编译此模块 解决方案:编译安装httpd-2.4[自带了fcgi协议],php-5.3.3之后的版本,自带了fpmCentOS7: httpd-2.4:默认编译支持了fcgi模块, 同时提供了php-fpm包 配置文件: /etc/php-fpm.conf,/etc/php-fpm.d/*.conf 用于配置php进程,专用于fpm /etc/php.ini //php环境主配置文件 /etc/php-fpm.conf Pool Defination /定义php链接池的位置如图三: httpd根据请求的后缀,例如.php ,将该请求转发到php引擎,但是此时php依旧不是模块 静态资源:httpd自己去取并封装返回请求 动态:调用自己的fpm代理模块httpd使用fcgi的一个反代理模块,把用户请求给反向代理,发送给fpm进程 分析该请求[url],先加载程序文件,加载后,使用子进程运行,子进程运行完后,返回给fcgi模块 主进程:接受fcgi模块的请求,加载程序文件 子进程:运行该脚本,发送给fcgi,封装fcgi协议fpm和httpd可以不在同一个主机上 1.fpm需要监听在一个能够与httpd通信的地址上 2.动态资源应该部署在php主机上,静态放在http主机上 2.//从httpd-php
1.配置vim /etc/php-fpm.d/www.conf listen = 127.0.0.1:9000 listen.backlog = -1 //等待队列的长度,-1无限制 listen.allowed_clients = 127.0.0.1 //允许的主机 pm = static/dynamic static:固定数量的子进程,pm.max_children dynamic:子进程以动态模式工作,下面4个都包括 pm.max_children //最大并发连接数 pm.start_servers //启动 pm.min_spare_servers pm.max_spare_servers pm.max_requests = 500 //最多处理请求数 注:一般max_spare_server大于start_children 2.systemctl start php-fpm systemctl status php-fpm yum install httpd httpd -M |grep fcgi //查看fcgi模块是否装载 cat /etc/httpd/conf.modules.d/00-proxy.conf LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so 3.vim /etc/httpd/conf.d/fcgi.conf //创建配置文件 代理分为:正向和反向 ProxyPassMatch ^/(.*.php)$ fcgi://127.0.0.1:9000/var/www/html/$1 ^/ :引用的是/var/www/html :指定的httpd的根目录 $1 :引用的是(.*.php) 的内容 例如www.mt.com/admin/index.php ,$1引用的是admin/index.php ================================================= ProxyRequests off ProxyPassMatch ^/(*.php)$ fcgi://127.0.0.1:9000/var/www/html/$1 =========================================== httpd -t systemctl restart httpd 4.创建测试页: vim index.php http://192.168.4.100/index.php //需要加上index.php Server API FPM/FastCGI vim /etc/httpd/conf.d/fcgi.conf DirectoryIndex index.php //装载默认主页 ProxyRequests off //关闭正向代理 ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1 //发送*.php主页到 http://192.168.4.100/ //将能够使用 5.虚拟主机 取消DocumentRoot mv cgi.conf vhosts.conf vim vhosts.conf DirectoryIndex index.phpServerName www.b.net DocumentRoot /www/b.net/htdocs/ ProxyRequests off ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1 Options None AllowOverride None Require all granted
//创建多个vhosts 3.从php(fpm)-mysql yum install mariadb php-mysql vim my.cnf skip_name_resolve = ON 授权一个用户:wolf ,wolf 测试页: <h1> www.test.com </h1> <?php $conn = mysql_connect('192.168.4.100','wolf','wolf'); if ($conn) echo "OK"; else echo "failuser"; ?> 注:php必须以分号为行尾,而且 systemctl reload php-fpm systemctl stop mariadb55 再次测试 数据模型:http://www.cnblogs.com/yue-blog/p/5989191.html逻辑数据模型:http://www.cnblogs.com/yue-blog/p/6010527.html参考博客:https://blog.51cto.com/cuchadanfan/1688813