一、概述    

       首先,如标题所示我接下来的实验就是搭建一个LAMP平台然后实现一个Blog站点的实现,那"Php基于Apache的模块实现"这又是神马意思呢,我们知道Apache与Php的结合方式有常见的三种:基于module、基于CGI、基于Fast-CGI;

       基于Module,指的就是Php在Apache编译时就直接编译成模块,以模块化的方式进行工作的,而当Apache需要解析Apache脚本时,它将直接调用这个模块的功能就可以了,它作为Apache的一个子进程来工作,而无需启动一个单独的进程,这里的前提就是Apache必须先装载Php模块;

       基于CGI,Common Gateway Interface通用网关接口,它是一种特殊的协议;例如客户端请求了资源,httpd本身是无法解析脚本的,它也不可能将脚本执行以后返还给客户端,因此如果我们想在服务器端当用户请求一些特定资源时,将这种资源不是直接返还给客户端,而是让这个资源在服务器上先执行,把结果交给httpd,最后再回复给客户端,于是再详细点说就是:httpd本身不具备任何资源的解析功能,那就只能让httpd基于CGI协议将去调用客户请求的资源相对应的需要执行程序所拥有的执行环境来解析(例如这里提到的Php脚本资源),环境再将执行的结果返还给httpd,最后再将结果响应给客户端;所以CGI是能让我们的httpd服务能跟某一个应用程序执行环境进行通信并且能从这个环境获取执行结果的协议;所有能够基于CGI协议工作的协议都能够用作开发动态网站;但是CGI协议过于粗糙和简陋并且基于这种模式通信时它要求后端应用程序为了到达某种目的、获取某种资源必须要以管理员的身份去运行,这样一来就又有安全隐患了;于是基于CGI这样的模式逐渐淘汰了....所以现在有很多动态网站与前端通信时都不再基于CGI,比如Php的SAPI机制、Python的UWSGI的机制等等...它们使得这些脚本在执行时无需使用系统资源权限,而是在自己的程序环境中运行,对某些目录有操作权限就足够了;

       基于Fast-CGI,上面我已经提到了基于模块时Php的工作模式,如果httpd启动的进程都运行Php代码,所以它会启动多个Php进程,对于httpd来说这些进程以后还需要关闭、收回、管理等等这样就变得非常的麻烦了,于是我为什么不让Php自己运行为一个服务,类似于httpd的prefork工作模式一样:启动时生成多少个子进程、最大空闲进程、最小空闲进程等等,当httpd需要运行Php代码时基于套接字连接Php这个服务所监听的端口上,将Php代码发送给Php由它其中的一个进程响应并解释运行后将结果返回给httpd,基于这样的机制,Php和httpd通信就需要一种协议了,这种协议就是Fast-CGI,于是这样一来Php作为一个单独的服务可以运行了,那我们就可以将它独立出来运行在不同的主机上了;  

他们三者的如何结合的呢?请看下图:
 Linux网络服务-LAMP之Php基于Apache的模块实现_LAMP PHP MYSQL 源码 CG

1、apache是服务器基础,php和mysql都需要他来协调工作,注意,客户端的请求只是对Apache,并且Apache不会和MYSQL之间直接通信,而是基于某个应用程序连接到数据库

2、php是脚本解释语言,负责httpd服务器发过来需要解析Php脚本的功能,如果不用php那么apache出来的东西就只是静态的内容,完成解析后结果将返回httpd,最后返回给客户端,后端的话Php通过一个mysql_connect于MYSQL建连接关系

3、mysql是数据库,完全可以单独使用,但是和另外两个一起,则是由php代码调用mysql接口,而Php就负责解释php代码,让他能真正地实现对mysql的调用

这三者的关系放在这里,大概可以这样理解成这样

上图只是说明三者之间的关系,但是我要基于php模块来搭建的话就将HTTP与PHP整合到一台主机上了,让MYSQL独立出来,下面是拓扑图:

 Linux网络服务-LAMP之Php基于Apache的模块实现_LAMP PHP MYSQL 源码 CG_02

