1.检查开发环境
 ]#yum grouplist
 ]#yum groupinstall "Development Tools" "Development Libraries" "X Software Development" " KDE Software Development" "GNOME Software Development"
2.
 #tar jxvf httpd-2.2.4.tar.bz2
 #date     因为有些源代码包可能比较新,有时候会比你的系统时间还快
 #hwclock -s 来同步一下我们的硬件时钟,将系统时钟同步为硬件时间
 #crontab -e  指定时钟同步计划,注意hwclock -s 在周期性任务计划中每同步一次会发邮件给管理员
 */2 * * * * /sbin/hwclock -s  &> /dev/null    
 #cd httpd-2.2.4
 #less INSTALL  这个文件和README都是编译时的帮助文档
 #less README    
 #./configure --help 查看我们安装源码包的特性
           这里我大至讲讲./configure --help 大概用到的3部分
           1.Installation directories
                --prefix=PREFIX  后面跟了一个默认值
           2.Fine tuning of the installation directories
                --sysconfdir  默认是在PREFIX/etc,不过这个目录太深
                ……
           3.Optional Features
              --enable     默认开启的功能,同下我们也可以开启默认关闭的功能
              --disable    默认关闭的功能 ,如果我们要开启就在./configure后面 写上--enable
           4.Option Package
              --with    这里一般有两个功能 1.一些源代码包中有一些子代码包,如果我们不指定的
               话,默认是不会为我们编译安装的,这时我们使用with将其加上去 2。我们在编译安装
               软件包的时候是依赖于其他的软件包,但是这个软件包的安装路径不在我们系统的默认
               PATH环境变量路径中,头文件也不在我们的默认目录下,这时就是用with的方式将其包
               含进来,也就是说我依赖的哪个软件包在什么位置下,以方便找到在编译安装当前软件包
               所依赖的软件包的。
 #./configure 
 --prefix=/usr/local/apache2  指定安装路径,因为apache有两个版本
 --sysconfdir=/etc/httpd  指定配置文件的安装目录
 --enable-so     启用apache的动态装载、卸载模块功能,apache是一个模块化的软件包
 --enable-ssl    启用支持openssl、https功能的打开
 --enable-track-vars 
 --enable-rewrite  启用url地址重写的,本来用户想访问
www.yayu.com,将其转化为bbs.yayu.com,很多网站都是开启这种引用的
 --with-zlib  zlib是一种压缩工具,开启在网络传输的时候使用压缩数据的模式进行传输
 --enable-mods-shared=most  所支持的模块共享模式有 all  most none

    注意:这里再次强调一下我们在编译完软件包之后一定要看看有什么error的信息没有
 #make 
    这一步就是将源代码包编译成2进制的程序,也要看看最后的信息!看看有什么报错的信息
 #make install
