主要内容:
httpd相关包信息
httpd的安装及主页面
httpd的配置文件
httpd的全局配置
httpd的主服务器配置
一、httpd的RPM包介绍及其相关信息:
CentOS6上httpd的相关包信息:
CentOS7上的httpd的相关信息:
【httpd安装后各文件的内容及存放位置】:
CentOS6:
服务脚本:/etc/rc.d/init.d/httpd
运行目录:/etc/httpd
配置文件:/etc/httpd/conf/
主配置文件:httpd.conf
扩展配置文件:/etc/httpd/conf.d/*.conf
socket:
http:80/tcp
https:443/tcp
网页文件目录(DocumentRoot):
静态页面:/var/www/html
动态页面(CGI):/var/www/cgi-bin/
默认主页面:index.html index.php
【httpd的安装】:
注意:httpd的默认安装会试图通过反解当前主机的IP地址来为httpd服务器提供一个主机名称,如果反解失败会报错,会提示主机名称解析失败并使用127.0.0.1作为当前主机的主机名。所以在没有配置DNS的情况下,建议首先配置/etc/hosts文件为其提供一个主机名。
1、 编辑/etc/hosts文件,为当前主机配置相应的主机名:
2、 通过yum来安装httpd,如果需要手册(httpd-manual:官方提供的httpd的配置手册),也可以一并安装;
3、 安装完成后通过“chkconfig”命令来设置开机启动:
[root@localhost ~]# chkconfig --list httpd httpd 0:off1:off2:off3:off4:off5:off6:off [root@localhost ~]# chkconfig httpd on [root@localhost ~]# chkconfig --list httpd httpd 0:off1:off2:on3:on4:on5:on6:off
4、 通过“service httpd start”或“/etc/rc.d/init.d/httpd”来启动服务:
[root@localhost ~]# service httpd start Starting httpd: httpd: Could not reliablydetermine the server's fully qualified domain name, using localhost.localdomainfor ServerName #此处有点小问题; [ OK ] [root@localhost ~]# /etc/rc.d/init.d/httpdrestart Stopping httpd: [ OK ] Starting httpd: httpd: Could not reliablydetermine the server's fully qualified domain name, using localhost.localdomainfor ServerName [ OK ] 在/etc/httpd/conf/httpd.conf文件中将# ServerName www.example.com:80 的注释符#号去掉即可;
5、 通过“netstat”或“ss”命令来查看80/tcp端口是否处于监听状态:
[root@localhost ~]# netstat -tan | grep 80 tcp 0 0 :::80 :::* LISTEN
[root@localhost ~]# ss -tnl | grep 80 LISTEN 0 128 :::80 :::*
6、 80/tcp端口被监听说明服务已经启动了,在客户机的浏览器中输入服务器地址验证安装。
看到上面的页面表示httpd已经能够正常工作了哈,上面的页面是一个测试页面,在我们提供默认主页面后该页面就会被替换。
7、 为httpd提供默认主页(在"/var/www/html"目录下新建一个名为index.html的文件),内容如下:
8、 再次通过浏览器访问:
自定义主页设置成功,能正常访问;
二、配置httpd的工作属性:
指令的说明:
/etc/httpd/conf/httpd.conf:
1、指令不区分字符大小写,但约定俗成的习惯:单词的首字母大写;指令的值很有可能区分大小写;有些指令可以重复使用多次;
2、所有以“#”号开头的都为注释;
配置文件的构成:
整个配置文件由3段组成:
(1)全局配置:对主服务器或虚拟机都有效,且有些功能是服务器自身工作属性;
(2)主服务器:主站属性;
(3)虚拟主机:虚拟主机及属性定义
注:第二段和第三段(即主机和虚拟主机)不能同时使用;
说明:大多数配置修改后,使用service httpd reload即能生效;而修改了监听的地址和端口通常需要重启服务;
第一段:全局配置:
1、配置监听的地址和端口:
Listen [IP:]PORT //Listen可重复使用多次
#Listen 12.34.56.78:80 Listen 80
2、配置所选用的MPM的属性:
MPM:意为多路处理模块,也就是我们所说的Apache的工作模式,共有3中模式:
prefork:一个主进程产生多个子进程,一个子进程响应一个请求;
worker:一个进程生成多个线程,一个线程响应一个请求;
event:基于事件驱动;
说明:
event在apache2.4版本之前是以测试状态提供,网上并没有太多的资料,在更新至2.4版本之后正式上线
prefork:当httpd启动起来之后,会生成一个主进程,它负责监听用户的请求,一旦请求进来后,它不负责自己响应,而是让其生成的子进程来响应,而主进程继续监听请求。
需要考虑的是:刚启动服务的时候需要创建几个空闲进程,太多不好太少也不好。最少保证有几个空闲进程来响应请求进来,这是必须的。 最多设定多少个空闲进程,多余的空闲进程需要回收回来。
所以Prefork有如下几个关键作用:
(1)启动服务时绑定特权端口:Linux系统中,只有管理员有权限使用小于1024的特权端口;但运行一些公共可用的服务,一定不能以管理员身份运行;
(2)派发或回收子进程
(3)读取分析主配置文件
(4)监听每个用户请求并且派发子进程
httpd 命令的使用:
Usage: httpd [-D name] [-d directory] [-ffile] [-C "directive"] [-c "directive"] [-k start|restart|graceful|graceful-stop|stop] [-v] [-V] [-h] [-l] [-L] [-t] [-S] Options: -Dname : define a name for usein <IfDefine name> directives -ddirectory : specify an alternateinitial ServerRoot -ffile : specify an alternateServerConfigFile -C"directive" : processdirective before reading config files -c"directive" : processdirective after reading config files -elevel : show startup errors oflevel (see LogLevel) -Efile : log startup errors tofile -v : show versionnumber -V : show compilesettings -h : listavailable command line options (this page) -l : list compiledin modules -L : listavailable configuration directives -t-D DUMP_VHOSTS : show parsed settings(currently only vhost settings) -S : a synonym for-t -D DUMP_VHOSTS -t-D DUMP_MODULES : show all loaded modules -M : a synonym for-t -D DUMP_MODULES -t : run syntaxcheck for config files
参数说明:
httpd �Cl 用于查看核心模块;
[root@localhost ~]# httpd -l Compiled in modules: core.c prefork.c #prefork被直接编译进了核心模块,所以默认使用的就是prefork模型; http_core.c mod_so.c [root@localhost ~]#
httpd�CM 检查DSO模块加载情况(通过2种方式查询已加载的模块数量应该相等)
[root@localhost ~]# httpd -M | grep -v"static\|Loaded Modules" | wc -l Syntax OK 52 [root@localhost ~]# grep"^LoadModule" /etc/httpd/conf/httpd.conf | wc -l 52
【配置prefork模型】:
Apache服务默认就是以prefork模式启动的,无须更改启动模式,下面来看看如何更改其模型参数:
编辑主配置文件:vim /etc/httpd/conf/httpd.conf找到与模块相关的参数:IfModule为指令,意为判断模块是否存在,如果存在那么参数则生效,反之如果不存在此模块,参数将不会生效。
<IfModule prefork.c> #如果存在这个模块,那么提供以下属性; StartServers 8 #刚启动Web服务时启动几个空闲子进程; MinSpareServers 5 #最少空闲进程数; MaxSpareServers 20 #最大空闲进程数; ServerLimit 256 #限定最多允许并发进来的活动用户连接个数; MaxClients 256 #服务器所允许同时所连接进来的链接数,一般来说与上面保持一致,或者大于上面的数。 MaxRequestsPerChild 4000 #一个服务器进程最多可以处理多少个进程,一旦超出请求后无论如何将进程结束并新启动新进程 </IfModule> #最后以IfModule结尾;
如果一个进程需要20M内存,那么256*20=5G内存,通常说ServerLimit是相当消耗内存的,256已经足够;
例:工作中,通过观察发现服务器每个请求进来并处理结束之间的过程大概需要50毫秒,在一秒钟之内一个进程可以处理20个请求,那么一共开启了256个那 么即意味着256*20=每秒的并发数量,因此还需要再计算极端情况:对于一个站点来说一般都有高峰期,假如一次性进来的请求远远超于预想的阀值,该如何处理?
如果发现服务器满负荷工作时,但服务器上仍然有空闲,可以将MaxClients、ServerLimit值调大。
【配置worker模型】;
当第一个用户请求到达的时候线程发现需要复制文件,通过内核将文件复制给其进程,所以第二个用户请求同一个文件,对于第二个线程来说这个文件已存在,因为线程是共享同一个进程空间,所以速度得到提升;
缺点:共享意味着争用,共享资源被称作临界资源,线程共享进程空间就可能产生资源争用,并不是全状态并行。所以一个进程里不能启用太多线程;可启用多个进程然后由每个进程再启用多个线程,但无论如何每个线程也都是一个独立的执行实体(线程要能运行必须给其cpu资源)。
更改apache当前工作模式为worker模式:
编辑文件/etc/sysconfig/httpd,将以下参数的注释信息去掉:
HTTPD=/usr/sbin/httpd.worker
更改模式后必须重新启动服务:
[root@localhost ~]# service httpd restart Stopping httpd: [ OK ] Starting httpd: [ OK ]
启动完毕后,查看其进程状态:
[root@localhost ~]# ps -ef | grep httpd root 34786 1 0 22:24 ? 00:00:00 /usr/sbin/httpd.worker #以root用户身份生成的父进程(用于派发工作进程) apache 34788 34786 0 22:24 ? 00:00:00 /usr/sbin/httpd.worker #以apache用户身份运行的工作进程(该工作进程派发线程) apache 34789 34786 0 22:24 ? 00:00:00 /usr/sbin/httpd.worker apache 34791 34786 0 22:24 ? 00:00:00 /usr/sbin/httpd.worker root 34907 1947 0 22:26 pts/0 00:00:00 grep httpd
【worker属性配置】:
<IfModule worker.c> StartServers 4 #配置启动多少个用于监听的服务,注意:这里并不是服务器进程,而是线程; MaxClients 300 #最大支持的用户连接数; MinSpareThreads 25 #最小的空闲线程数; MaxSpareThreads 75 #对大的空闲线程数 ; ThreadsPerChild 25 #允许每个进程最多生成多少个线程; MaxRequestsPerChild 0 #设置一个独立的子进程将能处理的请求数量; </IfModule>
3、配置服务器支持keep-alived:
KeepAlive {On | Off } #启用之后支持一次连接可以发送多个请求(对于非常繁忙的服务器建议Off) KeepAliveTimeout 15 #15秒之后断开长连接; MaxKeepAliveRequests 100 #一次长连接之内最多允许50个请求;
4、配置加载的模块:
# Example: # LoadModule foo_module modules/mod_foo.so #LoadModule指令模块名称 模块所在的路径(相对于ServerRoot而言) LoadModule auth_basic_modulemodules/mod_auth_basic.so LoadModule auth_digest_modulemodules/mod_auth_digest.so LoadModule authn_file_modulemodules/mod_authn_file.so LoadModule authn_alias_modulemodules/mod_authn_alias.so
第二段:主服务器配置:
5、配置站点根目录(网页存放目录)
DocumentRoot "" #与之配对使用两个容器类指令:Directory指令限定的是文件系统上站点目录的路径(/var/www/html);Location指令限定的是URL路径 <Directory "FS_PATH"> </Directory> <Location "URL"> </Location> #两种路径定义方法 /var/www/html/images/logo.jpg => <Directory "/var/www/html" ></Directory> http://www.magedu.com/images/logo.jpg => <Location "/"></Location> #这里的“/”==/var/www/html
6、配置页面文件属性:
<Directory "FS_PATH"> Options Indexes: 是否允许索引页面文件(不安全,建议关闭); FollowSynLinks: 是否跟随软链接文件(不安全,建议关闭); SymLinksifOwnerMatch:相对安全的跟随软链接指令(如果软链接文件的属主与网页访问用户匹配则允许) ExecCGI:是否允许执行CGI脚本; All 允许上述所有; None 不允许上述所有; </Directory>
Example:是否允许索引?
首先删除欢迎页面文件和默认主页面文件,或者将二者改名:
[root@localhost ~]# cd /etc/httpd/conf.d/ [root@localhost conf.d]# mvwelcome.conf{,.bak} [root@localhost conf.d]# cd /var/www/html/ [root@localhost html]# mv index.html{,.bak} [root@localhost html]# service httpd reload Reloading httpd: [root@localhost html]#
此时是能正常索引的,现在来禁止索引功能: