编译安装LAMP之二

在上一篇中,我们已经安装httpd,以及mysql服务。那么接下来,我们将安装php。

我们知道,php工作的模式有三种:cgi, module, fastcgi。通常,apache与php是以模块的方式结合的,鉴于fastcgi的工作模式会有更好的效率,待会儿也会讲解。

一、以模块化的方式编译php, php作为apache的模块被加载

安装php所需要的扩展包

如果我们先前没有安装: libxml2 libxml2-devel bzip2-devel libmcrypt libmcrypt-devel 

 curl curl-devel libjpeg libjpeg-devel libpng libpng-devel  libtool-ltdl-devel

需要安装这些包:

[root@localhost ~]# yum -y install libxml2 libxml2-devel bzip2-devel libmcrypt libmcrypt-devel curl curl-devel libjpeg libjpeg-devel libpng libpng-devel  libtool-ltdl-devel

当然,同样可以编译安装这些第三方包以及其扩展包。 libxml2, bzip2, libmcrypt, gpeg, png, gd, freetype 等,安装过程还是三步走 configure && make && make install


这里,我就偷懒了,用yum 一下就搞定了。

不过,我这边没有libmcrypt*包:

No package libmcrypt available.

No package libmcrypt-devel available.

可以到这个网站下载rpm包:http://rpm.pbone.net/

[root@localhost ~]# ls | grep lib*
[root@localhost ~]# ls lib*
libmcrypt-2.5.8-9.el6.i686.rpm  libmcrypt-devel-2.5.8-9.el6.i686.rpm
[root@localhost ~]# rpm -ivh lib*
warning: libmcrypt-2.5.8-9.el6.i686.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
Preparing...                ########################################### [100%]
   1:libmcrypt              ########################################### [ 50%]
   2:libmcrypt-devel        ########################################### [100%]

1、解压,编译

--with-apxs2=/usr/local/apache/bin/apxs    # 基于apxs实现让php编译成apache模块

ok, 言归正传。go...

[root@localhost ~]# tar xf php-5.4.30.tar.gz -C /usr/local/src
[root@localhost ~]# cd /usr/local/src/php-5.4.30

[root@localhost php-5.4.30]# ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --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-apxs2=/usr/local/apache/bin/apxs --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --enable-maintainer-zts

## 说明:   
--prefix=/usr/local/php                # php安装路径   
--with-mysql=/usr/local/mysql          # mysql安装路径   
--with-openssl                         # 支持openssl功能   
--with-mysqli=/usr/local/mysql/bin/mysql_config    # mysql与apache访问的另一种接口,安装在二进制目录下   
--enable-mbstring                      # 多字节string   
--with-freetype-dir                    # 安装的字体库头文件   
--with-jpeg-dir                        # jpeg类型的库   
--with-png-dir                         # png类型的库   
--with-zlib                            # 互联网上通用压缩库,先压缩再传送,减少带宽   
--with-libxml-dir=/usr                 # xml库文件的路径   
--enable-xml                           # 支持xml功能      
--enable-sockets                       # php支持套接字功能 
--enable-fpm                           # PHP FastCGI
--with-apxs2=/usr/local/apache/bin/apxs    # 基于apxs实现让php编译成apache模块   
--with-mcrypt                          # 支持额外的加密库   
--with-config-file-path=/etc           # php配置文件放置路径     
--with-config-file-scan-dir=/etc/php.d # php配置文件的分段文件放置路径   
--with-bz2                             # 压缩库   
--enable-maintainer-zts                # 当apache使用worker或event这两个MPM,编译时使用该选项,这一项的使用取决于apache是什么类型的,apache使用的是prefork就不需要;如果使用的是event或者是worker就要添加这一项;apache以线程工作就必须编译这一项

# 更多编译参数解释参考http://www.php.net/manual/zh/configure.about.php或者./configure --help查看。

[root@localhost php-5.4.30]# make && make install

/usr/local/php        # 是php的主目录
/usr/local/php/bin    # php的命令行工具
/usr/local/php/etc    # 配置文件

2、为php提供配置文件

在编译的时候已经指定了配置文件的路径,所以php会自动到/etc/目录下去找其配置文件

[root@localhost php-5.4.30]# cp php.ini-production /etc/php.ini

## 编辑配置文件,以提高安全性
找到:;open_basedir =
修改为:open_basedir = .:/tmp/ #防止php木马跨站,重要!!