3. 编写httpd这个启动脚本
     在使用rpm包安装的时候redhat公司在我们的/etc/init.d/的目录中存放的有一个脚本,可以让我们的
 使用 service httpd start|stop|statue|restart 等命令,但是在我们编译安装apache是不会给我们提供这个
 脚本的。不过我们在编译安装apache之后,在/usr/local/apache/bin/apachectl 这个脚本接受 start|stop|status|restart
 命令,但是这个脚本不能自动的开机让我们的httpd启动起来,所以我们只能将其添加到/etc/rc.lcoal中。
 /etc/rc.local(这是一个在系统初始化提供登录界面之前最后留给用户可以定义一些动作的脚本,我们可以将
 /usr/local/apache/bin/apachectl start 这条命令写到这里。) 不过这里要提到的是,这种写在/etc/rc.local中的
 命令只能解决开机启动的问题,不能够实现在关机的时候自动停止服务。这样的话,我们的关机的时候会暴力
 的我们的httpd服务关闭的,所以我们还是需要一个类似redhat在/etc/init.d/httpd的脚本。不过有人会说我们
 直接把/usr/local/apache/bin/apachectl文件直接copy到/etc/init.d/目录中不就行了,这里我想说这里的apachectl
 这个文件虽然和redhat官方提供的httpd文件相似,但是这个文件首先没有定义chkconfig,第二显示管理机制不一样,风格
 不统一,好像有些时候我们使用stop不能将其完全停止(killall httpd 强制关闭所有httpd的进程),,所以建议以后自己能
 够手动的去写/etc/init.d/httpd这个文件
   
    这里强烈建议大家看看/etc/init.d/httpd这个脚本
    在这个脚本中强调几点值得学习的地方
    1. . /etc/rc.d/init.d/functions    这个function也是值得从事linux工作者值得一读的脚本
           . 等同于source,表示将/etc/rc.d/init.d/functions这个文件读进来
    2.  /etc/sysconfig/httpd   这个文件是httpd服务辅助配置文件,里面定义了让我们的httpd的MPM工作在worker模式下
    3. HTTPD_LANG=${HTTPD_LANG-"C"} 这个脚本表示如果HTTPD_LANG存在的话HTTPD_LANG的值就是其本生HTTPD_LANG如果不存在就是C
    4. apachectl=/usr/local/apache/bin/apachectl  修改apachectl启动脚本的位置
    5. httpd=/usr/local/apache/bin/httpd   修改httpd这个2进制程序所在的位置
    6. pidfile=${pidfile-/var/run/httpd.pid}  这里是定义httpd进程号文件所在的地方,但是我们手动编译安装的http
           的pidfile默认是存放在/usr/local/apache/logs中,所以我们可以在/etc/httpd/httpd.conf配置文件中手动添加进来
           一行Pidfile="/var/run/httpd.pid"
    7. lockfile=${} 这一这个文件不是httpd进程创建的,和进程没有关系,就是一个脚本用来判定服务是否处于正常状态的
       一种自我保护机制,防止我们的同一个httpd进程启动两次,当我们http服务启动第二次的时候,这个脚本就会告诉你
       httpd已经启动了,不用在启动了,所以这个变量不用修改
    8. check13 这个函数使用来检查我们的httpd是否为1.3的版本的,因为我们使用的是2.2的所以这个函数就不需要了
    9. 在start()这个函数中也有一个check13的函数引用,将这一行去掉
        
       在start()这个函数中有一行
           LANG=$HTTPD_LANG  deamon --pidfile=${pidfile} $httpd $Option
           这句话的意思是 在LANG为前面定义的$HTTPD_LANG的语言环境下 使用deamon函数(这个函数是定义在/etc/rc.d/init.d/functions中)
           并且制定我们的pidfile为${pidfile} 来启动我们的httpd服务,并且启动选项是Options(这个选项是在/etc/sysconfig/httpd中定义的)
    
 #less httpd httpd这个文件如下
   #!/bin/bash
   #
   # httpd        Startup script for the Apache HTTP Server
   #
   # chkconfig: - 85 15
   . /etc/rc.d/init.d/functions

   if [ -f /etc/sysconfig/httpd ]; then
        . /etc/sysconfig/httpd
   fi

   HTTPD_LANG=${HTTPD_LANG-"C"}
   INITLOG_ARGS=""
   apachectl=/usr/local/apache/bin/apachectl
   httpd=/usr/local/apache/bin/httpd
   prog=httpd
   pidfile=${PIDFILE-/var/run/httpd.pid}
   lockfile=${LOCKFILE-/var/lock/subsys/httpd}
   RETVAL=0
   
   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 10 $httpd   killproc是functions中的一个函数 -d是用来指定关闭时间的 $httpd 指定关闭httpd服务
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}  如果关闭成功的话就删除锁文件、pidfile文件
  }
  reload() {
    echo -n $"Reloading $prog: "
    if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then  -t 表示测试httpd配置文件是否有语法错误的
        RETVAL=$?
        echo $"not reloading due to configuration syntax error"  当我们检查之后发现有错误就显示这句话
        failure $"not reloading $httpd due to configuration syntax error"  failure是定义在functions中的函数,也是将后面的那句话显示出来
    else
        killproc -p ${pidfile} $httpd -HUP 向httpd服务传递一个1信号
        RETVAL=$?
    fi
    echo
  }
  case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  status)
        status -p ${pidfile} $httpd
        RETVAL=$?
        ;;
  restart)
        stop
        start
        ;;
  condrestart)
        if [ -f ${pidfile} ] ; then
                stop
                start
        fi
        ;;
  reload)
        reload
        ;;
  graceful|help|configtest|fullstatus)
        $apachectl $@
        RETVAL=$?
        ;;
  *)
        echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}"
        exit 1
  esac

  exit $RETVAL

 4.
   #chmod +x httpd
   #cp httpd /etc/init.d/
   #service httpd configtest  检验httpd这个启动脚本是否有语法错误
   #service httpd restart  做一下验证
   #chkconfig --add httpd   将httpd加入到chkconfig中区
   #chkconfig --list httpd
   #chkconfig httpd on  让我们的httpd 在2,3,4,5级别下自动启动
   #httpd -t   这也是用来检查语法错误的,但是这时候不能用,因为我们的path变量没有包含/usr/local/apache/bin
   #vim /etc/profile
      PATH=$PATH:/usr/local/apache/bin/   将httpd可执行的命令加入到PATH中
   #. !$ 重读/etc/profile文件
 5.
   定义man文件的路径
   #man -M /usr/local/apache/man httpd 这条命令是用来指定到哪取查看man文件
   为了想让我们man能够自动找到这个文件
   #vim /etc/man.conf
    MANPATH /usr/local/apache/man 
 6.
   我们的日志存放位置,修改/etc/httpd/httpd.conf ,这个文件(注意这和我们rpm包安装的路径不一样,不要混淆,rpm
包安装linux在 /etc/httpd/conf/httpd.conf 文件中)
   CustomLog /var/logs/httpd/access_log
   ErrorLog  /var/logs/httpd/error_log
 7
  头文件存放位置做链接,我们做这一步是为了让别的软件在用到apache的时候能够很方便的找到apache的头文件存放位置
  #ln -sv /usr/local/apache/include /usr/include/apache
 8
  库文件,这和头文件一样,如果我们不做的话,别的软件依赖的时候也是找不到的
  #vim /etc/ld.so.conf.d/apache.conf   在/etc/ld.so.conf.d/这个目录中以.conf结尾的文件就是制定了该服务库文件的搜索路径的
   /usr/local/apache/lib     将这句话填进去
  #ldconfig -v  新添加进去的不能立刻生效,这个命令就是重新导出一遍的
 9
  配置我们的网页存放位置 /etc/httpd/httpd.conf
  DocumentRoot ""
 10
  配置虚拟主机,1.注释中心主机DocumentRoot 2.在/etc/httpd/httpd.conf文件的最后几行中有两行
    #Virtual hosts
    Include /etc/httpd/extra/httpd-vhosts.conf  这一行原本是被注释的,现在开启
      /etc/httpd/extra/httpd-vhosts.conf ,这个文件中定义了几个样例的虚拟主机,
      如果我们想用的话,我们可以直接在这个文件修改就行了,因为我们Include这个文件了
 11
  开启ssl功能
  也是在/etc/httpd/httpd.conf最后几行中
    #Secure (SSL/TLS) connections
    Include /etc/httpd/extra/httpd-ssl.conf  将这一行开启
 
 apache已经编译完成了
