1 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服务器需要向后端提请运行某段代码时,可以直接将那段代码而不是整个页面文件提交给应用程序服务器。
1.1 LAMP中配合方式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的模块 1.2 httpd-2.4编译安装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 1.2.1 编译安装步骤前提:停止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 1.2.2 启动服务apachectl 1
2
3
4
5
6
7
8
| [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 :::*
|
1.2.3 配置文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| [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配置文件中的配置文件,无法直接生效,需要在主配置文件中将配置文件的注释一个个打开。
1.2.4 httpd2.4的使用
1.2.4.1 切换使用MPM想要查看当前的MPM无法再使用httpd –l了,只能使用httpd -M|grep mpm 想要更换也很简单,在配置文件中搜索mpm找到后,将默认的注释,新增一行LoadModule mpm_NAME_module modules/mod_mpm_NAME.so NAME的取值为:prefork, event, worker 1.2.4.2 修改'Main' server的DocumentRoot2.4中的DocumentRoot修改和2.2是不同的,除了要将DocumentRoot指定为新的路径外,而需要手动授权该目录可以让所有用户访问。 1
2
3
4
5
6
7
| [root apache]# vim /etc/httpd24/httpd.conf
DocumentRoot "/data/web/html/" # 更改的路径
<Directory "/data/web/html/"> # 对新路径进行定义
Options Indexes FollowSymLinks
AllowOverride None
Require all granted # 就是这项允许所有用户访问
</Directory>
|
1.2.4.3 基于IP的访问控制法则允许所有主机访问: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:指定域内的所有主机 基于主机名控制很少用 1.2.4.4 虚拟主机首先注释DocumentRoot,基于IP、Port和FQDN都支持,基于FQDN的不再需要NameVirtualHost指令。所有虚拟主机不再定义在主配置文件中,而是extra中httpd-vhosts.conf文件中定义。但首先得打开主配置文件中关于此文件的注释。 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| [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
|
1.2.4.5 ssl启用模块:LoadModule ssl_module modules/mod_ssl.so,并打开专门的配置文件Include /etc/httpd24/extra/httpd-ssl.conf,还要启动模块LoadModule socache_shmcb_module modules/mod_socache_shmcb.so 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| [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
|
1.2.4.6 服务脚本在原来的脚本上直接编辑就行 1
2
3
4
5
6
7
8
9
10
11
| [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
|
1.3 MariaDB安装开源分支: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
搞起: 1
| [root ~]# yum remove mysql mysql-server # 将之前安装的mysql卸掉
|
准备将MariaDB数据存放在逻辑卷上,分区,改分区类型,然后创建: 1
2
3
4
5
6
7
8
| [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 # 专门放在一个子目录中
|
准备好安装包: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| [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
|
用户名和组很奇怪,换了! 1
2
3
4
5
| [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/ # 这是关键
|
配置文件: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| [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
|
接下来就可以编辑配置文件了: 1
2
3
4
5
6
7
8
9
10
11
12
13
| [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
|
将执行程序设置正确路径 1
2
3
| [root mysql]# vim /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin:$PATH
[root mysql]# . /etc/profile.d/mysql.sh
|
1.3.1 MariaDB的特性插件式存储引擎:存储管理器有多种实现版本,功能和特性都有着或多或少的区别,用户可根据需要灵活选择。 (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并不是无奈的选择而是更好的选择。 1.4 模块化编译安装php5.4.40php5.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结尾的文件 准备好安装环境: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| [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连接的驱动。 1.4.1 编译安装XCache提升php性能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来运行扩展。
开始编译: 1
2
3
4
5
6
7
| [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来指明 1
2
3
4
5
| [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是否加载成功 1
2
3
4
| [root php.d]# vim /vhosts/a.com/htdocs/index.php # 打开当前httpd主页文件加入三行
<?php
phpinfo();
?>
|
浏览器访问本机地址,找到/etc/php.d/xcache.ini此项就OK 1.5 场景二:php以fpm工作为独立守护进程此编译方式和第一种不同之处在于,编译php时--enable-fpm增加这一项,相应的就应该去掉apxs2,因为这是编译模块的。前端主机必须以fcgi和php主机通信,所以需要启动fcgi模块。httpd和MariaDB保持不变。 编译开始: 1
2
3
4
5
6
7
8
9
| [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
|
注意:两次不能安装在同一个目录,因此: 1
2
3
4
5
| [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就需要一个脚本专门启动它,此脚本源码包中提供了模板,直接拿来使用就行。 1
2
3
| [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
|
作为一个守护进程,它也需要一个配置文件,配置文件也有模板 1
2
3
4
5
6
7
8
9
| [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就好玩了
|
可以启动服务了 1
2
3
| [root etc]# service php-fpm start
Starting php-fpm done
[root etc]# ss -tunl # 默认监听在本机的9000端口
|
接下来配置httpd fcgi代理模块 1
2
3
4
| [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模块
|
接下来需要在中心主机或者虚拟主机中定义反向代理 1
2
3
4
5
| 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 1
2
3
4
5
6
7
8
9
10
11
| [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的编译同第一种。
|