找到:disable_functions =
修改为:disable_functions = passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,escapeshellcmd,dll,popen,disk_free_space,checkdnsrr,checkdnsrr,getservbyname,getservbyport,disk_total_space,posix_ctermid,posix_get_last_error,posix_getcwd, posix_getegid,posix_geteuid,posix_getgid, posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid, posix_getppid,posix_getpwnam,posix_getpwuid, posix_getrlimit, posix_getsid,posix_getuid,posix_isatty, posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid, posix_setpgid,posix_setsid,posix_setuid,posix_strerror,posix_times,posix_ttyname,posix_uname
#列出PHP可以禁用的函数,如果某些程序需要用到这个函数,可以删除,取消禁用。
# 比如说, cacti 就需要用到上述某些函数,需要取消禁用。可以查看httpd 的日志。

找到:;date.timezone =
修改为:date.timezone = PRC
  
找到:expose_php = On
修改为:expose_php = OFF #禁止显示php版本的信息
  
找到:display_errors = On
修改为:display_errors = OFF #关闭错误提示

3、整合apache和php

    我们知道,对于单纯的web服务器,而不是应用程序服务器来说,它仅支持html格式的静态网页格式。那么apache是如何能够支持动态网页的呢?比如,php等。

    PHP有三种工作模式:cgi, moudle, fastcgi。当apache发现处理的页面是动态网页(看文件名后缀),那么它就在配置文件中找,看哪种应用程序(handler)能够编译解释这种类型,就把这些页面交给相应的应用程序处理, 然后应用程序返回apache纯html静态页面,然后apache再把html页面返回给客户端浏览器。

1、编辑 /etc/httpd/httpd.conf配置文件, 定位到 AddType

我们查看/etc/httpd/httpd.conf, 可以看到php被作为apache的一个模块被加载,因为我们在编译php的时候,指定了 --with-apxs2=/usr/local/apache/bin/apxs 选项。

wKioL1PRvRbSUAh_AAAriqcMVFA008.jpg

[root@localhost ~]# vi /etc/httpd/httpd.conf
# 添加下面两行,目的是为了让Apache能解释".php"的文件
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

如下图效果所示:

wKiom1PRquHyIA4_AAEu9VTWjps944.jpg

2、定位到 DirectoryIndex

<IfModule dir_module>
    DirectoryIndex index.php index.html        # 修改apache默认页面类型
</IfModule>

3、测试

[root@localhost ~]# httpd -t
[root@localhost ~]# service httpd restart

[root@localhost ~]# vi /usr/local/apache/htdocs/index.php
# 添加如下内容
<?php
	phpinfo();
?>

通过浏览器访问, 如果出现以下页面,说明OK

wKioL1PRtp-Cy6aMAAF_VXe-OuA003.jpg

4、php与mysql结合

编译php时,确保 --with-mysql 选项,这样php就能够调用mysql提供的API库

[root@localhost ~]# vi /usr/local/apache/htdocs/index.php

<?php
        $conn = mysql_connect('localhost', 'root', '123456');
        if ($conn)
                echo "Connect MySQL Success";
        else
                echo "Failure, can't connect mysql";
?>

通过浏览器访问,如果出现以下页面,说明OK

wKioL1PRub2hOy8MAABU_tE6znM549.jpg

5、安装memcache

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。

a、首先需要先安装libevent,memcached是基于libevent做为事件触发的,官网下载:http://libevent.org/

## 通过yum安装
# yum -y install libevent*
#主包已经安装,别忘记安装libevent-devel*,不然./configure过不去

## 通过源码安装
# wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
# tar xf libevent-2.0.21-stable.tar.gz
# cd libevent-2.0.21-stable/
# ./configure --prefix=/usr/local/libevent
# make && make install

b、接下来安装memecached 服务程序:

http://memcached.org/ 是Memcached的官方网站

# wget http://memcached.org/files/memcached-1.4.21.tar.gz
# tar -zxvf memcached-1.x.x.tar.gz
# cd memcached-1.4.21/
# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
# make && make install

c、安装memcache php模块

为了使php能够使用memcache的特性,我们必须为php安装memcache的模块,也就是memcache的API。也就是说memcached是一个独立的软件,它提供了许多API供多种语言进行调用。

官方网站: http://pecl.php.net/package/memcache

# wget http://pecl.php.net/get/memcache-2.2.7.tgz
# tar xf memcache-2.2.7.tgz -C /usr/local/src
# cd /usr/local/src
# cd memcache-2.2.7/
## 执行phpize扩展安装程序,如果没有安装phpize  运行yum install php-devel
# /usr/local/php/bin/phpize

# ./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config --with-zlib-dir
# make && make install

安装成功会有类似下面的提示