###################################################################################
 编译安装mysql mysql-5.5.15-linux2.6-i686.tar.gz
 mysql的正确读法叫my s q l  mysql的rpm安装包是由mysql-server(服务器端)和mysql(客户端),但是这种rpm包是linux发行商
 所开行的包,我们的Mysql官方也是有自己的更新的rpm包(
http://mirrors.sohu.com/mysql 其中mysql和client是一些图形库图形客户端,devel是一些
 开发包,开发组件 embedded是用在嵌入式应用中的包 server是服务器端包 share是共享的被其他软件调用的组件如命令行、库 share-compact是一些向
 前兼容的包),不过这里我就不用rpm包安装了,如果我们想使用rpm包安装只要下载这些对应的包就行了。
 因为mysql的编译很繁琐,这里我就直接使用一个在
http://mirrors.sohu.com/mysql中mysql-5.5.15-linux2.6-i686.tar.gz的包(linux2.6是linux内核版本
 i686 i386 x86 是32位的平台 x86_64是64位的平台)这个包是Mysql已经为我们编译好成为2进制格式的包(说实话配置也很复杂,这里只是省略了编译的步骤而已)
 
 #pwd
 /root
 #tar zxf mysql-5.5.15-linux2.6-i686.tar.gz -C /usr/local 将其解压到/usr/local下
 #cd !$
 #ln -sv mysql-5.5.15-linux2.6-i686.tar.gz mysql  注意目录只能做软连接
 #groupadd -r mysql 创建系统用户mysql
 #useradd -s /sbin/nologin -g mysql -M mysql 创建一个不准登录系统,没有家目录的mysql用户
      (如果我们忘记了下面的每一步,我们可以在mysql目录中有一个INSTALL-BINARY的文件知道我们)
 #cd mysql
 #chown -R mysql:mysql . 修改每个文件的属组,属主
 #cd scripts
 #mysql_install_db --help
    --user  指定mysql以什么样的身份来运行
    --datadir 指定数据存放的位置,默认是在../data目录中不过在生产环境中我们一般要使用lvm的快照
     功能,这里我另外挂了一块硬盘做了lvm,并将其挂载/mydata下,在/mydata中创建一个属组、属主为mysql的data目录
 #mysql_install_db --user=mysql --datadir=/mydata/data  对mysql进行初始化
 #cd ..
 #chown -R root .
 #cd support-files 这个目录有my-huge.cnf my-large.cnf my-medium.cnf my-small.cnf ,这些都是根据内存分配的,一般512M
                    就是large了
 #cp my-large.cnf /etc/my.cnf ,设置配置文件注意必须存放在/etc/ 下
 #vim !$
  在【mysqld】中
  添加 datadir = /mydata/data
  修改 thread_concurrency = 4 并发线程数cpu的个数x2
 #cp mysql.server /etc/init.d/mysql  设置启动脚本,这个mysql.server要求我们加压缩的目录必须是在/usr/local/mysql下
 #service mysqld start
 #cd ..
 #chkconfig --add mysqld
 #chkconfig mysqld on
 #netstat -tnl 查看我们的3306端口是否开启
 #vim /etc/profile
  添加 PATH=$PATH:/usr/local/apache/bin:/usr/local/mysql/bin
 #. !$
 #ln -sv /usr/local/mysql/include /usr/include/mysql
 #vim /etc/ld.so.conf.d/mysql.conf
  添加 /usr/local/mysql/lib
 #ldconfig -v
 #vim /etc/man.conf
 添加 MANPATH /usr/local/mysql/man
 #man mysqld
 #
