在Centos 6中httpd的默认版本是2.2,在Centos 7中默认是2.4,httpd服务的官方地址 httpd.apache.org,官方文档地址 http://httpd.apache.org/docs/2.4/  ,指令快速查询地址 http://httpd.apache.org/docs/2.4/mod/quickreference.html


MPM的三种工作模式:

        prefork:多进程模式,一个进程响应一个请求。

        worker:多线程模型,一个进程生成多个线程,一个线程响应一个请求。

        event:事件驱动型,一个线程响应多个请求。

        并发服务器响应请求类型:单进程I/O模型,多进程I/O模型,复用的I/O模型,(复用型又包括多线程模型、事件驱动),多进程I/O模型。


常用的文件位置:

        主配置文件:/etc/httpd/conf/httpd.conf 。分段配置文件:/etc/httpd/conf.d/*.conf 

        服务脚本位置:/etc/rc.d/init.d/httpd,服务脚本的配置文件:/etc/sysconfig/httpd

        主程序文件位置:/usr/sbin/httpd,/usr/sbin/httpd.event,/usr/sbin/httpd.worker

        日志文件:/var/log/httpd/access_log 访问日志。/var/log/httpd/error_log 错误日志


常用配置


        配置文件不区分大小写,但是当值为路径时则要区分大小写。

服务所在目录:ServerRoot /etc/httpd ,这个目录为httpd服务安装的目录。

设置默认主页:DirectoryIndex index.html index.php

指定文档路径:DocumentRoot  "/var/www/html"

设置字符集:AddDefaultCharset UTF-8 ,还有GBK、GB2312等


路径别名:

        Alias  /bbs/  "/forum/docs/",用户访问的url地址中是bbs,实际目录为 /forum/docs,在文档中的任意一个位置都可以。


包含配置文件指令:

        Include conf/extra/httpd-vhosts.conf,使用这个指令可以包含其他配置文件,将配置文件分段,这个目录是相对目录,相对于ServerRoot 设置的目录,也就是相对于服务的安装目录。


监听端口:

        Listen IP : port  ,Listen  80,默认监听端口,Listen可以有多个,省略IP表示监听所有IP。示例如下:

        Listen 8080

        Listen 192.168.96.128:8080


持久连接:

        http协议每次连接都要三次握手,长连接可以一次连接持续请求资源而不用请求每个资源都要连接,但是在大并发的网站服务器上持久连接时间太长的话会占用过多的资源,所以要设定超时时间且时间不宜过长,建立持久连接超时后才会断开连接。下面是长连接的几个配置项:

        KeepAlive  On / Off                      开启或关闭持久连接

        MaxKeepAliveRequests  100        持久连接时允许的最大请求资源数量

        KeepAliveTimeout  15                  持久连接的超时时长,单位秒


MPM三种工作模型


        多路并发响应模型,Multipath Process Modules 也叫多道处理模块,http-2.2上不支持同时编译多个模块,只能选取一个,http-2.4版本支持编译多个模块,可以通过配置文件开启或关闭任意一种模型。

        httpd  -l        显示核心中编译了的模块,这个几个模块是核心组件,无法动态加载的模块

                Compiled in modules:

                  core.c                  核心模块

                  prefork.c             当前的mpm工作模型

                  http_core.c          http核心模块

                  mod_so.c             模块接口,支持动态加载模块的模块

        httpd  -M        显示所有的模块,包括静态编译和动态加载的模块


更换httpd程序:

        httpd-2.2的配置文件/etc/sysconfig/httpd中开启 HTTPD=/usr/sbin/httpd.worker 这项即可,填写相应的值即可。httpd-2.4配置文件在 httpd/conf.modules.d/00-mpm.conf 中。这样工作模型就更换了,重新启动后使用命令 ps aux | grep httpd 就可以查看到对应的工作模型了,也可以使用httpd.event模型。改完之后默认的工作模型就失效了。当更换了工作模型就要使用相应的命令来查看当前的工作模型,如 httpd.worker -t 。

        三种工作模式的配置,httpd-2.4的配置目录一般在 conf/extra 下的httpd-mpm.conf 文件中。


prefork的配置:

    <IfModule prefork.c>

        StartServers       8                服务启动时要启动的服务进程数

        MinSpareServers    5           最小空闲进程数

        MaxSpareServers   20         最大空闲进程数,当客户端的请求完成后剩下的进程数量太多要关闭一些,剩下的进程数最多不能超过这个数

        ServerLimit      256              服务器进程数量最大值,和下面的这个值一般是相同的

        MaxClients       256             最多只允许这么多个客户端来请求,这种模式一个进程响应一个请求,也就是最多允许启动这么多个进程,所以ServerLimit也是限制启动的最多的进程数,所以这两个值是一样的。

        MaxRequestsPerChild  4000        一个子进程最多响应多少次的请求,一个进程不断的响应请求当超过这个数目则杀死这个进程,重新生成子进程

    </IfModule>


worker的配置:

    <IfModule worker.c>

        StartServers         4                开启服务时启动的进程

        MaxClients         300              服务端最大启动的线程数量,也是最大并发请求数

        MinSpareThreads     25         最小空闲线程数

        MaxSpareThreads     75         最大空闲线程数,总线程数 = 每个进程启动的线程数 * 当前进程数

        ThreadsPerChild     25           每个进程启动的线程数,这种工作模式是每个进程启动多个线程,由线程来响应请求,这个数字用来限制线启动的进程数。

        MaxRequestsPerChild  0        每个线程响应的最大请求数量,0表示不限制

    </IfModule>


event模式配置:

<IfModule mpm_event_module>

    StartServers             3

    MinSpareThreads         75

    MaxSpareThreads        250

    ThreadsPerChild         25

    MaxRequestWorkers      400

    MaxConnectionsPerChild   0

</IfModule>


DSO动态加载模块:

        加载模块方法:LoadModule <mod_name> <mod_path>        先指定模块名,然后指定模块地址,地址可以使用相对路径,相对于(ServerRoot)指向的路径而言。


访问控制

文件控制:

        <Directory "/var/www/html"></Directory>          对目录进行控制

        <File ""></File>                         对单个文件进行访问控制

        <FileMatch></FileMatch>        使用正则对文件进行访问控制。

URL控制:

        <Location ""></Location>         使用URL进行访问控制,还可以控制请求方法

        在每种类型的访问控制中可以基于地址来源的访问控制、也可以基于账号的访问控制。

Directory的访问可控制:

        <Directory "/www">

                Options None

                AllowOverride None

                Order allow,deny

                Allow from All

        </Directory>

Options选项:

        Indexes                没有主页的情况下显示目录列表,默认要去掉

        Includes               服务器包含

        FollowSymLinks                    允许跟踪链接类型的文件,要去掉

        SymLinksifOwnerMatch        如果链接文件的所属主和文件的属主相同则显示文件

        ExecCGI                是否允许执行CGI文本

        MultiViews           多视图,根据浏览器来显示相应内容

        None                    不启用任何一个

        All                         测试时候可以用,全部开启

AllowOverride:

                是否启用当前配置覆盖网站目录下的.htaccess文件。选项有None FileInfo AuthConfig Limit。

Order:基于来源的访问控制机制,类似于白名单和黑名单

        Order allow,deny        默认的都deny只有明确允许的才允许,类似白名单

        Order deny,allow        默认的都allow只有明确允许的才允许,类似黑名单

        Allow from        允许来自哪里的主机访问

        Deny from         拒绝来自哪里的主机访问

定义方法:

        172.16

        172.16.0.0

        172.16.0.0/16

        172.16.0.0/255.255.0.0

        例:Allow from 192.168


日志设定

错误日志:

        日志使用相对路径,相对于ServerRoot目录,错误日志默认位置为相对位置,格式为 ErrorLog logs/error_log,日志级别:debug, info, notice, warn, error, crit, alert, emerg 由低到高。如定义的级别为warn,那么高于这个级别的错误消息都会被记录。除了定义日志位置还要定义日志级别:LogLevel warn。

访问日志:

        CustomLog logs/access_log combined ,后面的combined是格式名称,是由自己定义的,写哪种就以那种格式记录日志。

        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

        LogFormat "%h %l %u %t \"%r\" %>s %b" common

        LogFormat "%{Referer}i -> %U" referer

        LogFormat "%{User-agent}i" agent

替换规则:

        %h :客户端IP地址

        %l  :远程登录名称,Remote logname,空用 “-”表示

        %u :Remote user

        %t  :服务器接收请求的时间

        %r  :请求报文的首行信息

        %>s:响应状态码

        %b :响应报文的大小,单位字节,不包含首部

        %{Referer}i :报文中referer的值

        %{User-Agent}i :发出请求的应用程序,如百度spider,各种浏览器

        详情请见:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html


Basic认证

        基于用户的访问控制,当用户对某个资源发起请求时,需要输入用户名和密码之后才可以访问。认证类型分为basic(明文)和digest(加密)

1、基于用户的访问控制:

    <Directory "">                        要进行控制的路径

            Options None

            AllowOverride None                     是否覆盖.htaccess

            AuthType Basic                             认证方式

            AuthName "STRING"                    名称随便写

            AuthUserFile "/etc/httpd/conf.d/.htpasswd"    用户名和密码

            Require user username1 username2 ...        Require user后面都是允许访问的用户名

    </Directory>

2、基于组的访问控制:

    <Directory "/www/admin">        这个目录指定了要进行访问控制的目录,在这个目录下的文件都要进行访问控制

        Options None

        AllowOverride None

        AuthType Basic                        认证方式

        AuthName "admin login"        名称随便写

        AuthUserFile "/etc/httpd/conf.d/.htpasswd"        在这个文件中放入用户名和密码

        AuthGroupFile "/etc/httpd/conf.d/.htgroup"        在这个文件中放入组信息

        Require group webadmin        基于组的认证方法

    </Directory>

        基于组文件要创建组用户文件/etc/httpd/conf.d/.htgroup,文件格式为:“组名:用户名 用户名”。

        例:webadmin : qiyang admin

需要用到的命令:

        htpasswd [options] passwordfile username

        -c      自动创建passwordfile,如果之前有会覆盖原文件

        -m     md5加密用户密码

        -s      sha1加密用户密码

        -D     删除指定用户

        例:htpasswd -c -m /etc/httpd/conf.d/.htpasswd  qiyang        这里的-c命令只能在第一次创建时使用,否者会覆盖,输入命令后输入密码即可。-m是加密,文件路径是写配置文件定义的文件路径,后面是是要添加的用户名。

        设置好后使用service httpd reload就可以在浏览器中访问admin目录了,然后会有弹窗提示输入用户名和密码。

    

虚拟主机


虚拟主机三种实现方法:

        1、基于IP:为每个虚拟机准备至少一个IP地址。

        2、基于port:每个虚拟主机使用一个端口。

        3、基于hostname:每个虚拟主机使用一个主机名。

        注意:一般虚拟主机不要与中心主机混用,所以要用虚拟主机先禁用中心主机,禁用中心主机的方法为注释中心主机的 DocumentRoot,上述三种虚拟主机可以混合使用,多数用在中心主机的配置也可以在虚拟主机上使用。

        虚拟主机配置格式如下:

            <VirtualHost "IP:PORT">

                    ServerName

                    DocumentRoot ""

                    ServerAlias        虚拟主机别名

                    ErrorLog

                    CustomLog

                    <Directory ""></Directory>          虚拟机中也可以使用访问控制

            <VirtualHost>


基于IP的虚拟主机实现方法:

        配置如下,每个虚拟主机都有属于自己的IP地址,使用ip addr add 192.168.96.128/24 dev eth0 可以为

网卡添加IP地址。添加好后创建DocumentRoot目录。

        <VirtualHost 192.168.96.128:80>

                ServerName web1.test.com

                DocumentRoot "/www/web1"

        </VirtualHost>

        <VirtualHost 192.168.96.126:80>

                ServerName web2.test.com

                DocumentRoot "/www/web2"

        </VirtualHost>

基于端口的虚拟主机:

        访问的端口不同,但是要添加一个端口,如:Listen 8080,具体配置如下。

        <VirtualHost 192.168.96.128:80>

                ServerName web1.test.com

                DocumentRoot "/www/web1"

        </VirtualHost>

        <VirtualHost 192.168.96.128:8080>

                ServerName web3.test.com

                DocumentRoot "/www/web3"

        </VirtualHost>

基于主机名的虚拟主机:

        这种方式也是最常用的方式,创建DocumentRoot,在2.2中腰开启 NameVirtualHost 选项,而在2.4版本中就不用这项了,选项后面加上IP和端口,如 NameVirtualHost xxx.xxx.xxx.xxx:80 ,IP也可以用星号 * 代替。

        NameVirtualHost 192.168.96.128:80

        <VirtualHost 192.168.96.128:80>

                ServerName web2.test.com

                DocumentRoot "/www/web2"

        </VirtualHost>

        示例配置:

        <VirtualHost *:80>

                DocumentRoot /www/zhuqiyang

                ServerName zhuqiyang.com

                ServerAlias *.zhuqiyang.com

                <Directory "/alidata/www/zhuqiyang">

                    Options None

                    AllowOverride all

                    Order allow,deny

                    Allow from all

                </Directory>

                ErrorLog "/alidata/log/httpd/zhuqiyang-error.log"

                CustomLog "/alidata/log/httpd/zhuqiyang.log" combined

        </VirtualHost>

        使用httpd  -t 命令可以检查配置文件语法



查看服务器状态信息:

        /server-status 这个页面可以看到服务器的状态信息,配置如下:使用 location 定义,开启ExtendedStatus On选项可以查看更多的信息。

        <Location /server-status>

                SetHandler server-status

                Order deny,allow

                Deny from all

                Allow from 192.168

        </Location>

URL和HTTP协议

        URL:Unifrom Resoure Locator,URL基本语法:scheme://user:passwd@host:port/path;params?query#frag

http事务:

        请求:request

            method request-URL version

            headers

            entity-body

        响应:response

            version status respon-phrese

            headers

            entity-body


method:请求的方法,GET、POST、HEAD

        GET:服务器获取一个资源

        HEAD:只获取响应首部

        POST:向服务器发送要处理的数据

        PUT:将请求的数据存储在服务器上

        DELETE:请求删除服务器上指定的文档

        TRACE:追踪请求到达服务器中间经过的代理服务器

        OPTIONS:请求返回对指定资源支持的请求方法


version:协议版本,HTTP/1.0、HTTP/1.1、HTTP/2.0

status:状态码200、301、302、404、502

        1xx:100-101,信息提示

        2xx:200-206,成功

        3xx:300-305,重定向

        4xx:400-415,客户端错误

        5xx:500-505,服务器端错误


常用状态码:

        200:请求成功,请求响应部分通过entity-body部分响应

        301:永久重定向,请求的URL资源已近被删除,但通过Location部分指定了资源现在处的位子Moved Permanently

        302:临时重定向,通过Location部分指出临时资源位子

        304:资源未修改,客户端发出请求,但服务器资源未修改过,Not Modified

        401:需要输入账号密码认证访问的资源,Unauthorized

        403:请求被禁止,Forbidden

        404:无法找到客户端请求的资源,Not Found

        500:服务器内部错误,Internal Server Error

        502:代理服务器从后端服务器受到了一条伪响应,Bad Gatway

        respon-phrase:状态码所标记的状态简要描述

        headers:首部,不包含请求起始行


首部分类

通用首部

        Date:报文的创建时间

        Connection:链接状态,keep-alive,close

        Via:经过的服务器

        Cache-Controller:控制缓存

        Pragma:

请求首部

        Accept:通过的服务器自己可接受的媒体类型

        Accept-Charset:接受的字符集

        Accept-Encoding:接受的编码,gzip

        Accept-Language:接受的语言

        Client-IP:

        Host:请求服务器名称和端口号

        Referer:请求来源

        User-Agent:客户端类型

条件式请求首部:

        Expect:

        If-Modfined-Since:请求的资源是否发生过修改

        If-Unmodified-Since:是否没有修改

        If-None-Match:是否不匹配,缓存中的Etag标签是否与服务器文档的Etag不匹配

        if-Match:是否匹配,

        安全请求首部:

                Authorization:向服务器发送认证信息,如账号密码

                Cookie

        代理请求首部:

                Proxy-Authorization:向代理服务器认证

响应首部

        信息性:

                Age:响应持续时长

                Server:服务器程序软件名称和版本

        协商首部:

                Accept-Range:服务器可接受的请求范围类型

                Vary:服务器查看的其他部列表

        安全响应首部:

                Set-Cookie:

                Set-Cookie2: 

                www-Authenticate:来自服务器的对客户端的质询认证表单

实体首部

        Allow: 列出对此实体可使用的请求方法

        Location:告诉客户端真正的实体位于何处

        Content-Encoding:

        Content-Language:

        Content-Length: 主体的长度

        Content-Location: 实体真正所处位置;

        Content-Type:主体的对象类型

缓存相关

    ETag:实体的扩展标签;

    Expires:实体的过期时间;

    Last-Modified:最后一次修改的时间


实现gzip压缩

        使用 mod_deflate 模块压缩页面优化传输速度,可节约带宽,不过额外消耗CPU。同时有可能有些较老浏览器不支持,压缩适用于文本文件,不适用于图像文件,因为图片文件的压缩率不高且非常消耗cpu资源,配置压缩要开启 mod_deflate  模块和开启输出过滤器,就是过滤那些文件要压缩那些类型文件不要压缩的。输出过滤器的指令为SetOutputFilter DEFLATE。

配置项:

        SetOutputFilter DEFLATE

        # mod_deflate configuration

        # Restrict compression to these MIME types

        AddOutputFilterByType DEFLATE text/plain 

        AddOutputFilterByType DEFLATE text/html

        AddOutputFilterByType DEFLATE application/xhtml+xml

        AddOutputFilterByType DEFLATE text/xml

        AddOutputFilterByType DEFLATE application/xml

        AddOutputFilterByType DEFLATE application/x-javascript

        AddOutputFilterByType DEFLATE text/javascript

        AddOutputFilterByType DEFLATE text/css

         

        # Level of compression (Highest 9 - Lowest 1),压缩比,最大为9

        DeflateCompressionLevel 9

        # Netscape 4.x has some problems. 下面的这种浏览器只压缩html文档

        BrowserMatch ^Mozilla/4 gzip-only-text/html

        # Netscape 4.06-4.08 have some more problems,下面的这几款浏览器不压缩

        BrowserMatch ^Mozilla/4\.0[678] no-gzip

        # MSIE masquerades as Netscape, but it is fine,IE6之前的不压缩,压缩只压缩html类型

        BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html


httpd自带的工具程序

        htpasswd: basic认证基于文件实现时,用到的账号密码文件生成工具;

        apachectl:httpd自带的服务控制脚本,支持start, stop;apachectl start|restart|status

        apxs:由httpd-devel包提供的,扩展httpd使用第三方模块的工具;

        rotatelogs:日志滚动工具,实现日志分段。

        suexec:访问某些有特殊权限配置的资源时,临时切换至指定用户运行;

        ab: apache benchmark


httpd-2.4的配置