第一章、LAMP部署
一、模块加载方式
httpd结合php时使用的模块加载方式:
1、 module:rpm安装方式默认方式,就是说RPM安装默认就安装好了,不需要自己设置。
工作方式:httpd自己生成一个php的子进程,并解释php脚本语言。
2、CGI(不常用)
工作方式:需要本地安装php程序,并单独生成一个php进程。
3、FASTCGI:httpd-2.2不支持fstcgi,需要打补丁,2.4及以上的支持fastCGI。
工作方式:动静分离的前提条件,php程序生成一个独立的进程并且以套接字的方式对外提供服务,httpd生成一个php的客户端请求发给php服务器。
Linux系统架构师必备--LAMMP架构详解:http://edu.51cto.com/lession/id-75729.html
二、LAMP架构模型
这里的memcached缓存服务器要求php应用程序支持,就是说通过php开发出来的应用程序要支持memcached功能,否者缓存无效,比如php软件开发的wordpress论坛程序,要能使用memcached,需要在开发Wordpress的时候设计成支持它。
如果一台memcached不够用的话,添加新的缓存服务器,如何缓存和查询呢?
php应用程序通过“一致性hash算法”来分别向不同的memcached上存储数据,并记录下来存储位置,然后当需要读缓存的时候在通过记录的位置进行精确查询。
redis是更高效的键值存储程序,有缓存的特点,键值存储和内存存储。
传统web服务器都是采用静态页面方式,对系统要求比较低,可以将web应用程序同网页放在相同的服务器上即可,随着动态网页的兴起和用户访问数量的递增,传统单台服务器不能满足要求了,因为动态网页服务器要求使用web应用程序,数据库以及动态开发程序,这个开发程序可以是php、jsp,他是动态网页和数据库进行交互的程序,而实现与数据库真正通讯需要的是数据库驱动程序,当然不同的动态开发程序与数据库的驱动链接的驱动是不同的。
应用程序要和数据库通信同样要遵循一定的规范和标准,这个标准就是由odbc来制定的,对于php和MySQL之间进行通信就要使用php-odbc协议了,并且应用程序和数据库之间也需要驱动程序,这个驱动程序就是PHP-mysql啦。
而通常通过最简单的yum安装php的话,默认安装php需要的依赖包只有php主程序,php-cli、php-common即可。
如果要和MySQL通信就需要再安装php-odbc、php-mysql啦。
当用户访问量增加,一台服务器的应用程序不能满足要求的时候就可以创建多个,这个能力称为伸缩性。当有多台数据库服务器时,只可以有一台服务器为可以进行写操作的,其他服务器与这台主服务器进行数据同步,但可以担任查询的功能。也就是说在应用程序进行写操作时只可以与主数据库通讯,当进行查询的时候可以和任意数据库通讯。
为了简化通讯,设计了中间件即实现应用程序和数据库之间的通讯,类似路由转发的功能。
当然由于web服务会有一个28法则,就是最常访问的数据往往是总数据的20%,可以将这个20%的数据进行缓存,包括本地缓存和反向代理、CDN方式,memcached就是其中的一种,将常用的数据缓存下来。
而memcached的使用要求动态开发程序在设计的时候就支持此功能才可以,memcached使用迭代的方式对应用程序的请求进行查询,如果没有请求的缓存,就会直接返回没有找到,然后应用程序服务器再到数据库上进行查询,同样的memcached的缓存也是由应用程序服务器来觉定那些数据需要缓存。
这点memcached和其他缓存服务器是不同的,其他缓存服务器同时采用递归查询方式,会一直帮应用程序查询,指导查询到结果为止。
redis支持更复杂的缓存,键值格式,内存存储,支持10万/秒的读写请求。
第二篇、PHP
一、php的由来
php(personal home page tool)是通过perl脚本开发的脚本编程语言,用于实现动态web页面,将其脚本嵌入到html源码中的服务器端脚本语言之一。
后来由c语言进行重新编写,并命名为php1.0。经以色列人重新编写后重新命名为hypertext preprocessor。并编写了解释器zend engine,这个就是为脚本进行编译解释的软件,并将php版本带入了5时代。
php本身并不需要和MySQL进行连接通信,实际的通信是由php“程序”完成的,就是说由php开发出来的应用程序,如wordpress。
php安装完毕后主配置文件通常在 /etc/php.ini,是用于和MySQL进行通信的配置文件。
/etc/http/conf.d/php.conf ,则用于配置和httpd之间进行通信的规则。
[root@localhost ~]# ll /etc/httpd/conf.d/
总用量 12
-rw-r--r--. 1 root root 674 3月 22 08:29 php.conf
-rw-r--r--. 1 root root 392 7月 12 2017 README
-rw-r--r--. 1 root root 299 7月 7 06:34 welcome.conf
二、zend engine
zend engine是开源的,是php语言的解释器,最早由以色列理工学院的学生发明,engine为php提供了内存和资源管理的功能以及其他一些标准服务。
zend engine将php代码的处理过程分为了两个阶段,首先是分析php代码并将其转化为zend opcode的二进制格式后存到内存中,第二阶段是使用zend engine去执行转换后的opcode码。
三、opcode
一种php脚本编译后的中间语言,就像java的bytecode、或者.net的MSL。
用途:通常用户请求的是源码,php要将其编译成二进制码供计算机操作,而opcode就是为了减少源码到二进制程序的编译时间,提高了效率生成的中间码。
php(zend engine)执行php脚本代码一般经历四个步骤
1、scanning-将php代码转换成语言碎片(tokens)
2、parsing-将tokens转换成简单而有意义的表达式
3、compliatin-将表达式编译成opcode
4、execution-顺序执行opcode,解释脚本实现功能。
四、php加速器(缓存的是代码、请求命令本身,而不是数据,这是和memcached的区别)
实质就是zend engine将php脚本编译为opcode后放到内存中,在用户请求解释完成后并不急于销毁,而是放到缓存中留个其他用户继续 使用。这样重新进行排序,以提升执行速度。
常见的加速器:(性能提升1-2倍)
1、APC
2、eAccelerator
3、Xcache,性能好,使用率高。具有生产环境的使用经验,适合部署实际环境中。
4、zend Optimizer和Zend Guard loader实质上是加密工具。
5、nuSphere phpexpress:专业的php加速器。
五、php的源码目录
1、build-放置一些跟源码编译相关的文件,比如构建前的buildconf脚本以及一些检查环境的脚本
2、ext-包括php的函数的定义和实现。
3、main-php最为核心的内容,是实现php的基础设施。
4、pear-php扩展和应用仓库,包含pear的核心文件。
5、SAPI-包括各种服务器抽象层的代码。
6、TSRM-php线程安全是构建在TSRM库之上的。
7、zend-zhend引擎的实现目录。
8、test-测试脚本合集。
.......
php.ini官方文档
配置参数:http://php.net/manual/zh/
Linux系统架构师必备--编译安装LAMP之PHP:http://edu.51cto.com/lession/id-75732.html
第三篇 以模块方式安装PHP
一、php的安装(编译安装)
前提条件是已经安装完毕web程序,建议同样使用编译安装。
为什么要编译安装httpd和php
因为只有编译安装httpd程序才可以实现fastcgi的功能。
从源代码编译
编译 PHP 时需要 --enable-fpm 配置选项来激活 FPM 支持。
以下为 FPM 编译的具体配置参数(全部为可选参数):
--with-fpm-user - 设置 FPM 运行的用户身份(默认 - nobody)
--with-fpm-group - 设置 FPM 运行时的用户组(默认 - nobody)
--with-fpm-systemd - 启用 systemd 集成 (默认 - no)
--with-fpm-acl - 使用POSIX 访问控制列表 (默认 - no) 5.6.5版本起有效
1、httpd2.4安装(此版本之后的才支持FCGI,同时建议不要删除系统自带的httpd)
a、安装apr、apr-util、pcre、openssl、openssl-devel软件包
[root@localhost apr-1.5.2]# ./configure --prefix=/usr/local/apr
[root@localhost apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@localhost httpd-2.4.18]# ./configure --prefix=/usr/local/pcre
[root@localhost httpd-2.4.18]# yum install openssl-devel
APR和APR-UTILS主要是为不同平台提供相同的通用接口而产生的,默认情况下,linux是有安装这两个软件包的,所有在编译安装httpd的时候也可以同时编译安装新的apr软件。
b、编译安装configure
[root@localhost httpd-2.4.18]# ./configure --prefix=/usr/local/httpd-2.4 --sysconfdir=/etc/httpd-2.4 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=event --with-config-file=/etc/httpd-2.4/ --with-pcre=/usr/local/pcre/
--enable-so:支持动态模块加载。
--enable-ssl:支持ssl加密认证功能,需要openssl-devel支持。
--with-mpm=event(worker)
这里说一下mpm,httpd采用的mpm模块有三种prefork、worker、event。
prefork模块在经过编译安装并加载到httpd中的时候,模块名称为:mod_php
worker、event模型在加载模块时,名称为:mod_php_zt
所以在对应于httpd的模块加载类型,如果加载的类型是event、worker的话,那么在php编译安装的时候,就需要使用--enable-maintainer-zts的参数了。如果是prefork的话,php就不需要这个参数了。
c、优化httpd
如果是系统中本身就预先安装了httpd程序,可以直接编辑此文件,并将apachectl、httpd等变量参数重新指向编译安装的路径。
如果没有预先安装,则可以将编译安装路径的文件apachectl复制到/etc/rc.d/init.d/目录下,并命名为httpd(随意),就可以实现service httpd start这样的启动了,也可以创建链接到/sbin/中,实现同样的简便启动功能。
[root@localhost httpd-2.4.18]# scp /etc/init.d/httpd /etc/init.d/httpd2.4
修改启动程序/etc/init.d/httpd2.4:
apachectl=/usr/local/httpd-2.4/bin/apachectl
httpd=${HTTPD-/usr/local/httpd-2.4/bin/httpd}
pidfile=${PIDFILE-/usr/local/http-2.4/logs/httpd.pid}
开机自启动:
[root@localhost httpd-2.4.18]# chkconfig --add httpd2.4
[root@localhost httpd-2.4.18]# chkconfig httpd2.4 on
[root@localhost httpd-2.4.18]# chkconfig --list httpd2.4
httpd2.4 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
d、添加php网页文件的支持
addtype application/x-httpd-php .php
addtype application/x-httpd-php-source .phps
directoryindex index.php
e、查看httpd启动后的基本配置信息:
[root@localhost php-5.5.32]# httpd -S
VirtualHost configuration:
ServerRoot: "/usr/local/httpd-2.4"
Main DocumentRoot: "/usr/local/httpd-2.4/htdocs"
Main ErrorLog: "/usr/local/httpd-2.4/logs/error_log"
Mutex default: dir="/usr/local/httpd-2.4/logs/" mechanism=default
PidFile: "/usr/local/httpd-2.4/logs/httpd.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="daemon" id=2
Group: name="daemon" id=2
2、php安装
a、安装libmcrypt-devel 、mhash-devel程序。
安装epel仓库The newest version of 'epel-release' for EL6
[root@localhost ~]# yum install libmcrypt-devel mhash-devel
b、编译安装PHP-5.5.32(rpm安装MySQL5.5,编译安装httpd2.4)
[root@localhost php-5.5.32]# ./configure --prefix=/usr/local/php --with-mysql=mysqlnd --with-openssl -with-mysqli=mysqlnd --enable-mbstring -with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-sockets --with-apxs2=/usr/local/httpd-2.4/bin/apxs --with-mcrypt --with-config-file-path=/etc --with-bz2 --enable-maintainer-zts --with-config-file-scan-dir=/etc/php.d
[root@localhost php-5.5.32]# make && make install
注意:PHP编译安装完毕后,会在对应的http的http.conf文件中加载php模块,形式为:
LoadModule php5_module modules/libphp5.so
但是要想让httpd能够识别php网页,还需要在httpd.conf添加一下内容
addtype application/x-httpd-php .php
addtype application/x-httpd-php-source .phps
directoryindex index.php
问题解决:
问题:编译安装过程中出现libmysqlclient_r.a无法找到,需要将/usr/lib64/mysql/libmysqlclient.a创建链接到/usr/lib/目录下。
checking for specified location of the MySQL UNIX socket... no
configure: error: Cannot find libmysqlclient_r under /usr/.
Note that the MySQL client library is not bundled anymore!
处理方法:
[root@localhost php-5.5.32]# ln -sv /usr/lib64/mysql/libmysqlclient.a /usr/lib/libmysqlclient_r.a
此编译方式为课堂上老师使用的方式,适用于编译安装MySQL5.5.33,php5.4
[root@localhost php-5.5.32]# ./configure --prefix=/usr/local/php --with-mysql=/usr/ --with-openssl -with-mysqli=/usr/bin/mysql_config --enable-mbstring -with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-sockets --with-apxs2=/usr/local/httpd-2.4/bin/apxs --with-mcrypt --with-config-file-path=/etc --with-bz2 --enable-maintainer-zts --with-config-file-scan-dir=/etc/php.d
3、效果演示
修改网页文件内容如下:
[root@localhost php-5.5.32]# vim /usr/local/httpd-2.4/htdocs/index.php
<html><body><h1>It works!</h1></body></html>
<?php
phpinfo();
?>
进入php源文件目录,复制php.ini.production到/etc/目录下
[root@localhost php-5.5.32]# cp php.ini-production /etc/php.ini
检查httpd脚本运行情况,及当前启动的httpd路径
[root@localhost htdocs]# httpd -v
Server version: Apache/2.4.18 (Unix)
Server built: Jul 12 2017 11:16:55
[root@localhost htdocs]# hash
hits command
2 /usr/local/httpd-2.4/bin/httpd
本文转自 blackstome 51CTO博客,原文链接:http://blog.51cto.com/137783/1968762,如需转载请自行联系原作者