现在稍微理清了下思绪,我们开始来进行实验吧,

一、实验说明:

1、启动两台Centos6.5_X86-64系统的虚拟机,分别作为HTTP+PHP(fastcgi)、MYSQL;

       HTTP+PHP(fastcgi) IP -> 172.16.41.1

                ServerName -> www.maoqiu.com

       MYSQ  IP -> 172.16.41.2

                ServerName  ->  mysql.maoqiu.com

2、Client使用我的Windows;并在hosts文件中填入httpd服务器的IP及主机名对应关系;

       172.16.41.1     www.maoqiu.com

实验准备:

1.因为要用到yum,所以请事先确保好yum源的配置是否已经妥当

2.开发工具的支持

[root@www ~]# yum groupinstall -y "Development tools"
[root@www ~]# yum groupinstall -y "Server Platform Development"

实验步骤:

二、源码编译安装httpd-2.4.9

1、安装httpd依赖包pcre-devel(yum安装即可)

[root@www ~]# yum install -y pcre-devel

2、解压已获取到的httpd-2.4.9,apr,apr-util软件包,并安装:

#→解压安装apr
[root@www ~]#tar -xf apr-1.5.0.tar.bz2 -C /usr/src/
[root@www ~]# cd /usr/src/apr-1.5.0
[root@www apr-1.5.0]# ./configure \
> --prefix=/usr/local/apr     #→指定其安装位置
[root@www apr-1.5.0]# make && make install
 #→解压安装apr-util
[root@www ~]#tar -xf apr-util-1.5.3.tar.bz2 -C /usr/src/
[root@www ~]# cd /usr/src/apr-util-1.5.3
[root@www apr-util-1.5.3]# ./configure \
> --prefix=/usr/local/apr-util \    #→指定其安装位置
> --with-apr=/usr/local/apr     #→指定apr安装在哪个位置的
[root@www apr-util-1.5.3]# make && make install
 #→解压安装httpd
[root@www ~]#tar -xf httpd-2.4.9.tar.bz2 -C /usr/src
[root@www ~]# cd /usr/src/httpd-2.4.9
[root@www httpd-2.4.9]# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd --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=most --with-mpm=event
说明
--prefix=/usr/local/apache2  #→指定其安装位置
--sysconfdir=/etc/httpd2  #→指定配置文件安装位置
--enable-so   #→启用基于DSO的方式动态加载模块
--enable-ssl   #→启用基于https协议的功能
--enable-cgi   #→启用基于cgi协议的功能
--enable-rewrite  #→启用支持URL重写的功能
--with-zlib   #→指定支持在互联网上发送数据报文时,通用的压缩库的API
--with-pcre  #→指定支持poll的cgi
--with-apr=/usr/local/apr    #→指定par的安装路径
--with-apr-util=/usr/local/apr-util/   #→指定par-util的安装路径
--enable-modules=most   #→启用大多数常用的模块
--enable-mpms-shared=all   #→启用加载所有的mpm模块
--with-mpm=event     #→指定接下来httpd的工作模式是event
[root@www httpd-2.4.9]# make && make install

补充:
       (1)构建MPM为静态模块
       在全部平台中,MPM都可以构建为静态模块。在构建时选择一种MPM,链接到服务器中。如果要改变MPM,必须重新构建。为了使用指定的MPM,请在执行configure脚本 时,使用参数 --with-mpm=NAME。NAME是指定的MPM名称。编译完成后,可以使用 ./httpd -l 来确定选择的MPM。 此命令会列出编译到服务器程序中的所有模块,包括 MPM.
       (2)构建 MPM 为动态模块
       在Unix或类似平台中,MPM可以构建为动态模块,与其它动态模块一样在运行时加载。 构建 MPM 为动态模块允许通过修改LoadModule指令内容来改变MPM,而不用重新
