目录@H_403_2@
一、Apache的工作模式@H_403_2@
1、简介@H_403_2@
2、比较@H_403_2@
二、CentOS6.x上安装Apache2.2@H_403_2@
(一)rpm安装apache@H_403_2@
(二)编译安装apache@H_403_2@
2、下载解压依赖包@H_403_2@
3、安装apache@H_403_2@
4、测试apache@H_403_2@
5、查看apache相关信息@H_403_2@
6、配置程序运行环境@H_403_2@
9、导出手册@H_403_2@
(三) 编译安装Apache2.4@H_403_2@
1、编译安装apr@H_403_2@
2、编译安装apr-util@H_403_2@
3、安装需要的依赖包@H_403_2@
4、编译安装Apache2.4
@H_403_2@5、安装后配置
@H_403_2@
一、Apache的工作模式@H_403_2@@H_403_2@
Apache HTTP服务器被设计为一个强大的、灵活的能够在多种平台以及不同环境下工作的服务器。Apache HTTP服务器被设计为一个强大的、灵活的能够在多种平台以及不同环境下工作的服务器。这种模块化的设计就叫做“多路处理模块”(Multi-Processing Modules,MPMs),也叫做工作模式。
@H_403_2@ 在编译apache时必须选择也只能选择一个MPM,对类UNIX系统,有几个不同的MPM可供选择,它们会影响到apache的速度和可伸缩性。@H_403_2@@H_403_2@
1、简介@H_403_2@@H_403_2@
Prefork MPM:@H_403_2@@H_403_2@
prefork是Unix平台上的默认(缺省)MPM,使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接,效率高,但内存占用量比较大@H_403_2@。@H_403_2@@H_403_2@
这个多路处理模块(MPM)实现了一个非线程型的、预派生的web服务器,它的工作方式类似于Apache 1.3。它适合于没有线程安全库,需要避免线程兼容性问题的系统。它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。@H_403_2@
@H_403_2@
这个MPM具有很强的自我调节能力,只需要很少的配置指令调整。最重要的是将MaxClients设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存超出物理内存的大小。@H_403_2@@H_403_2@
@H_403_2@
Worker MPM:@H_403_2@@H_403_2@
worker使用多个子进程,每个子进程有多个线程,每个线程在某个确定的时间只能维持一个连接,内存占用量比较小,适合高流量的http服务器@H_403_2@。缺点是假如一个线程崩溃,整个进程就会连同其任何线程一起”死掉”,所以要保证一个程式在运行时必须被系统识别为”每个线程都是安全的”。@H_403_2@
@H_403_2@
此多路处理模块(MPM)使网络服务器支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM。但是它也使用了多进程,每个进程又有多个线程,以获得基于进程的MPM的稳定性。@H_403_2@
@H_403_2@
每个进程可以拥有的线程数量是固定的。服务器会根据负载情况增加或减少进程数量。一个单独的控制进程(父进程)负责子进程的建立。每个子进程可以建立ThreadsPerChild数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。@H_403_2@
@H_403_2@
不管是Worker模式或是Prefork模式,Apache总是试图保持一些备用的(spare)或者是空闲的子进程(空闲的服务线程池)用于迎接即将到来的请求。这样客户端就不需要在得到服务前等候子进程的产生。@H_403_2@
@H_403_2@
Event MPM:@H_403_2@
以上两种稳定的MPM方式在非常繁忙的服务器应用下都有些不足。尽管HTTP的Keepalive方式能减少TCP连接数量和网络负载,但是 Keepalive需要和服务进程或者线程绑定,这就导致一个繁忙的服务器会耗光所有的线程。 Event MPM是解决这个问题的一种新模型,它把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限 制,此时Event MPM方式是最有效的。一个以Worker MPM方式工作的繁忙服务器能够承受每秒好几万次的访问量(例如在大型新闻服务站点的高峰时),而Event MPM可以用来处理更高负载。值得注意的是,Event MPM不能在安全HTTP(HTTPS)访问下工作。@H_403_2@
@H_403_2@
ITK MPM:@H_403_2@
Linux自身提供了很强的权限系统,最简单的方法就是使用这个系统实现不同站点之间的权限划分,但apache所有进程往往都是运行在同一用户下,这也就是问题的根源,于是有了apache itk,在debian 里包名叫做apache2-mpm-itk 。和prefork 和 worker 一样是一个mpm(多路处理器),实际上itk 是基于prefork的,为每个虚拟主机prefork出来的子进程可以以不同的用户身份运行。apache UMASK变量设置为027,对应ftp的Umask 也设置为027,这样程序生成或后上传的文件也只能被本站点所属用户修改,只能被同组人查看,实现了隔离的较果。@H_403_2@
@H_403_2@
这种不是Apache的MPMs,只是Linux某种发行版对Apache的改进。@H_403_2@
@H_403_2@
2、比较@H_403_2@
1)prefork和worker模式的比较@H_403_2@
prefork模式使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有优势:它可以使用那些没有处理好线程安全的第三方模块,并且对于那些线程调试困难的平台而言,它也更容易调试一些。@H_403_2@
@H_403_2@
worker模式使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说,在一个高流量的HTTP服务器上,Worker MPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,如果一个线程崩溃,整个进程就会连同其所有线程一起"死掉".由于线程共享内存空间,所以一个程序在运行时必须被系统识别为"每个线程都是安全的"。@H_403_2@
@H_403_2@
总的来说,prefork方式速度要稍高于worker,然而它需要的cpu和memory资源也稍多于woker。@H_403_2@
@H_403_2@
2)对于Event 模式,apache给出了以下警告:This MPM is experimental,so it may or may not work as expected .@H_403_2@
这种MPM目前处于试验状态,他可能不能按照预期的那样工作。这是httpd2.2版本的情况,在httpd2.4版本后event模式已经很稳定了,可以用于生产环境。@H_403_2@
@H_403_2@
小结:@H_403_2@
prefork:多进程模型,每个进程响应一个请求;一个主进程:负责生成n个子进程,子进程也称为工作进程,每个子进程处理一个用户请求;即便没有用户请求,也会预先生成多个空闲进程,随时等待请求到达;最大不会超过1024个;@H_403_2@
@H_403_2@
worker:多线程模型,每个线程响应一个请求;一个主进程:生成多个子进程,每个子进程负责生个多个线程,每个线程响应一个请求;m进程,n线程:m*n 。@H_403_2@
@H_403_2@
event:事件驱动模型,每个线程响应n个请求;一个主进程:生成m个子进程,每个进程直接n个请求;m*n 。@H_403_2@
@H_403_2@
httpd-2.2: event为测试使用@H_403_2@
httpd-.24:event可生产使用@H_403_2@
@H_403_2@
二、CentOS6.x上安装Apache2.2@H_403_2@
环境:CentOS6.7,Minimal安装。@H_403_2@
@H_403_2@
(一)rpm安装apache@H_403_2@@H_403_2@
1、使用yum命令安装Apache@H_403_2@
#yum-yinstallhttpd
#servicehttpdstart
3、设置开机启动Apache
@H_403_2@@H_403_2@
#chkconfig--levels235httpdon
@H_403_2@
4、如果在浏览器无法浏览,请关闭iptables防火墙。
@H_403_2@@H_403_2@
# service iptables stop //关闭命令@H_403_2@
# chkconfig iptables off @H_403_2@@H_403_2@@H_403_2@//永久关闭防火墙@H_403_2@
# service iptables status @H_403_2@//查看防火墙状态@H_403_2@
@H_403_2@
5、如果要安装Apache其它扩展,参考下面命令。
@H_403_2@@H_403_2@
#yum-yinstallhttpd-manualmod_sslmod_perlmod_auth_MysqL
@H_403_2@
rpm安装的Apache,默认用的是prefork模式。@H_403_2@
@H_403_2@
@H_403_2@
图1 查看rpm安装的Apache的模式
@H_403_2@@H_403_2@
(二)编译安装apache2.2@H_403_2@@H_403_2@
1、安装编译环境。@H_403_2@
查看现有的编译环境。@H_403_2@
@H_403_2@
图2 查看是否安装编译环境@H_403_2@
@H_403_2@
安装编译环境:@H_403_2@
#yuminstall"Developmenttools""ServerPlatformDevelopment"-y
2、下载解压依赖包@H_403_2@
Apache的编译安装需要依赖apr(Apache Portable Runtime )和apr-util,因此需要先安装此两个依赖包。Apache2.2版本需要apr/apr-util 1.2以上版本,Apache2.4版本需要apr/apr-utli 1.4以上版本。@H_403_2@
@H_403_2@
CentOS6.7在安装编译环境时已经安装了apr-1.3.9和apr-util-1.3.9,所以在CentOS6.7上安装Apache2.2版本,不需要再安装apr和apr-util。如果在CentOS6.7上编译安装Apache2.4版本,则需要下载apr/apr-utli 1.4以上版本。查找及下载方法见下。@H_403_2@
@H_403_2@
(1)查找源码包@H_403_2@
@H_403_2@获取源码包下载地址" src="http://s5.51cto.com/wyfs02/M02/82/8C/wKioL1dZasXCeoTkAAH4YVFWziw459.png">
@H_403_2@
@H_403_2@
(2)下载源码包。
@H_403_2@
@H_403_2@
图4 下载源码包
@H_403_2@
@H_403_2@
(3)解压安装依赖包@H_403_2@
@H_403_2@
# tar -xf apr-1.5.2.tar.bz2@H_403_2@
# cd apr-1.5.2@H_403_2@
# ./configure --prefix=/usr/local/apr@H_403_2@
# make && make install@H_403_2@
安装apr-util。@H_403_2@
# tar -xf apr-util-1.5.4.tar.bz2@H_403_2@
# cd apr-util-1.5.4@H_403_2@
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr@H_403_2@
# make && make install@H_403_2@
@H_403_2@
(4)安装其它依赖包@H_403_2@
如果编译安装Apache时要用到pcre,则需要pcre-devel依赖包。@H_403_2@
#yuminstallpcre-devel-y
@H_403_2@
其它额外功能需要依赖包,按照上述方法安装即可。@H_403_2@
@H_403_2@
3、安装Apache源码包@H_403_2@
# wget http://mirrors.hust.edu.cn/apache//httpd/httpd-2.2.31.tar.bz2@H_403_2@
# tar -xf httpd-2.2.31.tar.bz2@H_403_2@
# cd httpd-2.2.31@H_403_2@
# ./configure --prefix=/usr/local/apache22 --sysconfdir=/usr/local/httpd22 \@H_403_2@
@H_403_2@--@H_403_2@with@H_403_2@-@H_403_2@apr@H_403_2@=@H_403_2@/usr/@H_403_2@local@H_403_2@/@H_403_2@apr@H_403_2@-@H_403_2@util@H_403_2@-@H_403_2@util \@H_403_2@
@H_403_2@-@H_403_2@zlib@H_403_2@-@H_403_2@pcre@H_403_2@-@H_403_2@mpm@H_403_2@=@H_403_2@prefork@H_403_2@--@H_403_2@enable@H_403_2@-@H_403_2@so@H_403_2@-@H_403_2@ssl \@H_403_2@
@H_403_2@-@H_403_2@cgi@H_403_2@-@H_403_2@rewrite@H_403_2@-@H_403_2@modules@H_403_2@=@H_403_2@most@H_403_2@-@H_403_2@mpms@H_403_2@-@H_403_2@shared@H_403_2@=@H_403_2@all@H_403_2@
# make -j 4 && make install@H_403_2@
@H_403_2@
4、测试Apache@H_403_2@
(1)测试主配置文件语法@H_403_2@@H_403_2@
# cd /usr/local/apache22@H_403_2@
# bin/apache22/bin/apachectl -t@H_403_2@
配置文件语法.png" alt="wKioL1dZdMiz0rOKAAJThZVOEWI769.png" src="http://s1.51cto.com/wyfs02/M01/82/8C/wKioL1dZdMiz0rOKAAJThZVOEWI769.png">
@H_403_2@
测试Apache主配置文件httpd.conf是否有语法错误,出现”Syntax OK“表示配置文件无问题。@H_403_2@
@H_403_2@
(2)查看监听端口
@H_403_2@
#netstat-tan
@H_403_2@
@H_403_2@
apache启动完毕后,我们来查看下是否可访问。@H_403_2@
@H_403_2@
还可以尝试用浏览器访问http://192.168.163.12,如果无法访问,关闭防火墙。@H_403_2@
@H_403_2@
@H_403_2@
@H_403_2@
5、查看Apache相关信息
@H_403_2@
@H_403_2@
图9 查看Apache相关信息
@H_403_2@
@H_403_2@
6、配置程序运行环境@H_403_2@
@H_403_2@
每次用httpd或者apachectl程序时,都要在前面输入一大段路径,非常不方便。用”echo $PATH“查看环境变量时,”/usr/local/apache22/bin“路径没有配置在环境变量中。将此路径添加到PATH环境变量中,以后调用httpd/apachectl就不需要输入路径了。@H_403_2@
@H_403_2@
@H_403_2@
图10 配置程序运行环境
@H_403_2@
@H_403_2@
这种方式的export只对当前shell有效,要想永久有效,执行以下步骤。@H_403_2@
@H_403_2@
#vim/etc/profile.d/httpd.sh
在此文件中写入"export PATH=/usr/local/apache22/bin:$PATH",保存退出。@H_403_2@
@H_403_2@
(2)执行@H_403_2@
#source/etc/profile.d/httpd.sh
或者@H_403_2@
#./etc/profile.d/httpd.sh
@H_403_2@
@H_403_2@
图11 导入路径到环境变量
@H_403_2@
@H_403_2@
@H_403_2@
一般应用程序运行都依赖于标准库里面的文件,Linux系统会在特定路径下为应用查找所依赖的库文件:/lib64,/lib,/usr/lib64,/usr/lib,/usr/local/lib,/usr/local/lib64 。某些应用程序需要的库文件标准库中没有,那么就需要添加应用程序自身提供的库文件到系统搜索路径中。那么就要添加修改配置文件,让系统搜索到此库文件。@H_403_2@
@H_403_2@
(1) 编辑添加/etc/ld.so.conf.d/*.conf文件,*表示的文件名自己取。添加新库文件搜索路径至此文件中,每行一个。@H_403_2@
(2) 执行ldconfig命令,重新生成库映射缓存ld.so.conf 。@H_403_2@
@H_403_2@
@H_403_2@
#manldconfig
@H_403_2@
复制所有新生成的头文件(/usr/local/apache22/include目录下的所有文件)至/usr/include目录中(不推荐);@H_403_2@
#cp/usr/local/apache22/include/*/usr/include/
@H_403_2@
#ln-sv/usr/local/apache22/include/usr/include/httpd
#ln-sv/usr/local/apache22/include/*/usr/include/
@H_403_2@
9、导出手册@H_403_2@
Linux会到特定目录下查找用户需要使用命令的手册,系统是依据“/etc/man.config”配置文件中“MANPATH”指令指向的手册路径搜索的。要让让系统能够搜索到apache手册路径,我们就需要编辑此配置文件。@H_403_2@
@H_403_2@
在此文件新增MANPATH指令,并指向新的命令手册路径;@H_403_2@
@H_403_2@
或者,在man命令执行时使用-M选项显式指定手册而查找路径即可;@H_403_2@@H_403_2@
@H_403_2@
(1)修改httpd的主配置文件,设置其Pid文件的路径。@H_403_2@
编辑/etc/httpd/httpd.conf,添加如下行即可:@H_403_2@
PidFile"/var/run/httpd.pid"
@H_403_2@
(2)提供SysV服务脚本/etc/rc.d/init.d/httpd,内容如下:@H_403_2@
#!/bin/bash@H_403_2@
#@H_403_2@
# httpd Startup script for the Apache HTTP Server@H_403_2@
# chkconfig: - 85 15@H_403_2@
# description: Apache is a World Wide Web server. It is used to serve \@H_403_2@
# HTML files and CGI.@H_403_2@
# processname: httpd@H_403_2@
# config: /etc/httpd/conf/httpd.conf@H_403_2@
# config: /etc/sysconfig/httpd@H_403_2@
# pidfile: /var/run/httpd.pid@H_403_2@
# Source function library.@H_403_2@
.@H_403_2@@H_403_2@/@H_403_2@etc@H_403_2@/@H_403_2@rc@H_403_2@.@H_403_2@d@H_403_2@/@H_403_2@init@H_403_2@/@H_403_2@functions@H_403_2@
if@H_403_2@@H_403_2@[@H_403_2@@H_403_2@-@H_403_2@f@H_403_2@/@H_403_2@sysconfig@H_403_2@/@H_403_2@httpd@H_403_2@];@H_403_2@@H_403_2@then@H_403_2@
@H_403_2@/@H_403_2@httpd@H_403_2@
fi@H_403_2@
# Start httpd in the C locale by default.@H_403_2@
HTTPD_LANG@H_403_2@=@H_403_2@$@H_403_2@{@H_403_2@HTTPD_LANG@H_403_2@-@H_403_2@"C"@H_403_2@}@H_403_2@
# This will prevent initlog from swallowing up a pass-phrase prompt if@H_403_2@
# mod_ssl needs a pass-phrase from the user.@H_403_2@
INITLOG_ARGS@H_403_2@=@H_403_2@""@H_403_2@
# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server@H_403_2@
# with the thread-based "worker" MPM; BE WARNED that some modules may not@H_403_2@
# work correctly with a thread-based MPM; notably PHP will refuse to start.@H_403_2@
# Path to the apachectl script,server binary,and short-form for messages.@H_403_2@
apachectl=@H_403_2@/usr/@H_403_2@local@H_403_2@/@H_403_2@apache22/@H_403_2@bin/@H_403_2@apachectl
httpd=@H_403_2@${@H_403_2@HTTPD-@H_403_2@/@H_403_2@httpd}@H_403_2@
prog=@H_403_2@httpd
pidfile{@H_403_2@PIDFILE/var/@H_403_2@run/@H_403_2@httpd22.@H_403_2@pid}@H_403_2@
lockfile{@H_403_2@LOCKFILE/var/@H_403_2@lock@H_403_2@/@H_403_2@subsys}@H_403_2@@H_403_2@
RETVAL@H_403_2@0@H_403_2@
start@H_403_2@()@H_403_2@@H_403_2@{@H_403_2@
echo@H_403_2@-@H_403_2@n $@H_403_2@"Starting $prog: "@H_403_2@
LANG@H_403_2@=@H_403_2@$HTTPD_LANG daemon@H_403_2@--@H_403_2@pidfile@H_403_2@{@H_403_2@pidfile@H_403_2@}@H_403_2@$httpd $OPTIONS@H_403_2@
RETVAL@H_403_2@?@H_403_2@
echo@H_403_2@
@H_403_2@[@H_403_2@$RETVAL@H_403_2@=@H_403_2@@H_403_2@0@H_403_2@@H_403_2@]@H_403_2@@H_403_2@&&@H_403_2@touch $@H_403_2@{@H_403_2@lockfile@H_403_2@}@H_403_2@
@H_403_2@return@H_403_2@$RETVAL@H_403_2@
}@H_403_2@
stop@H_403_2@{@H_403_2@
echo@H_403_2@"Stopping $prog: "@H_403_2@
killproc@H_403_2@-@H_403_2@p $@H_403_2@}@H_403_2@@H_403_2@-@H_403_2@d@H_403_2@10@H_403_2@$httpd@H_403_2@
RETVAL@H_403_2@?@H_403_2@
echo@H_403_2@
@H_403_2@&&@H_403_2@rm@H_403_2@-@H_403_2@f $@H_403_2@}@H_403_2@$@H_403_2@}@H_403_2@
}@H_403_2@
reload@H_403_2@{@H_403_2@
echo@H_403_2@"Reloading $prog: "@H_403_2@
@H_403_2@!@H_403_2@LANG@H_403_2@=@H_403_2@$HTTPD_LANG $httpd $OPTIONS@H_403_2@-@H_403_2@t@H_403_2@>&/@H_403_2@dev@H_403_2@/@H_403_2@null@H_403_2@;@H_403_2@@H_403_2@then@H_403_2@
RETVAL@H_403_2@?@H_403_2@
echo $@H_403_2@"not reloading due to configuration Syntax error"@H_403_2@
failure $@H_403_2@"not reloading $httpd due to configuration Syntax error"@H_403_2@
@H_403_2@else@H_403_2@
killproc@H_403_2@}@H_403_2@$httpd@H_403_2@-@H_403_2@HUP@H_403_2@
RETVAL@H_403_2@?@H_403_2@
@H_403_2@fi@H_403_2@
echo@H_403_2@
# See how we were called.@H_403_2@
case@H_403_2@@H_403_2@"$1"@H_403_2@@H_403_2@in@H_403_2@
start@H_403_2@)@H_403_2@
start@H_403_2@
@H_403_2@;;@H_403_2@
stop@H_403_2@)@H_403_2@
stop@H_403_2@
@H_403_2@;;@H_403_2@
status@H_403_2@)@H_403_2@
status@H_403_2@}@H_403_2@$httpd@H_403_2@
RETVAL@H_403_2@?@H_403_2@
@H_403_2@;;@H_403_2@
restart@H_403_2@)@H_403_2@
stop@H_403_2@
start@H_403_2@
@H_403_2@;;@H_403_2@
condrestart@H_403_2@)@H_403_2@
@H_403_2@then@H_403_2@
stop@H_403_2@
start@H_403_2@
@H_403_2@fi@H_403_2@
@H_403_2@;;@H_403_2@
reload@H_403_2@)@H_403_2@
reload@H_403_2@
@H_403_2@;;@H_403_2@
graceful@H_403_2@|@H_403_2@help@H_403_2@|@H_403_2@configtest@H_403_2@|@H_403_2@fullstatus@H_403_2@)@H_403_2@
$apachectl $@@H_403_2@
RETVAL@H_403_2@;;@H_403_2@
@H_403_2@*)@H_403_2@
echo $@H_403_2@"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}"@H_403_2@
@H_403_2@exit@H_403_2@@H_403_2@1@H_