前文我们聊了下http协议web服务的一些常识和httpd服务器软件三种响应模型的简单介绍,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12515075.html;今天我们来聊一聊httpd的一些常用配置;
httpd是一款历史悠久的web服务器软件,现如今比较流行的版本是2.2和2.4;对于httpd2.2的配置文件大概可以分为3段,第一段是全局指令配置段,对中心主机和虚拟主机都生效;第二段是中心主机相关配置;第三段是虚拟主机相关配置,作用于各虚拟主机;对于httpd2.2的配置中,中心主机的配置和虚拟主机的配置上可以共存,共存表示它可以在同一配置文件中,但是它两不能同时生效,在使用虚拟主机配置时,我们必须手动去注释中心主机的Documentroot所指定的文件系统路径;在2.4的配置中,虽然没有明确的区分中心主机和虚拟主机,默认情况下我们使用虚拟主机,对于中心主机的配置,自动就失效了,我们不需要额外的去是手动关闭中心主机的配置;
所谓中心主机就是一个物理服务器上,只维护一个站点;而对于一个物理服务器来说维护一个站点实在是有点大材小用,所以后面就有了虚拟主机的概念;所谓虚拟主机我们可以理解为,一台物理服务器上维护着多个不同的站点,当然这些站点有基于ip地址的虚拟站点,这对于物理服务器来说要拥有多个ip地址才能实现,通常情况下基于ip地址的虚拟服务器在互联网上使用相对比较少;其次也有基于端口的虚拟站点,对于物理服务器,不同的站点监听在不同的端口上,这类虚拟主机相对也不是很常用,我们知道web服务默认工作在tcp的80端口,如果我们在互联网上让web服务监听在一个非80的端口上,这样用户访问我们的站点就不得而知所监听的端口,所以这种基于端口的虚拟主机也是相对不常用的;还有就是比较常用的基于FQDN(名称解析)或域名的虚拟主机,这里虚拟主机可以监听在同一个ip和端口下,用户请求我们站点时,是以请求报文首部中的host来区分,对于用户请求报文首部的不同的host,对于服务端就是不同的虚拟主机;对于虚拟主机以上三种方式都可以共存,也就说我们的虚拟主机可以是基于ip地址,可以基于端口,可以基于主机名或域名的名称解析;
不论是httpd2.2还是httpd2.4,通过yum安装的程序,默认主配置文件都是/etc/httpd/conf/httpd.conf,这个配置文件的格式是指令+值的方式,指令是不区分大小写;当对应指令的值为路径时,是否区分字符大小写取决于文件系统,Linux文件系统是区分大小写的,windows是不区分大小写的;了解了上面的配置文件的格式接下来我们来说说一些常用的配置指令的用吧;
1、Listen:此指令是指定站点监听的IP和端口,其语法格式为Listen [IP-address:]portnumber [protocol];其中如果省略了ip表示监听在物理服务器上的所有地址的对应端口;listen指令可以重复出现多次;修改这个指令后,重启服务进程即可生效;如果限定客户端必须通过ssl通信是,其后面的protocol需要定义为https;
示例:
提示:以上配置表示监听本机所有地址的80端口,用户可以访问本机任何一个地址的80端口,都可以被响应;
提示:以上配置就表示监听本机的192.168.0.99这个地址的80端口上,如果本机还有其他地址,用户只有访问192.168.0.99这个地址的80端口才能够被服务端响应;
提示:以上配置表示192.168.0.99:443端口必须是https协议才给予响应;如果我们用http协议去访问443端口,将不能够正常响应服务器资源的;
2、持久连接(保持连接,长连接)
什么叫持久连接呢?所谓持久连接就是当tcp连接被建立后,每个资源获取完成后不断开连接,而是继续等待其他资源请求的进行;什么意思呢,我们知道用户通过http协议来访问服务端资源时,首先是要建立tcp连接(三次握手)后,其次才能够通过http协议通信,当客户端访问一个资源后,tcp连接就会断开,这样一来如果客户端请求的资源是很多,那么对于这种请求很多资源的客户端,如果每请求一次资源就得三次握手四次断开,这对客户端来说是相当慢的,为了解决这样一种窘境,长连接就出现了;对于长连接有两个点需要考虑,第一个点上时间的限制,我们不能也不应该让一个用户一直连接服务器而不断开;第二个点就是请求资源的数量,我们不能够让一个用户只请求了几个资源后就断开(如果一个页面资源特别多的情况),所以开启长连接,我们需要指定长连接的超时时长的同时,还需要指定最大请求资源的数量;
KeepAlive On|Off:此指令表示开启或关闭长连接
KeepAliveTimeout time:此指令表示指定长连接的超时时长
MaxKeepAliveRequests number :此指令表示指定最大请求数量
示例:
提示:以上在主配置文件中加上这个指令就表示不开启长连接
测试:
提示:可以看到当服务端没有开启长连接功能时,客户端访问服务端,服务端响应客户端后就直接断开了;我们配置启用长连接功能在来试试呢?
提示:以上配置表示开启长连接功能,一次访问服务端资源的超时时长为5秒(从上一次请求服务端后倒计时,如果在这个倒计时内没有访问服务端,则连接视为超时,则断开),最大请求资源数量为5个,意思就是如果在5秒时间内,用户请求服务端资源5秒钟内请求资源的数量没有达到5个连接将不会断开;相反客户端在5秒以内访问资源大于5个,则连接将会断开,即便没有达到指定时间,又或者请求的资源没有达到5个,但是连接的时长大于5秒,连接也会断开;
测试:
提示:可以看到开启长连接后,用户在第一次请求服务端资源后并没有立即断开,并且在第二次请求时间未到达5秒时请求了服务端,连接没有被断开,直到客户端访问了服务端的5次后或者客户端访问服务端一次后,在5秒钟没有请求服务端才被断开;以上就是http的保持连接功能的演示,这里需要提醒一下的是,httpd2.2和httpd2.4在保持连接功能上,httpd2.4可以将超时时长精确到毫秒级别,配置和上面配置一样,如果要精确的毫秒级别,只需要在keepalivetimeout 指令的后面的值上加上ms表示精确的毫秒;
3、MPM :httpd-2.2不支持同时编译多个MPM模块,所以只能编译选定要使用的那个;CentOS 6的rpm包为此专门提供了三个应用程序文件,httpd(prefork), httpd.worker, httpd.event,分别用于实现对不同的MPM机制的支持;
示例:查看现在使用的程序文件的方法
提示:默认使用的为/usr/sbin/httpd,其为prefork的MPM模块 ;
示例:查看静态编译的模块
提示:以上表示当前httpd 静态编译的模块有 core.c prefork.c http_core.c mod_so.c,其中prefork.c表示使用的是prefork响应模型,这也是http2.2默认的响应模型;如果主程序是httpd.worker,查看静态编译模块使用httpd.worker -l查看,event模型 使用httpd.event -l 查看;
示例:httpd.2.2查看静态编译及动态编译的模块
[root@test_node2-centos6 ~]# httpd -M httpd: apr_sockaddr_info_get() failed for test_node2-centos6.7 httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName Syntax OK Loaded Modules: core_module (static) mpm_prefork_module (static) http_module (static) so_module (static) auth_basic_module (shared) auth_digest_module (shared) authn_file_module (shared) authn_alias_module (shared) authn_anon_module (shared) authn_dbm_module (shared) authn_default_module (shared) authz_host_module (shared) authz_user_module (shared) authz_owner_module (shared) authz_groupfile_module (shared) authz_dbm_module (shared) authz_default_module (shared) ldap_module (shared) authnz_ldap_module (shared) include_module (shared) log_config_module (shared) logio_module (shared) env_module (shared) ext_filter_module (shared) mime_magic_module (shared) expires_module (shared) deflate_module (shared) headers_module (shared) usertrack_module (shared) setenvif_module (shared) mime_module (shared) dav_module (shared) status_module (shared) autoindex_module (shared) info_module (shared) dav_fs_module (shared) vhost_alias_module (shared) negotiation_module (shared) dir_module (shared) actions_module (shared) speling_module (shared) userdir_module (shared) alias_module (shared) substitute_module (shared) rewrite_module (shared) proxy_module (shared) proxy_balancer_module (shared) proxy_ftp_module (shared) proxy_http_module (shared) proxy_ajp_module (shared) proxy_connect_module (shared) cache_module (shared) suexec_module (shared) disk_cache_module (shared) cgi_module (shared) version_module (shared) [root@test_node2-centos6 ~]#
提示:以上如果后面是shared就表示编译成可动态模块,static表示静态编译的模块;如上所示,如果模块后面标记的是shared表示可以动态装载模块使用,动态装载使用LoadModule指令指定模块名称以及模块存放路径装载即可;对于模块后面是static标记的模块表示随程序自身已经将其编译好,如果要更换只能更换其程序;所以在httpd2.2的程序文件中有3个主程序文件,httpd、httpd.worker、httpd.enent 这三个程序文件对应的是三个不同的响应模型;对于httpd2.4来讲,它只有一个主程序文件,将其对应响应模型是做成了动态模块加载的形式,更改只需要在/etc/sysconfig/httpd文件中将HTTPD的值更改成对应程序重启服务即可;所以在httpd2.4如果要更换其响应模型,我们只需要在/etc/httpd/conf.modules.d/00-mpm.conf 加载对应的模块重启服务即可;
示例:httpd.2.2更换使用httpd程序,以支持其它MPM机制
提示:如果我们需要使用其他响应模型来启动httpd,我们只需要将其HTTPD=/usr/sbin/httpd.worker 更改为对应的程序即可,然后重启httpd服务即可生效,如下,我们将httpd的响应模型更改为worker
提示:可以看到我们使用不同的httpd响应模型,对应启动的进程各不相同,这是因为对于不同的响应模型,其配置是个不相同的;
MPM配置:对于httpd.2.2配置mpm在其配置文件里就明确的说明了,如下
提示:以上信息是httpd2.2配置mpm的配置,其中ifmodule指令表示判断当前程序静态编译的模块文件,以上配置表示,如果当前程序静态编译的是prefork.c,则使用
对于prefork响应模型中的配置指令,startservers 表示指定启动的空闲进程数量;也就是说服务启动,生成多少个子进程等待接收用户请求;minspareservers表示最小空闲进程数量;maxspareservers表示最大空闲进程数量;serverlimit表示服务器生存期的MaxClients的最大值;maxclients表示最大允许启动的进程数量;通常情况下serverlimit的值同maxclients的值一样;startservers的值应该小于maxspareservers的值,大于minspareservers的值;MaxRequestsPerChild表示一个子进程最大能够接收的请求数量,如果子进程接收处理请求的数量到达我们指定的值时,主控进程会将其销毁,然后重新启动一个新的子进程;如果该值是0 表示不限制子进程的最大接收处理请求的数量;
对于worker响应模型中的配置指令,startservers同样表示启动的空闲进程数量;maxclients表示最大客户端的连接数量;minsparethreads表示最小空闲线程数量;maxsparethreads表示最大空闲线程数量;threadsperchild表示一个子进程内部启动的线程数量;maxrequestsperchild表示限定子进程接收处理请求的数量,如果是worker响应模型,通常情况都是0,表示不限制;
示例:在httpd2.4中配置prefork响应模型
提示:在httpd2.4中如果要手动配置mpm,需要编辑/etc/httpd/conf.module.d/00-mpm.conf文件,将其对应的配置写进去,重启httpd服务即可;
提示:在没有重启httpd之前,我们可以看到启动了5个子进程一个主控进程;
提示:我们重启了httpd服务后,可以看到我们指定启动子进程数量为8个生效了;同理如果配置worker响应模型也可以在/etc/httpd/conf.moudle.d/00-mpm.conf中加入对应的配置重启服务即可;
4、DSO机制,所谓DSO机制就是httpd支持动态加载模块的方式,在上面的配置中,我们有提到过动态加载模块的方法,用LoadMoudle指令指定要加载的模块名称(需要将模块的真实名称的“mod_”去掉将其后面的".so"更换成"_module")以及模块存放路径以及真实名称(带.so),如下
提示:以上表示装载mpm_prefork_module 其对应模块的路径名称为modules/mod_mpm_prefork.so,以上使用的模块路径名称是使用的相对路径,这个相对路径时相对于serverroot指令所指定的路径;
提示:此指令是在主配置文件中指定,所以不难找到httpd模块存放路径在/etc/httpd/modules/目录中
提示:其实这个目录也是一个软连接,真正的目录是在/usr/lib64/httpd/modules;对于httpd2.2动态加载模块,其方式方法是一样的,只不过它加载模块的配置上卸载/etc/httpd/conf/httpd.conf文件中;而httpd2.4是在/etc/httpd/conf.moudles.d/00-base.conf中加载;
5、servername:设定标识中心主机或虚拟主机名称
语法:ServerName [scheme://]fully-qualified-domain-name[:port],通常情况下都是fqdn名称
6、serveralias:设定表示虚拟主机别名,此指令只能用于虚拟主机
语法:ServerAlias hostname [hostname] ...
示例:
提示:以上指令可标识中心主机名称,也可以标识虚拟主机名称
ServerName server.domain.com ServerAlias server server2.domain.com server2 ServerAlias *.example.com UseCanonicalName Off # ...
提示:serveralias指令指令用于标识虚拟主机名称,可以在一个虚拟主机内多次使用,表示多个别名
7、DocumentRoot标识URL根路径与之对应的文件系统路径映射,意思定义httpd服务器工作目录;
示例:
提示:以上定义就表示指定httpd的工作目录为/var/www/html;如果用户访问/index.html,就相当于访问/var/www/html/index.html;这里特别要注意一点的是URL路径和文件系统路不是等同的,他俩是存在一种映射关系;
8、站点访问控制常见机制;httpd的资源访问控制有两种机制指定,第一种是文件系统路径访问控制,第二种是基于URL路径的访问控制;
示例:基于文件系统路径的访问控制
提示:以上是默认httpd2.4的根路径访问控制的配置示例;以上配置表示/var/www/html这个目录允许所有人访问,即所用用户都可以通过访问对应URL“/”来访问该目录中的文件;
提示:以上配置表示访问的文件名称中包含.ht开头的文件是不允许被访问的;
提示:以上配置表示 如果用户访问的文件名称是.gif或者是jpeg或jpg 或者是png结尾的,那么都被允许访问;通过文件路径访问控制通常情况是以上三种形式来指定文件系统路径或文件,然后做允许或拒绝访问;
示例:基于URL路径的访问控制
提示:以上配置表示用户访问的URL路径被匹配到将拒绝被拒绝访问;
提示:以上配置表示当用户访问的url被指定locationmatch匹配时,将允许ip地址为192.168.0.0/24网段的用户访问;基于URL的访问控制主要就是以上两种方式配置;这里还需要注意一点,如果我们想让某一网段内的所有主机访问,但是排除某一ip访问时,我们需要把对应的规则写到
提示:如果我们这样配置,是有语法错误的;
提示:我们要想匹配某一网段,或者我们指定了一个范围内的主机,又排除了部分主机时,我们需要把其配置在一个
提示:这样配置,我们再做语法检测就不会出现问题了
以上配置都是在httpd2.4中的配置,在httpd2.2中,访问控制的配置同2.4所使用的指令都差不多,唯一不同的是里面的require 对应httpd2.2中就不是require 了,在httpd2.2中的访问控制是这样的;如下
说明:在httpd2.2中的访问控制要使用order allow,deny,这个指令主要是指定默认是允许还是被拒绝,以上配置表示,默认不被指定条目所匹配的都拒绝,通常情况下默认法则就是order最后的值,如果是allow就表示默认法则是允许的,如果是deny就表示默认法则是被拒绝的,像上面的例子就是默认法则被拒绝;
示例:httpd2.2基于文件系统文件名作访问控制
提示:以上配置表示用户访问以.ht开头的文件都将被拒绝;
提示:以上配置表示用户访问以.gif或者gpg或者jpg或者jpeg或者png结尾的资源都将被允许;
示例:httpd2.2基于URL访问控制
提示:以上配置表示用户访问的url是/index.html时将被允许任何人访问,访问/admin或者/login时,将拒绝用户IP为192.168.0.0/24网段的用户访问;
9、options:配置特定目录中可用的特性,其后可跟一个或多个以空白字符分隔的选项列表;
Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户;
FollowSymLinks:允许跟踪符号链接文件所指向的源文件;
None:表示没有任何特性;
ALL:表示出Multiviews 的所有特性;
示例:
提示:以上配置表示配置中心主机的根目录为/data/www/html,并且允许在其根路径下没有主页文件,将其目录下的文件以索引的方式罗列出来;
提示:可以看到当对应目录下没有主页文件时,使用options 指定 indexes就可以将其目录下的资源给罗列出来;
提示:以上配置在前面的配置上加了允许访问链接文件所连接的源文件
提示:可以看到我们配置对应目录下的资源选项允许对应目录下的连接文件访问源文件后,重读配置文件就可以在对应目录下访问连接文件所连接的源文件;通常情况下options指令的值为none比较安全,如果我们的站点没有特殊要求,建议都将options的值设置为none
10、定义站点主页
DirectoryIndex:此指令指定主页文件名称,可以是多个分别用空白字符隔开;表示主页文件可以是指定主页文件名称列表中的任意一个;
示例:定义主页文件为test.html
提示:以上配置表示配置/data/www/html/目录下的主页文件为test.html
提示:可以看到在对应目录下有了主页文件后,其他文件就不再以索引的方式给罗列出来,并且通过访问服务端,也都是响应的是指定主页文件内容;