构建服务器程序。在执行configure脚本时,使用--enable-mpms-shared选项即可启用此特性。当给出的参数为all时,所有此平台支持的MPM模块都会被安装。还可以在参数中给出模块列表。默认MPM,可以自动选择或者在执行configure脚本时通过--with-mpm选项来指定,然后出现在生成的服务器配置文件中。编辑LoadModule指令内容可以选择不同的MPM.

3、修改httpd的主配置文件,设置其Pid文件的路径

#编辑/etc/httpd/httpd.conf,添加如下行即可:
PidFile  "/var/run/httpd.pid"

4、提供SysV服务脚本/etc/rc.d/init.d/httpd,内容如下:

#此服务脚本我们复制以前系统自带的httpd服务的脚本,然后做下修改
[root@www httpd]# cp /etc/rc.d/init.d/httpd /etc/rc.d/init.d/httpd2
[root@www httpd]# vim /etc/rc.d/init.d/httpd2
# processname: httpd
# config: /etc/httpd/conf/httpd.conf
# config: /etc/sysconfig/httpd
# pidfile: /var/run/httpd.pid
#
### BEGIN INIT INFO
# Provides: httpd
# Required-Start: $local_fs $remote_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Should-Start: distcache
# Short-Description: start and stop Apache HTTP Server
# Description: The Apache HTTP Server is an extensible server
#  implementing the current HTTP standards.
### END INIT INFO
# Source function library.
. /etc/rc.d/init.d/functions
if [ -f /etc/sysconfig/httpd ]; then
        . /etc/sysconfig/httpd
fi
# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG-"C"}
INITLOG_ARGS=""
apachectl=/usr/local/apache2/bin/apachectl #→改变一下我们编译安装后的程序路径
httpd=${HTTPD-/usr/local/apache2/bin/httpd} #→改变一下我们编译安装后的程序路径
prog=httpd
pidfile=${PIDFILE-/var/run/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
RETVAL=0
STOP_TIMEOUT=${STOP_TIMEOUT-10}
start() {
        echo -n $"Starting $prog: "
        LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch ${lockfile}
        return $RETVAL
}
stop() {
        echo -n $"Stopping $prog: "
        killproc -p ${pidfile} -d ${STOP_TIMEOUT} $httpd
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
reload() {
    echo -n $"Reloading $prog: "
    if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then
        RETVAL=6
        echo $"not reloading due to configuration syntax error"
        failure $"not reloading $httpd due to configuration syntax error"
    else
        # Force LSB behaviour from killproc
        LSB=1 killproc -p ${pidfile} $httpd -HUP
        RETVAL=$?
        if [ $RETVAL -eq 7 ]; then
            failure $"httpd shutdown"
        fi
    fi
    echo
}
# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  status)
        status -p ${pidfile} $httpd
        RETVAL=$?
        ;;
  restart)
        stop
        start
        ;;
  condrestart|try-restart)
        if status -p ${pidfile} $httpd >&/dev/null; then
                stop
                start
        fi
        ;;
  force-reload|reload)
        reload
        ;;
  graceful|help|configtest|fullstatus)
        $apachectl $@
        RETVAL=$?
        ;;
  *)
        echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}"
        RETVAL=2
esac
exit $RETVAL
#为此服务脚本赋予执行权限并加入开机启动项:
[root@www httpd]# chmod +x /etc/rc.d/init.d/httpd2
[root@www httpd]# chkconfig --add httpd2
[root@www httpd]# chkconfig --list httpd2
httpd2          0:off   1:off   2:off   3:off   4:off   5:off   6:off
[root@www httpd]# chkconfig httpd2 on
[root@www httpd]# chkconfig --list httpd2
httpd2          0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@www httpd]#
#注意:这时候一定要把系统自动的那个httpd服务给停掉!

5、验证我们的编译安装是否成功了