Installing shared extensions: /usr/local/php/lib/php/extensions/xxxxxxx。

## 在php.ini文件,在zend之前加入如下代码:
[memcache]
extension_dir = "/usr/local/php/lib/php/extensions/xxxxxxxx"
extension=memcache.so

d、启动memcached:

# /usr/local/memcached/bin/memcached -d -u root -m 1024 -p 11211 -c 10240

##启动参数说明:
  -d   选项是启动一个守护进程,
  -m  是分配给Memcache使用的内存数量,单位是MB,默认64MB
  -M  return error on memory exhausted (rather than removing items)
  -u  是运行Memcache的用户,如果当前为root 的话,需要使用此参数指定用户。
  -l   是监听的服务器IP地址,默认为所有网卡。
  -p  是设置Memcache的TCP监听的端口,最好是1024以上的端口
  -c  选项是最大运行的并发连接数,默认是1024
  -P  是设置保存Memcache的pid文件

如果php运行环境是apache需要重启apache,如果是nginx需要重启nginx, php这样能重新加载php配置文件来支持 memcache


6、编译安装PDO_MYSQL

首先是下载pdo_mysql扩展的源码包。下载页面在这里: http://pecl.php.net/package/PDO_MYSQL
# wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz
# tar zxvf /lamp/PDO_MYSQL-1.0.2.tgz
# cd /lamp/PDO_MYSQL-1.0.2/

## 进入解压后的目录,然后执行phpize。 必须要执行下面这一步操作
# /usr/local/php/bin/phpize

# ./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-mysql=/usr/local/mysql
## 后面的两个参数必须要添加,一开始我没有添加,结果分别都提示找不到php-config和mysql的header文件。

在make之前还要做一个mysql的header文件的软连接。因为mysql安装的时候指定了目录,不做软连接的话,还是找不到header文件。
# ln -s /usr/local/mysql/include/* /usr/local/include/

# make && make install

## 之后会提示如下:
Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-zts-20100525/
为了方便,我把pdo_mysql.so文件移动到extensions目录下。
# mv /usr/local/php/lib/php/extensions/no-debug-zts-20100525/pdo_mysql.so /usr/local/php/lib/php/extensions/

## 随后修改php.ini
## 找到; extension_dir = “./”这一行,去掉注释,并修改路径。
extension_dir = "/usr/local/php//lib/php/extensions/"

## 这里经过我测试,发现php只会从该目录寻找扩展so,而并不寻找该目录下的子目录。所以之前我为了统一管理,把so文件都移动到该目录下。
extension="pdo_mysql.so";

## 修改php文件,重启httpd生效:
/usr/local/apache2/bin/apachectl restart




apache中配置php支持module模式、cgi模式和fastcgi模式的实验


首先安装apache、mysql和php,依次顺序安装。

apache需要支持fastCGI, 并且php也要支持fastCGI, 两者同时都支持才可以。

 

1.apache、mysql的安装比较简单,略过(参考 《编译安装LAMP之一》)

 

2. php的安装,我安装的是php5.4.30内置了php-fpm,所以不需要再单独下补丁了。

  • 如果php是较低的版本,可能需要单独安装php-fpm

[root@localhost ~]# yum -y install php-fpm
  • 如果内置php-fpm, 那么在编译的时候,指定 --enable-fpm 选项即可

# ./configure --prefix=/usr/local/php
--with-mysql=/usr/local/mysql
--enable-fpm                                # fastCGI
--with-apxs2=/usr/local/apache/bin/apxs     # module

注意:

--enable-fastcgi

--enable-force-cgi-redirect

这2个php新版本已经内置支持,所以如果加上这2个参数,make完毕会提示这2个参数找不到。所以不需要加这2个参数了。 


--enable-fpm

    fastCGI 模式。

--with-apxs2

    这个参数看到有的文章说需要fastcgi模式的话,就不能配置这个,其实也不完全是这样,这个参数的用途只不过是把php的解释模块编译成so文件添加到apache的modules中,并且自动添加到conf文件。如果我们不想用模块模式的话,在httpd.conf中把:

LoadModule php5_module modules/libphp5.so

这行注释掉就可以了。

 

3.为apache 安装 mod_fastcgi 模块

### 可能需要如下依赖包,一般不用,先编译mod_fastcgi, 如果编译报错,再安装
### yum -y install httpd-devle apr apr-devel libtool

# wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz
# tar -zxvf mod_fastcgi-2.4.6.tar.gz
# cd mod_fastcgi-2.4.6
# cp Makefile.AP2 Makefile
# vim Makefile 
## 将Makefile中的top_dir 路径改成你的apache的安装路径
top_dir = /usr/local/apache

