011-httpd-compiling and installing httpd-2.4 on CentOS 6
CentOS 6
安装开发工具包组
[root@localhost yum.repos.d]# yum groupinstall "Development Tools"
[root@localhost yum.repos.d]# yum groupinstall "Server Platform Development"
[root@localhost yum.repos.d]# yum install pcre
[root@localhost yum.repos.d]# yum install pcre-devel
下载源代码
要求apr-1.4+ apr-util-1.4+ httpd-2.4+
解压apr-1.4.6.tar.bz2 apr-util-1.4.1.tar.bz2 httpd-2.4.6.tar.bz2
[root@localhost ~]# tar -xjf apr-util-1.4.1.tar.bz2
[root@localhost ~]# tar -xjf apr-1.4.6.tar.bz2
[root@localhost ~]# tar -xjf httpd-2.4.6.tar.bz2
编译安装
在编译安装的过程中,默认安装的位置当时可能不在乎,但是如果要卸载的时候,编译安装的程序将会是一个麻烦,所以在编译安装的时候,尽量使用下面的格式。不过有的程序在编译安装的时候,其安装目录也会有build文件夹,这个文件中的文件中记录着编译时的各种选项等
]# make >& LOG_make
]# make install >& LOG_install
当前httpd位置
[root@localhost yum.repos.d]# which httpd
/usr/sbin/httpd
将httpd及其依赖安装至/usr/local目录下
apr-1.4+
[root@localhost apr-1.4.6]# pwd
/root/apr-1.4.6
[root@localhost apr-1.4.6]# ./configure --prefix=/usr/local/apr
[root@localhost apr-1.4.6]# make -j 2 && make install
apr-util-1.4+
[root@localhost apr-util-1.4.1]# pwd
/root/apr-util-1.4.1
[root@localhost apr-util-1.4.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@localhost apr-util-1.4.1]# make -j 2 && make install
httpd-2.4+
[root@localhost httpd-2.4.6]# pwd
/root/httpd-2.4.6
[root@localhost httpd-2.4.6]# ./configure --prefix=/usr/local/apache24 --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
[root@localhost httpd-2.4.6]# make -j 2 && make install
安装后配置
1、导出头文件
如果其他程序需要使用httpd程序的各种头文件怎么办呢?一种方式就是直接显示的使用gcc指定头文件位置编译,有没有更简单的方法呢?那就是在gcc默认的搜索路径/usr/include 和 /usr/local/include中添加安装程序的头文件,最简单的方式就是使用软链接了,在程序中使用#include “httpd/xxxx.h”就可以使用httpd中的头文件了。
#在/usr/include目录下创建软链接指向程序的include目录
[root@localhost ~]# ls /usr/local/apache24/
bin build cgi-bin error htdocs icons include logs man manual modules
[root@localhost ~]# ln -sv /usr/local/apache24/include /usr/include/httpd
`/usr/include/httpd' -> `/usr/local/apache24/include'
[root@localhost bin]# ps aux | grep httpd
root 103002 0.0 0.2 72840 2484 ? Ss 05:00 0:00 /usr/local/apache24/bin/httpd
daemon 103003 0.0 0.1 72840 1868 ? S 05:00 0:00 /usr/local/apache24/bin/httpd
daemon 103004 0.0 0.1 72840 1868 ? S 05:00 0:00 /usr/local/apache24/bin/httpd
daemon 103005 0.0 0.1 72840 1868 ? S 05:00 0:00 /usr/local/apache24/bin/httpd
daemon 103006 0.0 0.1 72840 1868 ? S 05:00 0:00 /usr/local/apache24/bin/httpd
daemon 103007 0.0 0.1 72840 1868 ? S 05:00 0:00 /usr/local/apache24/bin/httpd
root 103009 0.0 0.0 103308 856 pts/4 S+ 05:00 0:00 grep httpd
2、导出库文件
在./configure的时候,如果没有指定lib的位置,那么lib就会有一个默认位置,这个位置可能在prefix下,也可能直接配置在某个lib目录下,因此lib的位置不同。
由于linux中库文件是基于ld程序的,如果httpd在编译安装的过程中它的库安装在/lib64或者/usr/lib64中,ld程序是可以找到httpd依赖的库的,如果安装在其他目录,那么如果其他程序需要httpd的库文件,系统就不能找到它的位置,所以导出库文件的意思就是共享httpd的库文件到整个系统,这样其他程序需要使用httpd的库文件的时候系统就可以轻松找到。就需要把库添加到/etc/ld.so.cache文件中。这个添加过程最简单的方式是使用ldconfig命令。
ldconfig作用及用法:
简单的说,它的作用就是将/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache以供使用,使所有的库文件都被缓存到ld.so.cache中,如果没做,即使库文件明明就在/usr/lib下的,也是不会被使用的,可能会导致其他程序的编译报错。
编译安装的程序在安装过程中,它的各个文件分布是不同的,比如如果将apr独立安装在/usr/local/apr目录中,那么/usr/local/apr就是一个完整的程序;如果apr安装在/usr/local目录中,那么apr程序就散落在/usr/local目录的各个角落,这也就是编译安装的时候,有些程序的默认路径就在一个很大的目录下,当要卸载的时候会比较困难。
[root@localhost ld.so.conf.d]# less ../ld.so.conf
include ld.so.conf.d/*.conf
#因此直接在ld.so.conf文件中添加库位置和在/etc/ld.so.conf.d/目录中添加库位置的效果是一样的
#由于httpd没有库文件,所以下面以apr为例导出库文件
[root@localhost ld.so.conf.d]# touch apr.conf
[root@localhost ld.so.conf.d]# echo "/usr/local/apr/lib" >> apr.conf
[root@localhost ld.so.conf.d]# ldconfig
#查看
[root@localhost ld.so.conf.d]# ldconfig -v | grep apr
/usr/local/apr/lib:
libapr-1.so.0 -> libapr-1.so.0.4.6
libgstdataprotocol-0.10.so.0 -> libgstdataprotocol-0.10.so.0.25.0
libaprutil-1.so.0 -> libaprutil-1.so.0.3.9
libapr-1.so.0 -> libapr-1.so.0.3.9
参考:http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
http://blog.csdn.net/luotuo44/article/details/16970841
3、 导出man手册
/etc/man.config文件是各个man手册入口文件的配置文件
# Every automatically generated MANPATH includes these fields
#
MANPATH /usr/man
MANPATH /usr/share/man
MANPATH /usr/local/man
MANPATH /usr/local/share/man
MANPATH /usr/X11R6/man
根据以上在/etc/man.config目录中导入/usr/local/apache24/man目录就可以了
5、其他配置
5.1环境变量配置
在/etc/profile.d目录下创建一个httpd.sh文件,然后把路径添加到这个文件中
[root@localhost bin]# touch /etc/profile.d/httpd.sh
[root@localhost bin]# echo "export PATH=/usr/local/apache24/bin:$PATH" > /etc/profile.d/httpd.sh
[root@localhost bin]# source /etc/profile.d/httpd.sh
[root@localhost bin]# which apachectl
/usr/local/apache24/bin/apachectl
[root@localhost bin]# 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@localhost bin]# !ps
ps aux | grep httpd
root 103062 0.0 0.2 72840 2484 ? Ss 05:06 0:00 /usr/local/apache24/bin/httpd -k start
daemon 103063 0.0 0.1 72840 1872 ? S 05:06 0:00 /usr/local/apache24/bin/httpd -k start
daemon 103064 0.0 0.1 72840 1872 ? S 05:06 0:00 /usr/local/apache24/bin/httpd -k start
daemon 103065 0.0 0.1 72840 1872 ? S 05:06 0:00 /usr/local/apache24/bin/httpd -k start
daemon 103066 0.0 0.1 72840 1872 ? S 05:06 0:00 /usr/local/apache24/bin/httpd -k start
daemon 103067 0.0 0.1 72840 1872 ? S 05:06 0:00 /usr/local/apache24/bin/httpd -k start
root 103069 0.0 0.0 103308 856 pts/4 S+ 05:06 0:00 grep httpd
5.2启动服务配置
5.2.1在编译的过程中,指定了httpd24的配置文件位于/etc/httpd24目录,这样就避免了覆盖原来系统上的http程序
[root@localhost ~]# ll /usr/local/apache24/
total 52
drwxr-xr-x 2 root root 4096 Dec 9 04:27 bin
drwxr-xr-x 2 root root 4096 Dec 9 04:28 build
drwxr-xr-x 2 root root 4096 Dec 9 04:27 cgi-bin
drwxr-xr-x 3 root root 4096 Dec 9 04:27 error
drwxr-xr-x 2 root root 4096 Dec 8 18:10 htdocs
drwxr-xr-x 3 root root 4096 Dec 9 04:27 icons
drwxr-xr-x 2 root root 4096 Dec 9 04:28 include
drwxr-xr-x 2 root root 4096 Dec 9 04:27 logs
drwxr-xr-x 4 root root 4096 Dec 9 04:28 man
drwxr-xr-x 14 root root 12288 Jul 16 2013 manual
drwxr-xr-x 2 root root 4096 Dec 9 04:27 modules
5.2.2如何启动http24?
5.2.2.1由于编译的httpd-2.4处于一个独立的目录中,因此可以直接配置环境变量后使用
systemctl start|stop或者/usr/local/apache24/bin/httpd
5.2.2.2利用httpd-2.2的服务脚本启动
服务脚本位置
[root@localhost apache24]# cd /etc/rc.d/init.d/
[root@localhost init.d]# ls
abrt-ccpp bluetooth halt libvirt-guests NetworkManager pppoe-server rpcgssd spice-vdagentd
abrtd cpuspeed htcacheclean lvm2-lvmetad nfs psacct rpcidmapd sshd
abrt-oops crond httpd lvm2-monitor nfslock quota_nld rpcsvcgssd svnserve
acpid cups ip6tables mdmonitor nfs-rdma rdisc rsyslog sysstat
atd dnsmasq iptables messagebus ntpd rdma sandbox udev-post
auditd firstboot irqbalance netconsole ntpdate restorecond saslauthd wdaemon
autofs functions kdump netfs portreserve rngd single winbind
blk-availability haldaemon killall network postfix rpcbind smartd wpa_supplicant
备份服务脚本后修改
[root@localhost init.d]# cp httpd ~
修改/etc/rc.d/init.d/httpd文件内容
#原内容
# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server
# with the thread-based "worker" MPM; BE WARNED that some modules may not
# work correctly with a thread-based MPM; notably PHP will refuse to start.
# Path to the apachectl script, server binary, and short-form for messages.
apachectl=/usr/sbin/apachectl
httpd=${HTTPD-/usr/sbin/httpd}
prog=httpd
pidfile=${PIDFILE-/var/run/httpd/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
RETVAL=0
STOP_TIMEOUT=${STOP_TIMEOUT-10}
#修改上面配置文件中的这些内容就可以使用httpd-2.2的服务脚本启动http-2.4程序了
apachectl=/usr/local/apache24/bin/apachectl
httpd=${HTTPD-/usr/local/apache24/bin/httpd}
prog=httpd
pidfile=${PIDFILE-/usr/local/apache24/logs/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd24}
将上述的httpd服务脚本改名为httpd24后添加到不同的运行级别中
[root@localhost init.d]# mv httpd httpd24
[root@localhost init.d]# chkconfig --add httpd24
#查看级别
[root@localhost init.d]# chkconfig --list httpd24
httpd24 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@localhost init.d]# service httpd24 status
httpd (pid 103062) is running...
[root@localhost init.d]# service httpd24 stop
Stopping httpd: [ OK ]
[root@localhost init.d]# ps aux | grep httpd
root 103177 0.0 0.0 103308 852 pts/5 R+ 05:21 0:00 grep httpd
[root@localhost init.d]# service httpd24 start
Starting httpd: 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
[ OK ]
httpd-2.4编译安装的自身配置
使用不同的MPM机制
httpd-2.2使用 静态编译 方式,把MPM模块编译成不同的httpd程序,如httpd,httpd.worker,httpd.event。
#CentOS 6 httpd-2.2
[root@localhost ~]# /usr/sbin/httpd -M
httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName
Loaded Modules:
core_module (static)
mpm_prefork_module (static)
http_module (static)
httpd-2.4使用 动态编译 方式,只有一个httpd程序,这个程序在运行的时候,使用shared object文件
#CentOS 7 httpd-2.4
[root@husa ~]# /usr/sbin/httpd -M
AH00557: httpd: apr_sockaddr_info_get() failed for husa.hust
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message
Loaded Modules:
...
dav_lock_module (shared)
lua_module (shared)
mpm_prefork_module (shared)
在编译安装的过程中,指定了配置文件位于/etc/httpd24目录中,而配置使用不同的MPM机制的方法是
#CentOS 6 httpd-2.4编译安装
[root@localhost ~]# cd /etc/httpd24/
[root@localhost httpd24]# ls
extra httpd.conf magic mime.types original
[root@localhost ~]# vim /etc/httpd24/httpd.conf
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
LoadModule mpm_worker_module modules/mod_mpm_worker.so
#以上直接修改主配置文件/etc/httpd24/httpd.conf文件中的载入模块即可
[root@localhost ~]# service httpd24 restart
Stopping httpd: [FAILED]
Starting httpd: 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
[ OK ]
[root@localhost ~]# httpd -M | grep mpm
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
mpm_worker_module (shared)
#使用自定义脚本重启httpd24并检查mpm机制
综上,编译安装httpd-2.4配置不同MPM直接在主配置文件httpd.conf中修改;而yum安装httpd-2.4配置不同MPM在/etc/httpd/conf.modules.d/00-mpm.conf文件中配置