#启动我源码编译安装的httpd服务
[root@www httpd]# service httpd2 start
Starting httpd:                                            [  OK  ]
[root@www httpd]#
[root@www httpd]# ps -elFH
1 S root      1037     1  0  80   0 - 18186 poll_s  2180   0 01:17 ?        00:00:00   /usr/local/apache2/bin/httpd
5 S daemon    1039  1037  0  80   0 - 104251 pipe_w 4076   0 01:17 ?        00:00:00     /usr/local/apache2/bin/httpd
5 S daemon    1040  1037  0  80   0 - 104251 pipe_w 4080   0 01:17 ?        00:00:00     /usr/local/apache2/bin/httpd
5 S daemon    1041  1037  0  80   0 - 104251 pipe_w 4088   0 01:17 ?        00:00:00     /usr/local/apache2/bin/httpd
#看到上面的数据没有,默认启动了三个进程,工作在event模式下的
#网页访问一下:
[root@www httpd]# echo "<h1>Source Apache.<h1>" >/usr/local/apache2/htdocs/index.html
[root@www httpd]# service httpd2 reload #→重载一下配置文件
Reloading httpd:
[root@www httpd]#

 Linux网络服务-LAMP之Php基于Apache的模块实现_LAMP PHP MYSQL 源码 CG_03

OK!我的Apache编译安装测试成功...告一段落!


三、二进制编译安装MYSQL

注意开发环境的支持,按照上面的安装就行了,这里我直接就开始解压安装

1、准备数据存放的文件系统

#新建一个逻辑卷,并将其挂载至特定目录,至于为什么要用逻辑卷,后面详说
[root@mysql ~]# fdisk /dev/sda
[root@mysql ~]# mke2fs -t ext4 /dev/sda3
[root@mysql ~]# mkdir -p /databases/data
[root@mysql ~]# vim /etc/fstab
/dev/sda3               /databases/              ext4    defaults        0 0
[root@mysql ~]# mount -a

2、新建用户以安全方式运行进程

[root@mysql ~]# groupadd -r mysql
[root@mysql ~]# useradd -g mysql -r -s /sbin/nologin -M -d /databases/data mysql
[root@mysql ~]# chown -R mysql:mysql /databases/data

3、安装并初始化mysql-5.5.33

[root@mysql ~]# cd /usr/local/
[root@mysql local]# ln -sv mysql-5.5.33-linux2.6-x86_64 mysql
`mysql' -> `mysql-5.5.33-linux2.6-x86_64'
[root@mysql local]# cd  mysql
[root@mysql mysql]# chown -R mysql:mysql ./*
[root@mysql mysql]# scripts/mysql_install_db --user=mysql --datadir=/databases/data
[root@mysql mysql]# chown -R root ./*

4、为mysql提供主配置文件

[root@mysql mysql]# cp support-files/my-large.cnf  /etc/my.cnf
#并修改此文件中thread_concurrency的值为你的CPU个数乘以2,比如这里使用如下行:
thread_concurrency = 2
#另外还需要添加如下行指定mysql数据文件的存放位置:
datadir = /databases/data

5、为mysql提供sysv服务脚本

[root@mysql ~]# cd /usr/local/mysql
[root@mysql mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@mysql mysql]# chmod +x /etc/rc.d/init.d/mysqld
[root@mysql mysql]# chkconfig --add mysqld
[root@mysql mysql]# chkconfig --list mysqld
mysqld          0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@mysql mysql]#

6、修改PATH环境变量,让系统可以直接使用mysql的相关命令

[root@mysql mysql]# vim /etc/profile.d/mysqld.sh
export PATH=/usr/local/mysql/bin:$PATH #加入此行
[root@mysql mysql]# source /etc/profile.d/mysqld.sh

7、启动服务并测试

