标签:lamp
用户在请求资源时,httpd就会予以响应并返回数据,但这样的站点并不能和用户产生实际意义上的交互。这时就需要能够实现和用户交互,让用户输入一些信息或者根据用户信息的不同,而看到不一样的网站内容。这就要求网页是一个可运行程序,让程序运行以后,能够根据用户请求的不同返回不同的结果,这就催生的动态网站的需求。早期动态网站分为两类,服务器端动态和客户端动态。也就是说这个页面在被用户请求后,可能在客户端运行或者在服务器端一下之后,再将结果返回给客户端。在客户端完成的就叫做客户端动态,早期windows上支持很多插件在本地运行,如Flash。但是在客户端运行的安全性不高,比如黑客随便在网站上放点那啥,本地运行一下就很容易中招,并且在客户端运行服务器端并不能很好的控制。
用户访问的页面里面存放的是程序,这个程序在被服务器端加载后,将会在服务器端运行一遍,但是httpd只是能识别HTML的请求,而不是运行环境。这时由于httpd无法识别此程序,就会提示用户下载,而无法运行并且直接展示在浏览器上。因此,现如今的动态网站是这样运行的:httpd会根据用户请求资源的后缀名判断此资源的类型,如果为动态内容,也是通过后缀名来决定它要启动的应用程序的解释器,来运行此程序。它会通过CGI(Common Gateway Interface,通用网关接口,简化版的http协议,用于web服务器与应用程序进程通信)协议来启动另外一个进程,当进程启动后,httpd会将用户请求的URL转换成为文件系统磁盘上的路径,并传递给应用程序解释器。解释器收到后会自行加载用户请求的动态内容(程序),而后根据用户的请求在本地完成运行,运行的结果生成的数据流便发还给httpd,httpd再将其封装成相应报文,发给客户端。因此,客户端请求的文件和它得到的内容并不是一回事。
程序是由指令+数据组成的,那数据在什么地方?我们放置在回应目录下的页面文件通常都是程序,有些数据可能来自于用户的请求,但大量数据比如论坛上用户发的帖子,这些数据我们不可能放在程序中,因为这些都是根据用户的不同请求产生的。因此,我们需要找个位置集中存放。而数据一般存放在文件中,但如果将所有用户发的帖子都放在一个文件中,这个文件将会无比巨大,一旦某个用户需要浏览帖子,内核就需要将整个文件全都加载进内存,这显然是不现实的。而如果将每个帖子都放在一个文件中,就会产生N多的小文件。一旦用户需要搜索帖子,就需要在众多的文件中检索,这样既消耗资源又浪费时间,显然也是不可行的。这就引用了数据库的概念。
不是所有的应用程序在运行时都要用到数据,但如果要用到数据就需要数据交换协议联系数据库。解释器本身是不会和数据库打交道的,需要打交道的是运行在解释器之上的应用程序。那应用程序如何跟数据库打交道?通过数据库的调用接口API来实现。由于MySQL是C/S架构的,这就意味着它的调用接口可以基于协议客户端来实现,说白了就是它的调用接口可以放在前端应用程序那里。这个API可以将应用程序希望的数据管理功能,封装成MySQL协议的用户请求报文,发给服务器端(MySQL),还能将服务器端的响应报文解开后,发给应用程序。
这样的三级结构之间需要不断的交互就会消耗很大的资源,当并发量很大时,解释器进程会生成很多个来响应用户的动态内容的请求,httpd同样会生成众多的子进程响应用户的静态请求。这样一个服务器启动的进程数将会非常庞大,进程间的切换也会浪费很多的资源。并且解释器进程是由httpd创建的,同时还要负责销毁,这样httpd的压力就太大了。
这样一来,lamp中的a和p就出现了多种组合方式。第一种就是CGI方式,解释器进程有httpd负责创建和销毁;第二种是Module模块的方式,直接将php做成httpd的模块,这样就不需要子进程了,因为php就是httpd的功能了。但这种效率也不高,因为httpd还是要参与动态内容的处理过程。第三种就是FastCGI,它也是CGI协议,可以说成是改进版的CGI协议。这种组合方式下,解释器进程就是单独的服务器端了,需要监听在某个套接字上,接收前端封装的套接字请求了。httpd只需将请求通过FastCGI协议传递给解释器进程,该进程就会自行生成进程处理请求,完全类似于httpd的prefork模型。并且数据库也可以使用套接字进行通信,这样一来,amp三者就能独立开来。
不同语言开发的程序,需要不同的运行环境。
请求流程:Client --> (http) --> httpd --> (somefile.php, cgi) --> application server --> (mysql) --> mysql server,如果用户请求的是动态内容,就会经由本地链路层拆封装、网络层拆封装、传输层拆封装,最终送给用户空间的httpd进程。httpd进程发现请求的是动态内容,于是经过FCGI的应用层封装接着tcp封装... 封装完成后发送给应用程序服务器。应用程序服务器拆封装,收到请求后,使用一个空闲子进程加载并运行请求的内容。运行过程中如果需要访问数据库,就会调用php连接mysql的驱动,先在本地封装mysql应用层协议,然后各种封装后发给mysql服务器。mysql服务器各种拆封装,而后封装返回,经过的过程相当多,十分消耗时间和I/O
php语言的最大好处在于:代码可以直接嵌入到HTML文本中,web服务器需要向后端提请运行某段代码时,可以直接将那段代码而不是整个页面文件提交给应用程序服务器。
rpm安装中php默认是以模块化的方式和httpd结合的,所以编译安装php中如果也使用模块化的话,必须指定apxs位置。
如果httpd使用的是worker或者event模型,php在编译安装时就需要增加特性--enable-maintainer-zts,因为prefork和worker,event的模块并不相同。并且编译以后就无法更改了,如果想从worker换成prefork,就只能重新编译。
httpd和php的三种结合方式:
modules:把php编译成为httpd的模块。prefork模块是libphp5.so,worker和event的模块是zts
cgi:常用于perl+httpd
fastcgi:php-5.3.3+自带了fpm组件,提供守护进程
前端httpd, http-proxy-fcgi反向代理用户对动态内容请求至后端的fastcgi server
httpd对fastcgi协议的支持:httpd-2.2需要安装额外模块fcgi,httpd-2.4自带fcgi模块
安装次序:httpd, mariadb, php,因为编译php依赖于httpd和mariadb
场景一:php编译为httpd的模块
2.4新特性:
1、MPM支持运行DOS机制(运行时装卸载)
2、支持event MPM
3、支持异步读写
4、支持每模块及每个目录分别使用各自的日志级别
5、每请求单独配置,基于<If>指令实现
6、增强版的表达式分析器,httpd内部支持正则表达式
7、支持毫秒级的keepalive timeout
8、基于FQDN的虚拟主机不再需要NameVirtualHost指令
9、支持用户自定义变量
新模块:
1、mod_proxy_fcgi,与php结合
2、mod_ratelimit,客户端访问限速
3、mod_remoteip,指明远程客户端的IP地址
并且修改了一些配置机制:不再支持使用Order, Deny, Allow来做基于IP的访问控制。
httpd依赖于apr, apr-util, apr-icon
apr:apache portable runtime(可移植运行时环境),httpd是个跨平台的工具,由于不同平台的底层都不相同,httpd程序员在开发时,就要开发多个版本,并且需要同时维护,出了新功能还需要同时添加等等,这是极其麻烦的。后来httpd就开发了apr,可以将apr看成是httpd的虚拟机,这样就能实现只开发一个版本,就能在多个平台上运行。httpd2.4的编译需要依赖1.4以上版本的apr
前提:停止rpm安装的httpd进程;禁止httpd开机启动;安装开发环境,安装pcre-devel
1、apr
# ./configure --prefix=/usr/local/apr
# make && make install
2、apr-util
# ./configure --prefix=/usr/local/apr-util --with=/usr/local/apr
# make && make install
3、httpd
# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --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=prefork
--enable-so:支持模块动态装卸载
--enable-ssl:启用ssl功能
--enable-cgi:支持cgi
--enable-rewrite:支持URL重写,可能依赖pcre-devel包
--with:额外的包,任何with指的包,都要安装其devel包
--with-zlib:基于gzip在传输时做压缩,zlib是网络上实现gzip类似功能的压缩库,调用此库能完成压缩功能。
--with-pcre:支持pcre,rpm安装的包一般安装在/usr目录下,/usr目录下编译时不需要指定路径,除非是/usr/local/目录下的某某目录。
--enable-modules=most:编译多少模块,总共支持五个选项:all|most|few|none|reallyall
--enable-mpms-shared=all:把所有的mpm功能全做成共享模式
--with-mpm=prefork:默认使用的mpm为prefork
# make && make install
apachectl
[root httpd-2.4.10]# vim /etc/profile.d/http.d.sh export PATH=/usr/local/apache/bin:$PATH # 一定要写前面,不然找到的还是rpm安装的路径 [root httpd-2.4.10]# . /etc/profile.d/http.d.sh [root httpd-2.4.10]# which apachectl [root httpd-2.4.10]# apachectl start AH00558: httpd: Could not reliably determine the server‘s fully qualified domain name, using localhost.localdomain. Set the ‘ServerName‘ directive globally to suppress this message [root httpd-2.4.10]# ss -tunl|tail -1 tcp LISTEN 0 128 :::80 :::*
[root httpd-2.4.10]# ls /etc/httpd24/ extra httpd.conf magic mime.types original httpd.conf是主配置文件,extra目录是补充 [root apache]# ll total 52 drwxr-xr-x 2 root root 4096 Apr 29 00:03 bin drwxr-xr-x 2 root root 4096 Apr 29 00:03 build # 编译安装过程中使用的目录,其中config.nice中更是保留了编译的选项 drwxr-xr-x 2 root root 4096 Apr 29 00:03 cgi-bin drwxr-xr-x 3 root root 4096 Apr 29 00:03 error # 错误页面的显示的信息 drwxr-xr-x 2 root root 4096 Apr 28 23:48 htdocs # 网页文件的存放位置 drwxr-xr-x 3 root root 4096 Apr 29 00:03 icons # 图标 drwxr-xr-x 2 root root 4096 Apr 29 00:03 include # 头文件,需要链接至/usr/include/httpd drwxr-xr-x 2 root root 4096 Apr 29 00:12 logs # 日志目录 drwxr-xr-x 4 root root 4096 Apr 29 00:03 man drwxr-xr-x 14 root root 12288 Jul 16 2014 manual # 帮助手册的页面文件 drwxr-xr-x 2 root root 4096 Apr 29 00:03 modules # 模块文件 [root apache]# ln -sv /usr/local/apache/include/ /usr/include/httpd [root apache]# vim /etc/man.config MANPATH /usr/local/apache/man # 新增 MANPATH /usr/man MANPATH /usr/share/man MANPATH /usr/local/man MANPATH /usr/local/share/man MANPATH /usr/X11R6/man
expra配置文件中的配置文件,无法直接生效,需要在主配置文件中将配置文件的注释一个个打开。
想要查看当前的MPM无法再使用httpd –l了,只能使用httpd -M|grep mpm 想要更换也很简单,在配置文件中搜索mpm找到后,将默认的注释,新增一行LoadModule mpm_NAME_module modules/mod_mpm_NAME.so NAME的取值为:prefork, event, worker
2.4中的DocumentRoot修改和2.2是不同的,除了要将DocumentRoot指定为新的路径外,而需要手动授权该目录可以让所有用户访问。
[root apache]# vim /etc/httpd24/httpd.conf DocumentRoot "/data/web/html/" # 更改的路径 <Directory "/data/web/html/"> # 对新路径进行定义 Options Indexes FollowSymLinks AllowOverride None Require all granted # 就是这项允许所有用户访问 </Directory>
允许所有主机访问:Require all granted
拒绝所有主机访问:Require all deny
控制特定IP访问:
Require ip IPADDR:授权指定来源地址的主机访问
Require not ip IPADDR:拒绝指定来源地址的主机访问
IPADDR:
IP:172.16.100.2
Network/mask:172.16.0.0/255.255.0.0
Network/Length:172.16.0.0/16
Net:172.16
控制特定主机(HOSTNAME)访问
Require host HOSTNAME
Require not host HOSTNAME
HOSTNAME:
FQDN:特定主机
DOMAIN:指定域内的所有主机
基于主机名控制很少用
首先注释DocumentRoot,基于IP、Port和FQDN都支持,基于FQDN的不再需要NameVirtualHost指令。所有虚拟主机不再定义在主配置文件中,而是extra中httpd-vhosts.conf文件中定义。但首先得打开主配置文件中关于此文件的注释。
[root apache]# vim /etc/httpd24/httpd.conf Include /etc/httpd24/extra/httpd-vhosts.conf [root apache]# vim /etc/httpd24/extra/httpd-vhosts.conf <VirtualHost *:80> DocumentRoot "/vhosts/a.com/htdocs/" ServerName www.a.com ServerAlias a.com ErrorLog "logs/a.com-error_log" CustomLog "logs/a.com-access_log" combined <Directory "/vhosts/a.com/htdocs"> options none allowoverride none require all granted </Directory> </VirtualHost> <VirtualHost *:80> DocumentRoot "/vhosts/b.org/htdocs/" ServerName www.b.org ServerAlias b.org ErrorLog "logs/b.org-error_log" CustomLog "logs/b.org-access_log" combined <Directory "/vhosts/b.org/htdocs"> options none allowoverride none require all granted </Directory> </VirtualHost> [root apache]# httpd –t [root apache]# killall -SIGHUP httpd [root apache]# httpd –S
启用模块:LoadModule ssl_module modules/mod_ssl.so,并打开专门的配置文件Include /etc/httpd24/extra/httpd-ssl.conf,还要启动模块LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
[root apache]# cp -a /etc/httpd/ssl /etc/httpd24/ [root apache]# vim /etc/httpd24/extra/httpd-ssl.conf <VirtualHost *:443> # General setup for the virtual host DocumentRoot "/vhosts/a.com/htdocs" ServerName www.a.com:443 ErrorLog "/usr/local/apache/logs/error_log" TransferLog "/usr/local/apache/logs/access_log" <Directory "/vhosts/a.com/htdocs"> options none allowoverride none require all granted </Directory> SSLEngine on SSLCertificateFile "/etc/httpd/ssl/httpd.crt" SSLCertificateKeyFile "/etc/httpd/ssl/httpd.key" [root ~]# killall httpd [root ~]# apachectl start
在原来的脚本上直接编辑就行
[root ~]# cp /etc/init.d/httpd /etc/init.d/http2.2 [root ~]# vim /etc/init.d/httpd # 只需改三行 apachectl=/usr/local/apache/bin/apachectl httpd=${HTTPD-/usr/local/apache/bin/httpd} pidfile=${PIDFILE-/usr/local/apache/logs/httpd.pid} # 下面三行貌似也要删掉 if [ -f /etc/sysconfig/httpd ]; then . /etc/sysconfig/httpd fi [root ~]# chkconfig --add httpd24 [root ~]# chkconfig httpd24 on
开源分支:MariaDB、Percona: Percona Server
安装方式有三种:
源代码
通用二进制格式:官方编译好的,解压直接就能用
包管理器格式:rpm、system vendor、MySQL、deb
MySQL安装需要定义数据存放位置,所谓的数据库就是数据存放目录下的子目录。MySQL的配置文件:/etc/my.cnf --> /etc/mysql/my.cnf --> ~/.my.cnf,~/.my.cnf优先级最高。
mysql_install_db是实现数据库创建的脚本,可以使用mysql_install_db --help查看脚本的运行说明。
MariaDB版本为5.5.43,千万不要使用5.5.40的版本,因为有BUG
搞起:
[root ~]# yum remove mysql mysql-server # 将之前安装的mysql卸掉
准备将MariaDB数据存放在逻辑卷上,分区,改分区类型,然后创建:
[root ~]# pvcreate /dev/sdb1 [root ~]# vgcreate myvg /dev/sdb1 [root ~]# lvcreate -L 10G -n mydata myvg [root ~]# mke2fs -t ext4 -L MYDATA /dev/myvg/mydata [root ~]# vim /etc/fstab # 开机自动挂载 [root ~]# mount -a [root ~]# cd /data/ [root data]# mkdir mydata # 专门放在一个子目录中
准备好安装包:
[root ~]# tar xf mariadb-5.5.40-linux-x86_64.tar.gz -C /usr/local # 解压至/usr/local,因为它会通过此路径进行访问。 [root ~]# cd /usr/local [root local]# ln -s mariadb-5.5.40-linux-x86_64/ mysql # 虽然项目名改了,但内部的路径仍为mysql [root local]# cd mysql/ [root mysql]# ll total 220 drwxr-xr-x 2 root root bin -rw-r--r-- 1 ubuntu ubuntu COPYING -rw-r--r-- 1 ubuntu ubuntu COPYING.LESSER drwxr-xr-x 3 root root data # 数据存放位置,但我们放在/data -rw-r--r-- 1 ubuntu ubuntu EXCEPTIONS-CLIENT drwxr-xr-x 3 root root include # 头文件 -rw-r--r-- 1 ubuntu ubuntu INSTALL-BINARY drwxr-xr-x 3 root root lib # 库文件 drwxr-xr-x 4 root root man drwxr-xr-x 11 root root mysql-test # 测试组件 -rw-r--r-- 1 ubuntu ubuntu README drwxr-xr-x 2 root root scripts drwxr-xr-x 27 root root share drwxr-xr-x 4 root root sql-bench # 压力测试 drwxr-xr-x 3 root root support-files
用户名和组很奇怪,换了!
[root mysql]# userdel -r mysql [root mysql]# groupadd -r -g 306 mysql # 随便指一个系统组 [root mysql]# useradd -r -g 306 -u 306 mysql [root mysql]# chown -R root.mysql . [root mysql]# chown -R mysql.mysql /data/mydata/ # 这是关键
配置文件:
[root mysql]# ll support-files/ total 80 -rwxr-xr-x 1 root mysql binary-configure -rw-r--r-- 1 root mysql magic -rw-r--r-- 1 root mysql my-huge.cnf # 巨大内存的配置文件样例 -rw-r--r-- 1 root mysql my-innodb-heavy-4G.cnf # 4G以上 -rw-r--r-- 1 root mysql my-large.cnf # 较大内存512 -rw-r--r-- 1 root mysql my-medium.cnf -rw-r--r-- 1 root mysql my-small.cnf -rwxr-xr-x 1 root mysql mysqld_multi.server -rwxr-xr-x 1 root mysql mysql-log-rotate -rwxr-xr-x 1 root mysql mysql.server drwxr-xr-x 3 root mysql SELinux [root mysql]# mkdir /etc/masql # 创建配置文件目录 [root mysql]# cp support-files/my-large.cnf /etc/mysql/my.cnf [root mysql]# scripts/mysql_install_db --user=mysql --datadir=/data/mydata/ # 构建mysql数据字典,完成数据库初始化 [root mysql]# ll /data/mydata/ # 初始化完成 total 32 -rw-rw---- 1 mysql mysql 16384 May 2 17:11 aria_log.00000001 -rw-rw---- 1 mysql mysql 52 May 2 17:11 aria_log_control drwx------ 2 mysql root 4096 May 2 17:11 mysql drwx------ 2 mysql mysql 4096 May 2 17:11 performance_schema drwx------ 2 mysql root 4096 May 2 17:11 test
接下来就可以编辑配置文件了:
[root mysql]# vim /etc/mysql/my.cnf [mysqld] thread_concurrency = 2 # 核心*2,非必须 datadir = /data/mydata # 不指定会找安装目录下的data目录 innodb_file_per_table = on # 每个表使用单独的文件,非必须 可以启动了 [root mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld # 直接将官方准备好的脚本拿来用 [root mysql]# chmod +x /etc/rc.d/init.d/mysqld [root mysql]# chkconfig --add /etc/rc.d/init.d/mysqld [root mysql]# chkconfig --list mysqld # 默认启动 mysqld 0:off1:off2:on3:on4:on5:on6:off [root mysql]# service mysqld start [root mysql]# ss -tunl|grep 3306
将执行程序设置正确路径
[root mysql]# vim /etc/profile.d/mysql.sh export PATH=/usr/local/mysql/bin:$PATH [root mysql]# . /etc/profile.d/mysql.sh
插件式存储引擎:存储管理器有多种实现版本,功能和特性都有着或多或少的区别,用户可根据需要灵活选择。
(1) 更多的存储引擎:MyISAM --> Aria,Innodb --> XtraDB
(2) 速度显著提升
(3) 诸多扩展及新特性
(4) 较多的测试组件
(5) 较少的bug
(6) 真开源
MySQL存储引擎:5.1版本默认为MyISAM, 同时提供InnoDB; 5.5版本默认为InnoDB, 同时提供MyISAM
MariaDB存储引擎:默认为InnoDB(实际上为XtraDB),同时提供Aria
因此MariaDB并不是无奈的选择而是更好的选择。
php5.4.40版本的源码包中额外提供了两个配置文件模板,其中php.ini-development用于开发环境,php.ini-production则用于生产环境。
./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --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/php/php.ini --with-config-file-scan-dir=/etc/php.d --with-bz2
--with-mysqli:指定mysql的另外一种访问接口,在嵌入式环境中可能会被用到。
--with-apxs2:告诉php httpd2版本apxs的安装路径
--enable-mbstring:让php支持多字节文本,用于支持中文
--with-freetype-dir:freetype是字体,后面没指明路径,便是全系统搜索freetype的devel包
--with-jpeg-dir:支持jpeg图片的直接生成
--with-zlib:支持通信时压缩
-with-libxml-dir:指明libxml库,特别依赖libxml-devel
--enable-xml:扩展标记语言的处理
--enable-sockets:启动socket的功能
--with-mcrypt:依赖libmcrypt-devel
--with-bz2:支持bz2压缩通信,依赖bz2-devel
--with-config-file-scan-dir=/etc/php.d:指定扫描/etc/php.d/目录下以.ini结尾的文件
准备好安装环境:
[root php-5.4.40]# yum install libxml2-devel [root php-5.4.40]# yum install freetype-devel [root php-5.4.40]# yum install libmcrypt-devel [root php-5.4.40]# yum install bzip2-devel [root php-5.4.40]# ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --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/php/php.ini --with-config-file-scan-dir=/etc/php.d --with-bz2 [root php-5.4.40]# make [root php-5.4.40]# make install [root php-5.4.40]# mkdir /etc/php 配置文件: [root php-5.4.40]# cp php.ini-production /etc/php/php.ini # 直接拿来用 [root php-5.4.40]# vim /etc/php/php.ini date.timezone = Asia/Shanghai [root php-5.4.40]# vim /etc/httpd24/httpd.conf LoadModule php5_module modules/libphp5.so # 可以看到模块的最后一行已经自动新加了php的模块,虽然如此,此时httpd还无法识别.php后缀的动态网页。所以需要额外添加两行 AddType application/x-compress .Z AddType application/x-gzip .gz .tgz # 在这行之下添加 AddType application/x-httpd-php .php # 额外添加一种类型让php能识别,application/x-httpd-php是MIME类型,此类型匹配的是以.php结尾的文件,匹配到后就会交给php模块处理。 AddType application/x-httpd-php-source .phps # 这一行加不加都可以 <IfModule dir_module> DirectoryIndex index.php index.html # 新增index.php,既然都支持php了,当然得搞个php的主页了 </IfModule>
php编译完成。编译安装的php自动添加了和mysql连接的驱动。
XCache其实是php的一种加速器,php加速器有很多,但只有XCache最为实用。下面就来说说加速器为什么能够起到加速的效果。
Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL。PHP执行PHP脚本代码一般会经过如下4个步骤:
1) Scanning(Lexing) —— 扫描,将PHP代码转换为语言片段(Tokens),比如ls –l /etc/ bash将其分为三个片段。
2) Parsing —— 分析,将Tokens转换成简单而有意义的表达式,比如哪个片段是命令、选项和执行的对象。
3) Compilation —— 编译,将表达式编译成Opocdes
4) Execution —— 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能
将编译完成后的opcode共享给其他程序,在并发性较高的场景中,恰好多个用户访问同一段代码,就会同时启动多个进程,每个进程都要单独进行扫描、分析、编译和运行,这样的效率较低。于是这样的功能得以实现:将第一个进程编译好的结果共享给其他进程使用,使其他进程直接跳过前三阶段直接执行第四阶段。
XCache 3.2.0源码包中没有configure脚本文件,因为它是php的模块,如果想要生成脚本,就必须依赖于当前的php环境。需要运行phpize来运行扩展。
开始编译:
[root xcache-3.2.0]# /usr/local/php/bin/phpize # 在此目录下运行就能生成脚本 [root xcache-3.2.0]# ./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config # 此选项直接就能看懂 [root xcache-3.2.0]# make && make install Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/ # 安装完成后,会安装一个扩展 [root xcache-3.2.0]# cd /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/ [root no-debug-non-zts-20100525]# ls xcache.so # 这里面就一个模块文件,此文件需要被php加载到才行
XCache自己额外还有一些扩展的专有的参数,参数需要用xcache.ini来指明
[root xcache-3.2.0]# cp xcache.ini /etc/php.d # 没有此目录就创建 [root xcache-3.2.0]# cd /etc/php.d [root php.d]# vim xcache.ini extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/xcache.so # 改这一行,其他参数先不管 [root php.d]# service httpd24 restart # php是作为httpd模块存在的,重读php的配置文件只能使用httpd
测试XCache是否加载成功
[root php.d]# vim /vhosts/a.com/htdocs/index.php # 打开当前httpd主页文件加入三行 <?php phpinfo(); ?>
浏览器访问本机地址,找到/etc/php.d/xcache.ini此项就OK
此编译方式和第一种不同之处在于,编译php时--enable-fpm增加这一项,相应的就应该去掉apxs2,因为这是编译模块的。前端主机必须以fcgi和php主机通信,所以需要启动fcgi模块。httpd和MariaDB保持不变。
编译开始:
[root ~]# service httpd24 stop # 先将服务停掉 [root ~]# cd /etc/httpd24 [root httpd24]# mv httpd.conf httpd.conf.php # 编译php时修改了此文件,于是不用。并将备份拿来用 [root httpd24]# mv httpd.conf.bak httpd.conf [root httpd24]# service httpd24 start # 再次启动 接下来重新编译php [root ~]# mv php-5.4.40 php-5.4.40.module # 将开始模块编译的目录挪到一边,今后想使用就直接编译就行 [root ~]# tar xf php-5.4.40.tar.bz2 [root ~]# cd php-5.4.40
注意:两次不能安装在同一个目录,因此:
[root php-5.4.40]# rm -rf /usr/local/php/ /etc/php /etc/php.d # 果断删除 [root php-5.4.40]# ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --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 --enable-fpm --with-mcrypt --with-config-file-path=/etc/php/php.ini --with-config-file-scan-dir=/etc/php.d --with-bz2 [root php-5.4.40]# make && make install [root php-5.4.40]# mkdir /etc/php /etc/php.d # 先删除之前的再创建 [root php-5.4.40]# cp php.ini-production /etc/php/php.ini # 搞个配置文件
既然编译成了fpm就需要一个脚本专门启动它,此脚本源码包中提供了模板,直接拿来使用就行。
[root php-5.4.40]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm # 搞个脚本 [root php-5.4.40]# chmod +x /etc/init.d/php-fpm [root php-5.4.40]# chkconfig --add php-fpm
作为一个守护进程,它也需要一个配置文件,配置文件也有模板
[root php-5.4.40]# cd /usr/local/php/etc/ [root etc]# cp php-fpm.conf.default php-fpm.conf [root etc]# vim php-fpm.conf # 修改下面几项即可 pid = /usr/local/php/var/run/php-fpm.pid # pid文件 error_log = /var/log/php-fpm.log pm.max_children = 50 # 最大并发进程数 pm.start_servers = 5 # 服务启动时启动多少空闲进程 pm.min_spare_servers = 2 # 最少空闲 pm.max_spare_servers = 8 # 最大空闲,如果小于5就好玩了
可以启动服务了
[root etc]# service php-fpm start Starting php-fpm done [root etc]# ss -tunl # 默认监听在本机的9000端口
接下来配置httpd fcgi代理模块
[root etc]# cd /etc/httpd24 [root httpd24]# vim httpd.conf LoadModule proxy_module modules/mod_proxy.so # 主代理模块 LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so # fcgi模块
接下来需要在中心主机或者虚拟主机中定义反向代理
ProxyRequests Off # 关闭正向代理 ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/vhosts/a.com/htdocs/$1 # 以根开头.php结尾的文件都被送到后端路径并且引用文件名,因为动态资源都是放在后端 [root httpd24]# httpd -t [root httpd24]# service httpd24 reload [root httpd24]# httpd -M # 查看两个模块是否启动
测试php
[root ~]# vim /etc/httpd24/httpd.conf DocumentRoot "/vhosts/a.com/htdocs/" <Directory "/vhosts/a.com/htdocs/"> DirectoryIndex index.php index.html [root ~]# vim /vhosts/a.com/htdocs/index.php <h1>www.a.com</h1> <?php phpinfo(); ?> [root ~]# service httpd24 reload
浏览器访问测试成功,并且XCache的编译同第一种。
标签:lamp
原文地址:http://10042224.blog.51cto.com/10032224/1642532