# make && make install 
### 安装成功后,会自动把mod_fastcgi.so复制到/usr/local/apache/modules目录下

# cd /usr/local/apache/modules
# ls | grep fast
mod_fastcgi.so

 

接下来是如何配置这4种模式:

1.模块模式

这种模式最简单,在http.conf中增加

LoadModule php5_module modules/libphp5.so

即可。然后在添加 AddType 

<IfModule mime_module>
AddType application/x-httpd-php .php
AddType applicaiton/x-httpd-php-source .phps

 wKiom1RMdrqCGDA4AAAbuVKv0dk160.jpg


2.CGI模式

这种模式需要在httpd.conf中注释掉

LoadModule php5_module modules/libphp5.so

这行。如果不注释这行会一直走到handler模式。也就是module模式。

然后在httpd.conf增加action:

Action application/x-httpd-php /cgi-bin/php-cgi

如果在/cgi-bin/目录找不到php-cgi.可自行从php的bin里面cp一个。

然后重启apache,再打开测试页面发现Server API变成:CGI/FastCGI。说明成功切换为cgi模式。

# service httpd restart

wKioL1RMdyGQoGcIAAAW439ZkFM533.jpg


3.FastCgi模式,用 apche 内置进程管理器

Fastcgi的优点:

  • 从稳定性上看, fastcgi是以独立的进程池运行来cgi,单独一个进程死掉,系统可以很轻易的丢弃,然后重新分 配新的进程来运行逻辑.

  • 从安全性上看,Fastcgi支持分布式运算. fastcgi和宿主的server完全独立, fastcgi怎么down也不会把server搞垮.

  • 从性能上看, fastcgi把动态逻辑的处理从server中分离出来, 大负荷的IO处理还是留给宿主server, 这样宿主server可以一心一意作IO,对于一个普通的动态网页来说, 逻辑处理可能只有一小部分, 大量的图片等静态IO处理完全不需要逻辑程序的参与.

  • 从扩展性上讲, fastcgi是一个中立的技术标准, 完全可以支持任何语言写的处理程序 (php,java,perl,ruby,c++,python...)

  • 适用操作系统,可在任何平台上http://www.fastcgi.com/dist/mod_fastcgi-current.tar.gz使用


a、首先要添加mod_fastcgi模块到httpd.conf配置文件

LoadModule fastcgi_module modules/mod_fastcgi.so

这种模式注释不注释LoadModule php5_module modules/libphp5.so这行貌似没什么关系,但是最好还是注释掉比较好。

b、然后配置了以下模块

<IfModule fastcgi_module>
   FastCgiServer /usr/local/apache/cgi-bin/php-cgi -processes 20
   AddType application/x-httpd-php .php
   AddHandler php-fastcgi .php
   Action php-fastcgi /cgi-bin/php-cgi
</IfModule>

就会自动走到fastcgi模式。

然后重启apache,这个时候用 ps aux | grep php就会发现有很多php-cgi进程在运行。说明配置生效

[root@bogon ~]# ps -ef | grep php
apache   20443 20437  0 12:16 ?        00:00:00 /usr/local/apache/cgi-bin/php-cgi
apache   20445 20437  2 12:16 ?        00:00:00 /usr/local/apache/cgi-bin/php-cgi
apache   20447 20437  3 12:16 ?        00:00:01 /usr/local/apache/cgi-bin/php-cgi
apache   20449 20437  4 12:16 ?        00:00:01 /usr/local/apache/cgi-bin/php-cgi
apache   20451 20437  3 12:16 ?        00:00:00 /usr/local/apache/cgi-bin/php-cgi
apache   20453 20437  3 12:16 ?        00:00:00 /usr/local/apache/cgi-bin/php-cgi
apache   20455 20437  2 12:16 ?        00:00:00 /usr/local/apache/cgi-bin/php-cgi
apache   20457 20437  3 12:16 ?        00:00:00 /usr/local/apache/cgi-bin/php-cgi
apache   20459 20437  4 12:16 ?        00:00:00 /usr/local/apache/cgi-bin/php-cgi
apache   20461 20437  4 12:16 ?        00:00:00 /usr/local/apache/cgi-bin/php-cgi
apache   20463 20437  3 12:16 ?        00:00:00 /usr/local/apache/cgi-bin/php-cgi
apache   20465 20437  3 12:16 ?        00:00:00 /usr/local/apache/cgi-bin/php-cgi
apache   20467 20437  4 12:16 ?        00:00:00 /usr/local/apache/cgi-bin/php-cgi
apache   20469 20437  4 12:16 ?        00:00:00 /usr/local/apache/cgi-bin/php-cgi
apache   20471 20437  4 12:16 ?        00:00:00 /usr/local/apache/cgi-bin/php-cgi
apache   20473 20437  4 12:16 ?        00:00:00 /usr/local/apache/cgi-bin/php-cgi
apache   20475 20437  6 12:16 ?        00:00:00 /usr/local/apache/cgi-bin/php-cgi
apache   20477 20437  8 12:16 ?        00:00:00 /usr/local/apache/cgi-bin/php-cgi
apache   20478 20437  5 12:16 ?        00:00:00 /usr/local/apache/cgi-bin/php-cgi
apache   20481 20437  6 12:16 ?        00:00:00 /usr/local/apache/cgi-bin/php-cgi