[root@mysql mysql]# service mysqld start
Starting MySQL...                                    [  OK  ]
[root@mysql mysql]# mysql
[root@mysql mysql]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.33-log MySQL Community Server (GPL)
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>       #→成功登录!
#→为root用户设密码,并删除不必要的用户
mysql> use mysql
Database changed
mysql> select host,user,password from user;
+------------------+------+----------+
| host             | user | password |
+------------------+------+----------+
| localhost        | root |          |
| mysql.maoqiu.com | root |          |
| 127.0.0.1        | root |          |
| ::1              | root |          |
| localhost        |      |          |
| mysql.maoqiu.com |      |          |
+------------------+------+----------+
6 rows in set (0.00 sec)
mysql> DELETE FROM user WHERE User = '' ; #→删除用户为空的条目
Query OK, 2 rows affected (0.00 sec)
mysql> DELETE FROM user WHERE User = '::1' ; #→删除IPV6相关的这个条目
Query OK, 0 rows affected (0.00 sec)
mysql> select host,user,password from user;
+------------------+------+----------+
| host             | user | password |
+------------------+------+----------+
| localhost        | root |          |
| mysql.maoqiu.com | root |          |
| 127.0.0.1        | root |          |
+------------------+------+----------+
3 rows in set (0.00 sec)
mysql> FLUSH PRIVILEGES; #→做了操作一定要记得刷新数据库
Query OK, 0 rows affected (0.01 sec)
mysql> UPDATE user SET password = PASSWORD('guo.150019') WHERE password = '';
Query OK, 3 rows affected (0.01 sec)
Rows matched: 3  Changed: 3  Warnings: 0
mysql> select host,user,password from user;
+------------------+------+-------------------------------------------+
| host             | user | password                                  |
+------------------+------+-------------------------------------------+
| localhost        | root | *736C3B5499F163A84CCB2C0F176F3ABC93410FB5 |
| mysql.maoqiu.com | root | *736C3B5499F163A84CCB2C0F176F3ABC93410FB5 |
| 127.0.0.1        | root | *736C3B5499F163A84CCB2C0F176F3ABC93410FB5 |
+------------------+------+-------------------------------------------+
3 rows in set (0.00 sec)
mysql>  #→做了操作一定要记得刷新数据库

8、为了使用mysql的安装符合系统使用规范,并将其开发组件导出给系统使用,这里还需要进行如下步骤

#输出mysql的man手册至man命令的查找路径:
[root@mysql mysql]# vim /etc/man.config
MANPATH  /usr/local/mysql/man  #→添加此行即可
#输出mysql的头文件至系统头文件路径/usr/include:
[root@mysql mysql]# ln -sv /usr/local/mysql/include  /usr/include/mysql #→通过简单的创建链接实现
#输出mysql的库文件给系统库查找路径:
[root@mysql mysql]# echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf
[root@mysql mysql]#ldconfig #→让系统重新载入系统库:

好了,我的MYSQL源码编译安装告一段落!


四、编译安装PHP-5.4.26

好,回到我们的httpd服务器上面去继续安装php...

注意开发环境的支持,除了按照上面安装那些开发工具包之外我们还需要添加几个:

[root@www ~]# yum -y groupinstall "Desktop Platform Development"
[root@www ~]# yum -y install bzip2-devel libmcrypt-devel

就行了,这里我直接就开始解压安装了

1、解压已获取到的php-5.4.26软件包,并安装

[root@www ~]# cd /usr/src/php-5.4.26/
[root@www php-5.4.26]# ./configure--prefix=/usr/local/php --with-openssl --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --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/apache2/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 #→指定其安装位置
--with-openssl #→指定支持openssl功能
--with-mysql=mysqlnd #→指定与mysql服务器的链接
--with-mysqli=mysqlnd #→指定与mysql服务器的链接
--with-pdo-mysql=mysqlnd #→指定与mysql服务器的链接
--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支持套接字功能
--with-apxs2=/usr/local/apache2/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,编译时使用该选项
[root@www php-5.4.26]# make && make test && make install

