回顾:httpd, lamp, mysql httpd:https, mod_deflate, …
httpd+php:三种结合方式 Module: prefork:libphp5.so worker, event:libphp5-zts.so CGI:通用网关接口 FastCGI
php连接数据库
mysql(mariadb): C/S: C --> mysql协议 --> S mysql协议主要传输SQL语句 php需要一个扩展模块,默认是不安装的 php-mysql amp-module: 静态资源:Client --> http协议 --> httpd (IO操作) php动态资源:Client --> http协议 --> httpd --> libphp5.so (IO操作) php动态资源:Client --> http 协议--> httpd --> libphp5.so (IO操作, php-mysql)--> mysql协议 --> mysqld
lamp(1)
静态资源响应速度快。 动态资源响应速度要比静态资源慢的多,服务器需要加载,执行动态资源,还可能需要访问数据,php再与数据库进行交互,获取数据资源。 应该尽量少的使用动态资源。一般遵循二八法则
php:嵌入式web应用编程语言
php及解析器(解释器)
作者:Rasmus Lerdorf, Personal Home Page tool, C语言(CGI,Web Forms), PHP/FI zeev, andi重写php的解析器, zend engine 1.0, php 4.0; zend engine 2.0 php 5.0(增强的面向对象,支持PDO(php数据对象,php与数据库交互式时,不仅能基于数据流的交换,还能基于对象的方式进行交换)机制)
php解析器
php解析器--编译成opcode--执行 解析器功能:词法语法句法分析等... scanning扫描,parsing分析,compilation,excution 提升opcode性能,使用opcodecache php加速器
解析器:两类
zend engine:编译 --> 编译为opcode, 执行 分解为4步:Scanning(Lexing(开源词法分析工具)词法分析), Parsing(语法分析), Compilation, Excution 编译成伪二进制格式,在zend引擎上执行。将php代码运行缩减为两部 hhvm:刚诞生的组件,但是应用的不多。运行效率更高。facebook研发的解释器 把php代码翻译成c++代码。
注:zend把php代码的执行分为两个阶段,第一阶段解析,第二阶段执行。编译的结果缓存下来,用户请求同一个资源则快了很多,不需要从编译,只需重新执行一次就可以,带来了效率的提升。 任何语言都需要解析器,分析,分解,语法分析,词法分析,然后才能编译。 php使用zend引擎
php加速器:
以httpd进程模型为例(prefork) httpd是以进程模型,为用户提供服务。php也是基于类似方式运行。一个php进程服务于一个httpd进程。php使用zend引擎,编译后的opcod缓存先来只能为与之对应的httpd进程服务。 但是如果其他httpd进程请求了同样的动态资源,就不能共享其opcode。zend不能跨进程为httpd服务提供共享缓存。
加速器:加速器在php的多进程之间放一段空间,将每个进程编译的opcode代码放到一个公共的空间。这个组件就是组件,opcache。
使用opcache提升性能2到3倍以上
XCache加速器
加速器有多种
APC (php的扩展模块),eAccelerator,XCache(较流行的)...
安装XCache,epel源。还有管理工具需要单独安装
使用ab测试,根据访问模型,可能测试不出来。ab -c50 -n1000 http://127.0.0.1/index.php
需要优化时修改其配置文件,rpm -ql php—xcache
php可以以类似worker方式运行,但是不同woker之间不能共享编译后的opcode,zend引擎也仅是对单个woker的线程有优化作用。后来则出现了加速器,实现不同php线程间共享opcode
APC,eAccelerator,XCache
XCache安装包获取途径epel源
XCache: XCache is a fast, stable PHP opcode and data cacher that has been tested and is now running on production servers under high load.
[root@localhost ~]# rpm -ql php-xcache /etc/php.d/xcache.ini ####定义xcache工作机制 /usr/lib64/php/modules/xcache.so /usr/share/doc/php-xcache-3.1.1 /usr/share/doc/php-xcache-3.1.1/AUTHORS /usr/share/doc/php-xcache-3.1.1/COPYING /usr/share/doc/php-xcache-3.1.1/ChangeLog /usr/share/doc/php-xcache-3.1.1/README /usr/share/doc/php-xcache-3.1.1/THANKS
安装httpd,php,mariadb-server,php-mysql,php-xcache [root@centos7 ~]# yum install mariadb-server php php-mysql php-xcache httpd php-mbstring -y 注意php-xcache使用epel源安装,yum仓库要配置epel源。
php要支持中就要安装php-mbstring这个扩展模块 php要支持mysql数据库就要安装php-mysql这个扩展模块
环境搭建完毕可使用php函数写一个测试页
可以看到系统环境的配置信息。
httpd配置信息 php及php扩展的配置信息 与mysql交互的配置信息
<?php phpinfo(); ?>
安装phpMyAdmin,可以实现web界面管理数据库。
php配置文件:/etc/php.ini, /etc/php.d/*.ini
ini: [section_id] directive = value 注释符; date.timezone = Asia/Shanghai 必须修改时区,否则系统会报错。默认事注释掉的。使用系统时区。 php.ini的核心配置选项: http://php.net/manual/zh/ini.core.php php.ini配置选项列表: http://php.net/manual/zh/ini.list.php 依赖于程序员的要求或压测结果进行优化php。没有统一标准化的配置。都是实际生产环境配置。配置安全方面,启用关闭某些模块... 配置文件中的配置项有说明事开发环境或是生产环境使用的。根据实际情况做调整。
httpd+php使用FastCGI模式结合
PHP FastCGI Process Manager 特别适用于繁忙的站点。
php是个独立的守护进程,用户可以独立的给php发送请求。适合繁忙的站点 监听在某个套接字上,基于某种并发方式相应前端的并发请求。
php-fpm
FastCGI的linux上实现是php的扩展模块php-fpm实现 同时httpd要支持php的FastCGI,与之通信,httpd也需要模块支持。
基于某个套接字与用户通信,httpd要扮演成客户端,去连接fastcgi服务端。 httpd要使用模块 fcgi proxy_fcgi_module (shared) httpd 代理用户访问php 只是个代理模块。作为反向代理用户访问动态资源。 2.2当中没有自带,需要重新编译。2.4中已经自带了。 fcgi服务类似一个简装版的httpd服务。httpd将用户请求通过fcgi协议发送给php,php从本地文件系统读取用户的url资源。
客户端与httpd服务器之间走的是http协议,httpd服务器与php动态资源服务器之间走的是FastCGI协议。
正向代理是面向有限的客户端请求,发送给任意服务器—服务于请求方 反向代理是代表有限几台服务器,可以响应所有用户请求。—服务于请求方
可以实现 三台服务实现
httpd一台服务器 php一台服务器 mysql一台服务器
还可以是实现扩展
实现多台httpd服务器提供静态资源服务器 实现多台php服务器提高动态资源 httpd 对多台php服务器,httpd相当于一个调度器,分发器 需要面对一个session的问题。需要在php服务器后端放置一个session-server 1、实现机制,识别同一个用户,固定到一个php服务器上 2、基于cookie绑定用户,缺点服务器挂了,此服务器上的用户也都挂掉 3、同步所有用户的session到每一台服务器。但是不是合适大规模使用。 4、使用共享存储,sessionsever实现,单独服务器实现。 一般使用redis数据库实现,简单的键值数据库。 使用多台session服务器,做主从,读写分离。 session服务器一般使用redis数据。redis并发能力大,
httpd只是个代理他不负责用户与php服务之间的session。php需要自己保持会话。 比如用户登录淘宝,下一次访问被httpd调度到另一台php服务上,用户就需要重新登录淘宝。所以php服务器集群需要session服务器来保持用户的会话为全局可以用。 要么httpd基于cooki同一以用户不调度,stick。
session服务器要与php加速器区分开。session是为php追踪用户使用的,加速器是为httpd服务使其访问相同资源可以使用之前缓存下来的opcode。
css,js部署到静态服务器上图片也存放于专用服务器。
平滑实现版本迭代。
FastCGI
FastCGI Process Manager, an alternative PHP FastCGI implementation with some additional features useful for sites of any size, especially busier sites.
php与httpd结合不能多种方式并存,只能满足一个
要么安装 php 要么安装 php-fpm
centos7中 httpd需要的反代模块和php-fpm都有rpm包 centos6中 都没有rpm包,又需要去epel源中去找。
安装方式:
centos7上 yum install httpd php-fpm php-mysql php-mbstring mariadb php-xcache -y
# yum install php-fpm 主程序:/usr/sbin/php-fpm Unit File:/usr/lib/systemd/system/php-fpm.service 配置文件: ini:配置php解释器工作环境; /etc/php.ini, /etc/php.d/*.ini conf:配置fpm守护进程的工作模式;怎么与客户端交互的(httpd) /etc/php-fpm.conf, /etc/php-fpm.d/*.conf
配置:
/etc/php-fpm.conf
[global] ##全局配置 daemonize=no ###是否运行为守护进程,在centos7上为no,centos7上使用systemd管理系统进程,不需要以守护进程方式运行,而是由systemd托管。centos6上的值都为yes
/etc/php-fpm/www.conf
[pool-id] ###配置连接池 listen = 127.0.0.1:9000 listen.backlog = -1 超出请求最大值的队列长度,-1表示没有上限 listen.allowed_clients = 127.0.0.1 user = apache ##运行子进程的身份属主 group = apache ##运行子进程的属组 pm = dynamic ###进程管理器定义是动态还是静态。 定义 process管理机制:static, dynamic static:服务启动时创建出所有子进程; dynamic:根据用户请求量的变化来维护子进程数量; pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 35 pm.max_requests = 500 pm.status_path = /status ###php的内建状态页面,于httpd的内建页面重名,要同时使用需要修改。 rlimit_files = 1024 ##用户所能打开的文件数 rlimit_core = 0 ##核心可以占据多少空间,不会被内存管理交换出去 php_value[session.save_handler] = yes php_value[session.save_path] = /var/lib/php/session
要使用session会话功能需要创建/var/lib/php/session/这个目录并授权给apache用户
回顾:
php:php core + php extensions php core: httptd modules(php):libphp5.so 配置文件:/etc/php.ini, /etc/php.d/*.ini restart|reload httpd fastcgi(php-fpm):php-fpm daemon 守护进程的配置文件:/etc/php-fpm.conf, /etc/php-fpm.d/*.conf 配置文件:/etc/php.ini, /etc/php.d/*.ini restart|reload php-fpm php extensions: php-mysql, php-redis, php-mongodb php-mbstring php-xcache php-mcrypt ... fcgi协议协议: httpd:proxy_module, proxy_fcgi_module ProxyRequests Off ProxyPass ProxyPassMatch ^(URL-PATTERN)$ fcgi://FCGI-SERVER:PORT/PATH/TO/DIR/$1 fpm: pm=static|dynamic pm.max_children pm.min_spare_servers pm.max_spare_servers
fpm配置:
fpm配置虚拟主机反代配置示例1:
<VirtualHost *:80> ServerName www.magedu.com DocumentRoot "/vhosts/www" <Directory "/vhosts/www"> Options None AllowOverride None Require all granted </Directory> ProxyRequests Off ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/vhosts/www/$1 DirectoryIndex index.php index.html </VirtualHost>
fpm配置虚拟主机反代配置示例2:
<VirtualHost *:80> ServerName www.magedu.com DocumentRoot "/vhosts/www" <Directory "/vhosts/www"> Options None AllowOverride None Require all granted </Directory> ProxyRequests Off ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/vhosts/www/$1 ProxyPassMatch ^/(pm-status|ping)$ fcgi://127.0.0.1:9000/$1 DirectoryIndex index.php index.html </VirtualHost> http://WEB_SERVER:PORT/pm-status pool: www # 连接池名称 process manager: dynamic # 进程管理器类型 start time: 26/Sep/2016:15:10:26 +0800 # 启动时间 start since: 7437 # 运行时长 accepted conn: 6 # 连接池已经处理过的总请求数 listen queue: 0 # 队列的长度 max listen queue: 0 # 请求队列的最大长度 listen queue len: 128 # socket等待队列的最大长度; idle processes: 4 # 空闲的进程数; active processes: 1 # 活跃的进程数量; total processes: 5 # 总进程数; max active processes: 1 # 连接池当中过去最大活跃进程度; max children reached: 0 # 进程数量达到连接池上限的次数; slow requests: 0 # 慢请求的数量; 其它格式的输出: /pm-status?json /pm-status?xml /pm-status?html /pm-status?full full格式的输出: pid: 33095 state: Idle # 当前进程的状态,idle, running, ... start time: 26/Sep/2016:15:10:26 +0800 # 进程启动的日期时间 start since: 7968 # 运行时长 requests: 2 # 处理过的请求数量 request duration: 112 # 请求处理过程的时长 request method: GET # 请求方法 request URI: /pm-status?html # 请求的URL content length: 0 # 请求内容的长度,POST方法才有意义 user: - # 用户 script: - # php脚本; last request cpu: 0.00 # 最近一次请求消耗CPU last request memory: 262144 # 最近一次请求消耗的内存量
注意:
httpd-2.2默认没有自带fcgi模块;php-5.3.3-默认不支持fpm,需要打补丁方可;
CentOS 6.X:部署;amp –fpm
# yum install httpd mod_proxy_fcgi php-fpm php-mysql mysqld-server
编译安装amp:
(1) 系统环境:
CentOS 6:apr, apr-util的版本为1.3.9,不适用于httpd-2.4; CentOS 7:apr, apr-util的版本为1.4+, (2) 开发环境: Development Tools, Server Platform Development (3) 各程序版本 httpd: 2.2, 2.4 php:5.3.x 5.4.x, 5.6.x mysql:5.1, 5.5, 5.6, 5.7, 5.8, 8.0 mariadb:5.x, 10.x (4) httpd+php php的编译选项: Modules:--with-apxs httpd MPM: prefork: worker, event:专用选项--enable-maintainer-zts ftm:--enable-fpm
CentOS 7:httpd-2.4, mariadb, php-5.4
安装次序:httpd, mariadb, php
安装MariaDB:
预制的包管理器格式的程序包: rpm包: os vendor:mariadb-devel MariaDB官方 通用二进制格式的程序包: 源码包编译:项目构建工具为cmake, 而非流行的make;
通用二进制格式包的安装配置步骤:
# useradd -r mysql # tar xf mariadb-VERSION-linux-x86_64.tar.gz -C /usr/local/ # cd /usr/local/ # ln -sv mariadb-VERSION-linux-x86_64 mysql # cd mysql # chown -R root:mysql ./* # mkdir -pv /mydata/data # chown -R mysql.mysql /mydata/data # scripts/mysql_install_db --user=mysql --datadir=/mydata/data --skip_name_resolve # cp support-files/my-large.cnf /etc/my.cnf [mysqld] ....... datadir = /mydata/data skip_name_resolve = ON innodb_file_per_table = ON # cp support-files/mysql.server /etc/rc.d/init.d/mysqld # chkconfig --add mysqld
httpd-2.4:
~]# yum install pcre-devel openssl-devel libevent-devel apr-devel apr-util-devel -y # ./configure --prefix=/usr/local/apache2 --sysconfdir=/etc/httpd --enable-so --enable-ssl --enable-cgi --enable-rewrite --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork --with-pcre --with-zlib --with-apr=/usr --with-apr-util=/usr # make -j # # make install # echo 'export PATH=/usr/local/apache2/bin:$PATH' > /etc/profile.d/httpd.sh # . /etc/profile.d/httpd.sh # apachectl start
安装php5:
(1) 作为httpd的模块安装: # ./configure --prefix=/usr/local/php5 --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-openssl --enable-mbstring --enable-xml --enable-sockets --with-freetype-dir --with-gd --with-libxml-dir=/usr --with-zlib --with-jpeg-dir --with-png-dir --with-mcrypt --with-apxs2=/usr/local/apache2/bin/apxs --with-config-file-path=/etc/php.ini --with-config-file-scan-dir=/etc/php.d/ # make -j # && make install 注意:如果mpm为线程模型,则需要额外使用--enable-maintainer-zts (2) 安装为fpm: # ./configure --prefix=/usr/local/php5 --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-openssl --enable-mbstring --enable-xml --enable-sockets --with-freetype-dir --with-gd --with-libxml-dir=/usr --with-zlib --with-jpeg-dir --with-png-dir --with-mcrypt --enable-fpm --with-config-file-path=/etc/php.ini --with-config-file-scan-dir=/etc/php.d/ # make -j # && make install 复制配置文件: cp php.ini-production /etc/php.ini 编译php为httpd的模块后,整合php至httpd: 编译httpd.conf,添加: DirectoryIndex index.php index.html AddType application/x-httpd-php .php
练习1:
(1) 模块化的php编译amp,fpm化的php编译amp; (2) 两个虚拟主机; (a) https, 部署pma; (b) 部署discuzX; 练习2: 脚本实现编译安装过程,要求安装于/usr/local/lamp/目录中;
php-xcache 有图形话的管理工具
xcache-admin使用有rpm包可以使用
需要配置php-xcache的配置文件
/etc/php.d/xcache.ini [xcache.admin] xcache.admin.enable_auth = On ; use http://xcache.lighttpd.net/demo/cacher/mkpassword.php to generate your encrypted password xcache.admin.user = "yang" xcache.admin.pass = "46f94c8de14fb36680850768ff1b7f2a" ####必须使用MD5加密的密码,32为的MD5密码 用户名yang 密码123qwe
安装上xcache-admin
此web服务需要使用https连接,所以需要配置ssl服务,不配置可以使用。
需要修改其配置文件为如下,默认的配置文件是为httpd2.2准备的。 没有对目录授权 默认使用本地访问
# Configure XCache Administration Alias /xcache /usr/share/xcache <Directory /usr/share/xcache> <IfModule mod_authz_core.c> # Apache 2.4 Require local </IfModule> <IfModule !mod_authz_core.c> # Apache 2.2 Order Allow,Deny Allow from All </IfModule> Options Indexes AllowOverride None Require all granted </Directory>
原创文章,作者:yyw,如若转载,请注明出处:http://www.178linux.com/56554