码迷,mamicode.com
首页 > 其他好文 > 详细

编译安装lamp

时间:2015-05-06 15:19:49      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:lamp

lamp

用户在请求资源时,httpd就会予以响应返回数据,但这的站点并不能和用户产生实际意义上的交互。这时就需要能够实现和用户交互让用户输入一些信息或者根据用户信息的不同,而看到不一样的网站内容。这就要求网页是一个可运行程序,让程序运行以后,能够根据用户请求的不同返回不同结果,这就催生的动态网站的需求。早期动态网站分为两类,服务器端动态和客户端动态。也就是说这个页面在被用户请求后,可在客户端运行或者在服务器端一下之后,再将结果返回给客户端。在客户端完成的就叫做客户端动态,早期windows上支持很多插件在本地运行,如Flash但是客户端运行的安全性不高,比如黑客随便在网站上放点那啥,本地运行一下就很容易中招,并且在客户端运行服务器并不能很好的控制

用户访问的页面里面存放的是程序,这个程序被服务器端加载后,将会在服务器端运行一遍但是httpd只是能识别HTML的请求,不是运行环境。这时由于httpd无法识别此程序,就会提示用户下载,而无法运行并且直接展示在浏览器上。因此,现如今的动态网站是这样运行的:httpd会根据用户请求资源的后缀名判断资源类型,如果为动态内容,也是通过后缀名来决定要启动的应用程序解释器,来运行此程序。它会通过CGI(Common Gateway Interface,通用网关接口,简化版的http协议,用于web服务器与应用程序进程通信)协议来启动另外一个进程当进程启动后,httpd会将用户请求的URL转换成为文件系统磁盘上的路径,并传递给应用程序解释器。解释器收到后会自行加载用户请求的动态内容(程序),而后根据用户的请求本地完成运行,运行的结果生成的数据流便发还给httpdhttpd再将其封装成相应报文,发给客户端。因此客户端请求的文件和它得到的内容并不是一回事。

程序是由指令+数据组成的,那数据在什么地方?我们放置在回应目录下的页面文件通常都是程序,有些数据可能来自于用户的请求,但大量数据比如论坛上用户发的帖子这些数据我们不可能放在程序中,因为这些都是根据用户的不同请求产生的因此我们需要找个位置集中存放。数据一般存放文件但如果所有用户发的帖子都放在一个文件中,这个文件将会无比巨大,一旦某个用户需要浏览帖子,内核就需要将整个文件全都加载内存这显然是不现实的。而如果每个帖子都放在一个文件中,就会产生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

aprapache 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 

 

[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 配置文件

[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.sNAME的取值为:prefork, event, worker

 

1.2.4.2 修改‘Main‘ server的DocumentRoot

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>


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文件中定义。但首先得打开主配置文件中关于此文件的注释。

[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

[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 服务脚本

原来的脚本上直接编辑就行

[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


搞起:

[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.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.40

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连接的驱动。

 

1.4.1 编译安装XCache提升php性能

XCache其实是php的一种加速器,php加速器有很多,但只有XCache最为实用。下面就来说说加速器为什么能够起到加速的效果。

 

Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL。PHP执行PHP脚本代码一般会经过如下4个步骤:

1) Scanning(Lexing) —— 扫描将PHP代码转换为语言片段(Tokens),比如ls /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

 

1.5 场景二:php以fpm工作为独立守护进程

此编译方式和第一种不同之处在于,编译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

标签:lamp

原文地址:http://10042224.blog.51cto.com/10032224/1642532

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!