说明:
(1)这里为了支持apache的worker或event这两个MPM,编译时使用了--enable-maintainer-zts选项。
(2)如果使用PHP5.3以上版本,为了链接MySQL数据库,可以指定mysqlnd,这样在本机就不需要先安装MySQL或MySQL开发包了。mysqlnd从php 5.3开始可用,可以编译时绑定到它(而不用和具体的MySQL客户端库绑定形成依赖),但从PHP 5.4开始它就是默认设置了。

--with-mysql=mysqlnd

--with-mysqli=mysqlnd

--with-pdo-mysql=mysqlnd

2、为php提供配置文件

[root@www php-5.4.26]# cp php.ini-production /etc/php.ini

3、编辑apache配置文件httpd.conf,以apache支持php

[root@www ~]# vim /etc/httpd2/httpd.conf
#添加以下两行
AddType application/x-httpd-php  .php
AddType application/x-httpd-php-source  .phps
#定位至DirectoryIndex index.html
#修改为:
#DirectoryIndex  index.php  index.html

4、添加测试文件,并测试

#我先在mysql服务器上面建立一个mysql的远程管理帐号
[root@mysql ~]# mysql -uroot -pguo.150019
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 47
Server version: 5.5.33-log MySQL Community Server (GPL)
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> GRANT ALL PRIVILEGES ON   *.* TO 'guomaoqiu'@'%' IDENTIFIED by 'guo.150019';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES; #→一定要记得刷新数据库哦!
Query OK, 0 rows affected (0.00 sec)
mysql> use mysql;
Database changed
mysql> select host,user,password from user;
+------------------+-----------+-------------------------------------------+
| host             | user      | password                                  |
+------------------+-----------+-------------------------------------------+
| localhost        | root      | *736C3B5499F163A84CCB2C0F176F3ABC93410FB5 |
| mysql.maoqiu.com | root      | *736C3B5499F163A84CCB2C0F176F3ABC93410FB5 |
| 127.0.0.1        | root      | *736C3B5499F163A84CCB2C0F176F3ABC93410FB5 |
| %                | guomaoqiu | *736C3B5499F163A84CCB2C0F176F3ABC93410FB5 |
+------------------+-----------+-------------------------------------------+
4 rows in set (0.00 sec)
#在我的httpd服务器上面添加一个测试页面,看PHP和MYSQL是否能正常工作了
[root@www ~]# cd /usr/local/apache2/htdocs/
[root@www htdocs]# mv index.html index.php
[root@www htdocs]# vim index.php
<?php
  $link = mysql_connect('172.16.41.2','guomaoqiu','guo.150019');
        if ($link)
                echo "Connect to Mysql server success!";
        else
                echo "Connect to Mysql server failure!";
        mysql_close();
        phpinfo();
?>
[root@www htdocs]# service httpd2 reload
Reloading httpd:
[root@www htdocs]#

我在浏览器里面访问一下:

 Linux网络服务-LAMP之Php基于Apache的模块实现_LAMP PHP MYSQL 源码 CG_04

  OK!现在我的php和mysql都能工作了,下面我再把mysql的图形化管理工具phpMyAdmin给安装上


五、搭建phpMyadmin管理平台以及wordpress个人博客系统

为了phpMyadmin这个工具通过单独的一个页面服务的方式来访问外,等下我们还有一个博客系统也需要自己的文档目录所以我这里将使用虚拟机的方式来搭建各个站点:

1、搭建phpMyadmin管理平台

(1)在http服务器上关闭中心主机,启用虚拟主机

#编辑主配置文件
[root@www ~]# vim /etc/httpd2/httpd.conf
#定位到下面这行后将此行添加注释
DocumentRoot "/usr/local/apache2/htdocs"
#DocumentRoot "/usr/local/apache2/htdocs"
#定位到下面这行后将此行取消注释
#Include /etc/httpd2/extra/httpd-vhosts.conf
Include /etc/httpd2/extra/httpd-vhosts.conf