也可以通过 apache的日志查看。


4.FastCgi模式,用php-fpm进程管理器

首先要添加mod_fastcgi模块到httpd.conf配置文件:

LoadModule fastcgi_module modules/mod_fastcgi.so

然后重启httpd

[root@localhost ~]# service httpd restart
[root@localhost ~]# tail /usr/local/apache/logs/error_log 
[Mon Jul 21 15:44:21 2014] [notice] FastCGI: process manager initialized (pid 1274)

接着编辑 /etc/httpd/conf.d/fastcgi.php.conf 配置文件成:

<IfModule fastcgi_module>
   FastCgiExternalServer /usr/local/apache/cgi-bin/php-cgi -host 127.0.0.1:9000
   AddType application/x-httpd-php .php
   AddHandler php-fastcgi .php
   Action php-fastcgi /cgi-bin/php-cgi
</IfModule>

注释:
#配置fastcgi server

# 可能需要指定php-cgi的位置
ScriptAlias /cgi-bin/ "/usr/local/php/bin/"

#增加MIME类型
AddType application/x-httpd-php .php

#.php结尾的请求都要用php-fastcgi来处理  
AddHandler php-fastcgi .php         

#设置php-fastcgi的处理器
Action php-fastcgi /cgi-bin/php-cgi

 注意,127.0.0.1:9000是php-fpm的开启端口,所以我们还需要把php-fpm打开。

  • 如果是yum安装的php-fpm,

/usr/sbin/php-fpm

# php-fpm服务启动脚本: /etc/init.d/php-fpm  , 配置文件/etc/php-fpm.conf ,/etc/php-fpm.d/
# chkconfig --add php-fpm
# chkconfig php-fpm on
# service php-fpm {start|stop}
  • 如果是编译php时,指定的--enable-fpm,

/usr/local/php/sbin/php-fpm start
配置文件: /usr/local/php/etc/php-fpm.conf

查看php-fpm是否启动,我们看到php-fpm监听在9000端口上

[root@localhost ~]# netstat -tulpn | grep php
tcp        0      0 127.0.0.1:9000         0.0.0.0:*         LISTEN    1192/php-fpm     

[root@localhost ~]# ps -ef | grep php
root      1472     1  0 16:14 ?        00:00:00 php-fpm: master process (/etc/php-fpm.conf)
apache    1473  1472  0 16:14 ?        00:00:00 php-fpm: pool www            
apache    1474  1472  0 16:14 ?        00:00:00 php-fpm: pool www            
apache    1475  1472  0 16:14 ?        00:00:00 php-fpm: pool www            
apache    1476  1472  0 16:14 ?        00:00:00 php-fpm: pool www            
apache    1477  1472  0 16:14 ?        00:00:00 php-fpm: pool www

php-fpm有一个主进程 master process,它负责其他子进程的创建与销毁工作。可以在/etc/php-fpm.conf, 以及/etc/php-fpm.d/*.conf中进行配置。


再测试下访问没问题,大功搞成咯。

wKiom1PR9h6ygli7AAOpptUgSiI877.jpg


参考:

https://www.centos.bz/2011/12/configure-apache-run-php-as-fastcgi/

http://ixdba.blog.51cto.com/2895551/806622

http://blog.sina.com.cn/s/blog_5b37dc680101586k.html

https://github.com/zhangmazi/CentOS/blob/master/LAMP%20%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85%EF%BC%88%E5%AE%8C%E6%95%B4%E7%89%88%EF%BC%89

http://www.cnblogs.com/whoamme/p/3530056.html

http://www.smallbigcake.com/2012/08/05/1572/

你可能感兴趣的:(apache,PHP,Module,fastcgi)