mysql的编译安装完成
###################################################################

php编译安装 php-5.3.6.tar.bz2
 #pwd
/root
 #tar jxf php-5.3.6.tar.bz2
 #cd php
 # mkdir -p /usr/local/php
 # cd php-5.2.3
 # ./configure --prefix=/usr/local/php              
   --with-apxs2=/usr/local/apache/bin/apxs  将我们的php做成apache的模块的
   --with-mysql=/usr/local/mysql  在编译的时候能够自动的访问mysql的驱动的
   --with-mysqli=/usr/local/mysql/bin/mysql_config 
   --with-libxml-dir
   --with-png-dir
   --with-jpeg-dir
   --with-zlib-dir
   --with-gd 
   --with-pear          以上是为了让我们的php能够实现绘图的
   --enable-track-vars
   --enable-mbstring=all
 # make
 # make install
 # cp php.ini-dist  /usr/local/php/lib/php.ini
   我们的php安装之后时不能够自动的和我们的apache整合在一起的,也不会提供一个php.conf的配置文件
   所以我们要修改httpd.conf,这个文件
   注:编辑apache配置文件httpd.conf,以apache支持php
   # vi /etc/httpd/httpd.conf
   1、添加如下二行
     AddType application/x-httpd-php  .php   这项必须,添加apache支持的文件类型
     AddType application/x-httpd-php-source  .phps  这个不是必须的

   2、定位至DirectoryIndex index.html 
     修改为:
     DirectoryIndex  index.php  index.html

   3、按照使用习惯,这里将网站根目录指定到/var/www:
     找到DocumentRoot “/usr/local/apache/htdocs”
     修改为:DocumentRoot “/var/www”(后文中我们还会注释掉此行,以启用虚拟主机)

     找到<Directory “/usr/local/apache/htdocs”>
     修改为:<Directory “/var/www”>
 #cp php.ini-production  /usr/local/php/lib/php.ini 这是我们php配置文件的存放位置
 #vim /etc/selinux/config 让我们的selinux开机时自动变为permissive,因为selinux是阻止apache加载php的
   SELINUX=permissive
 #setenforce 0
 #service httpd restart
 #
 测试
 #cd /var/www
 #vim index.php
  <?php
  phpinfo();         这是测试php是否工作正常
  ?>
 #vim index.php
  <?php
  $link=mysql_connect(localhost,'root','');
  if ($link)
      echo "success!";   这是测试我们的mysql能否连接上
  else
      echo "failure!";
  ?>

最后要说的是,这里我没有配置DNS解析,需要用ip地址指定,在做基于域名的虚拟主机的时候,无法检测

本文出自 “近水楼台,向阳花木” 博客,请务必保留此出处http://ichthus.blog.51cto.com/3475712/738396