(2)编辑虚拟主机文件启用虚拟主机

[root@www ~]# vim /etc/httpd2/extra/httpd-vhosts.conf
 #我现在把中心主机也给定义到这里面来
 <VirtualHost *:80>
    ServerAdmin guomaoqiu@sina.com #→HTTP管理员邮箱
    DocumentRoot "/usr/local/apache2/htdocs" #→中心主机的DocumentRoot
    ServerName www.maoqiu.com
    CustomLog "logs/access_log" combined
    ErrorLog "logs/error_log"
    <Directory "/usr/local/apache2/htdocs"> #→这里定义的是要对该目录授权,这是httpd2.4的大改变之一
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>

(3)安装phpMyadmin工具

[root@www ~]# mkdir /usr/local/apache2/htdocs/phpmyadm #→创建的根目录
   [root@www ~]# tar xf phpMyAdmlin-3.4.10.1-all-languages.tar.bz2
   [root@www ~]# cp -r phpMyAdmin-3.4.10.1-all-languages/* /usr/local/apache2/htdocs/phpmyadm/
   #→将该工具的所有文件拷贝至文至这个工具的根目录
   [root@www htdocs]# cp config.sample.inc.php config.inc.php
   [root@www htdocs]# vim config.inc.php
   #这行两个冒号之间我们需要一串cookie码,随机生成一个填在里面
   $cfg['blowfish_secret'] = ''; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
   $cfg['Servers'][$i]['host'] = '172.16.41.2'; #→这是mysql服务器地址
   [root@www htdocs]# openssl rand -hex 10  #→通过openssl生成一串随机码
   ddf5bab147f6cfaef020
   $cfg['blowfish_secret'] = 'ddf5bab147f6cfaef020'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

(4)测试我phpMyadmin能否正常工作了
   在浏览器中输入http://www.maoqiu.com/phpmyadm

 Linux网络服务-LAMP之Php基于Apache的模块实现_LAMP PHP MYSQL 源码 CG_05


   可以访问了...现在登录一下试试

 Linux网络服务-LAMP之Php基于Apache的模块实现_LAMP PHP MYSQL 源码 CG_06

   OK!phpMyadmin可以使用了,下面我把wordpress搭建起来

2、搭建wordpress个人博客系统
(1)解压安装wordpress

[root@www ~]# unzip wordpress-3.3.1-zh_CN.zip
[root@www ~]# cd wordpress
#为其提供配置文件 
[root@www wordpress]# cp wp-config-sample.php wp-config.php
#我之前不是说过这个博客系统需要另外一台虚拟主机来实现的吗,所以下面创建一个作为博客系统根的目录
[root@www wordpress]# mkdir -p /web/blog/wordpress/htdocs
#再将我现在所在目录下的文件全部移动到那个目录中去
[root@www wordpress]# mv ./* /web/blog/wordpress/htdocs/

(2)配置虚拟主机

[root@www ~]# vim /etc/httpd2/extra/httpd-vhosts.conf
#添加以下内容:
<VirtualHost *:80>
    DocumentRoot "/web/blog/wordpress/htdocs" #→这是wordpress博客系统的根目录
    ServerName www.wordguo.org #→这是它的主机名
    CustomLog "logs/blog-access_log" combined #→访问日志
    ErrorLog "logs/blog-error_log" #→错误日志
    <Directory "/web/blog/wordpress/htdocs"> #→定义对于这个文档根目录的一个访问权限
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>
#保存退出!

(4)配置数据库,我们都知道博客系统的账户都是存在后端的数据库中的,故此现需要创建一个博客的数据库

[root@mysql ~]# mysql -uroot -pguo.150019
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.5.33-log MySQL Community Server (GPL)
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> CREATE DATABASE worddb; #→这是博客系统的数据库
Query OK, 1 row affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON worddb.* TO 'worduser'@'%' IDENTIFIED BY 'guo.150019'; #→我授权worduser用户对该数据库具有管理权限,并且它可以在任何远程主机上登陆该数据库操作
Query OK, 0 rows affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| worddb             |#→已经创建好了
+--------------------+
5 rows in set (0.00 sec)
mysql> FLUSH PRIVILEGES; #→千万要记得刷新数据库
Query OK, 0 rows affected (0.00 sec)
mysql>

(3)修改wordpress配置文件

[root@www ~]# vim /web/blog/wordpress/htdocs/wp-config.php
#修改下面四项即可
define('DB_NAME', 'worddb'); #→WordPress 数据库的名称
define('DB_USER', 'worduser'); #→MySQL 数据库用户名
define('DB_PASSWORD', 'guo.150019'); #→MySQL 数据库密码
define('DB_HOST', '172.16.41.2'); #→MySQL 主机
#保存退出!

(3)重新加载配置文件

[root@www ~]# service httpd2 reload
Reloading httpd:
[root@www ~]#

(4)测试,在客户端浏览器中输入http://www.wordpress.org 即可!

   (注意,我这里并没有搭建DNS,故此处的名称解析将在客户端hosts文件中定义)

 Linux网络服务-LAMP之Php基于Apache的模块实现_LAMP PHP MYSQL 源码 CG_07


OK!看到出来了吧,此时我已经把个人博客的资料填写好了直接点击“安装wordpress”

 Linux网络服务-LAMP之Php基于Apache的模块实现_LAMP PHP MYSQL 源码 CG_08


点击“登录” 输入用户名和密码,再点“登录”

 Linux网络服务-LAMP之Php基于Apache的模块实现_LAMP PHP MYSQL 源码 CG_09


 Linux网络服务-LAMP之Php基于Apache的模块实现_LAMP PHP MYSQL 源码 CG_10


OK! 我登录之后因为第一次安装wordpress这个系统,直接就到后台管理页面了,我点击首页即可!

 Linux网络服务-LAMP之Php基于Apache的模块实现_LAMP PHP MYSQL 源码 CG_11


六、总结

   以上实验介绍了httpd、php以及mysl的编译安装,构建了一个简单的LAMP平台,实现了HTTP+Apache+Mysql+Php+Wordpress/Phpmyadmin的一个简易场景;在实验过程当中也因为自己的马虎有许多配置都错了 ,不得不反复的测试,反复的修改,最终才搭建出来上面这样的环境;
   在整个实验过程中用到的知识点有以下几点:
   1、当客户端对httpd服务器发起了一个Php脚本请求时,我们的httpd服务器自身不能解析执行该Php脚本文件的,于是它将此请求交予Php解释环境来执行;
   2、httpd除了基于CGI和Php通信外,还有多种方式(后面会有实验案例);
   3、httpd是模块化的,有core+module构成,我们可以将Php编译成httpd的一个模块,让它在httpd启动的同时加载该模块,此时就成为了httpd的一个子进程、子功能来运行;
   4、如果使用PHP5.3以上版本,为了链接MySQL数据库,可以指定mysqlnd,这样在本机就不需要先安装MySQL或MySQL开发包了。mysqlnd从php5.3开始可用,可以编译时绑定到它(而不用和具体的MySQL客户端库绑定形成依赖),但从PHP 5.4开始它就是默认设置了。编译php时,如果需要驱动mysql,使用--with-mysql=mysqlnd等几个选项;
   5、客户端与httpd之间基于HTTP/HTTPS协议通信、httpd与Php通信时它已经成为了httpd的一部分,在其内部就完成工作、而Php与Mysql之间通信则通过API基于mysql协议来实现;
   6、如果mysql与其他应用程序不在一主机上那就需要授权具有远程连接访问权限的mysql用户帐号;


OK!自此为止...
下篇将介绍 分离式LAMP+NFS的平台搭建
小生能力有限,各位大牛多多指点!