centos6 httpd2.2详细剖析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了centos6 httpd2.2详细剖析相关的知识,希望对你有一定的参考价值。

以centos6.5为例

    配置文件:
           /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:访问日志
                 error_log:错误日志
  站点文档(默认存放网站目录):
         /var/www/html
  模块文件路径:
         /usr/lib64/httpd/modules

  服务控制和启动:
    chkconfig  httpd  on|off
    service  {start|stop|restart|status|configtest|reload}  httpd

1,安装httpd,启动服务并设置自动启动

~]# yum install httpd -y
~]# chkconfig httpd on
~]# service  httpd start
 查看主配置段落
~]# grep -i ‘section‘  /etc/httpd/conf/httpd.conf 
# The configuration directives are grouped into three basic sections:
### Section 1: Global Environment #全局环境配置段
# The directives in this section affect the overall operation of Apache,
### Section 2: ‘Main‘ server configuration 主配置段
# The directives in this section set up the values used by the ‘main‘
# WebDAV module configuration section.
### Section 3: Virtual Hosts #虚拟主机配置段
# The first VirtualHost section is used for requests without a known
常用配置:
                        1、修改监听的IP和PORT
 Listen  [IP:]PORT

                                        (1) 省略IP表示为0.0.0.0;
                                        (2) Listen指令可重复出现多次;
                                                Listen  80
                                                Listen  8080
                                        (3) 修改监听socket,重启服务进程方可
创建测试网页
~]# /var/www/html/test.html

           <html>
                        <head>
                                <title>百度</title>
                        </head>
                        <body>
                                <h1></h1>
                                        <p> baidu... <a href="http://www.baidu.com"> bla... </a> </p>
                                <h2> </h2>
                        </body>
           </html>

测试机安装telnet
~]# yum install telnet -y

KeepAlive Off测试短连接
 ~]# telnet 172.16.100.65 80
Trying 172.16.100.65...
Connected to 172.16.100.65.
Escape character is ‘^]‘.
GET /test.html HTTP/1.1  
HOST:172.16.100.65

HTTP/1.1 200 OK
Date: Tue, 30 Oct 2018 23:03:09 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Tue, 30 Oct 2018 21:54:05 GMT
ETag: "4c0640-194-579793975ed24"
Accept-Ranges: bytes
Content-Length: 404
Connection: close  #连接建立后立即端开
Content-Type: text/html; charset=UTF-8

           <html>
                        <head>
                                <title>百度</title>
                        </head>
                        <body>
                                <h1></h1>
                                        <p> baidu... <a href="http://www.baidu.com"> bla... </a> </p>
                                <h2> </h2>
                        </body>
           </html>
Connection closed by foreign host.
备注:GET /test.html HTTP/1.0 回车一次 HOST:172.16.100.65回车2次

KeepAlive On测试持久链接
~]# service httpd restart 

测试效果,15s后端口连接
~]# telnet 172.16.100.65 80
Trying 172.16.100.65...
Connected to 172.16.100.65.
Escape character is ‘^]‘.
GET /test.html HTTP/1.1
HOST:172.16.100.65

HTTP/1.1 200 OK
Date: Tue, 30 Oct 2018 23:06:29 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Tue, 30 Oct 2018 21:54:05 GMT
ETag: "4c0640-194-579793975ed24"
Accept-Ranges: bytes
Content-Length: 404
Content-Type: text/html; charset=UTF-8

           <html>
                        <head>
                                <title>百度</title>
                        </head>
                        <body>
                                <h1></h1>
                                        <p> baidu... <a href="http://www.baidu.com"> bla... </a> </p>
                                <h2> </h2>
                        </body>
           </html>
Connection closed by foreign host.

默认MPM模式为prefork,变更为worker模式
~]# vim /etc/sysconfig/httpd 
~]# service httpd restart 
停止 httpd:                                               [确定]
正在启动 httpd:httpd.worker: apr_sockaddr_info_get() failed for Centos6.5
httpd.worker: Could not reliably determine the server‘s fully qualified domain name, using 127.0.0.1 for ServerName

查看worker模式进程数
~]# ps aux | grep httpd
root       2959  0.0  0.1 186608  4168 ?        Ss   08:16   0:00 /usr/sbin/httpd.worker
apache     2962  1.6  0.2 530868  9472 ?        Sl   08:16   0:00 /usr/sbin/httpd.worker
apache     2963  4.0  0.2 530868  9468 ?        Sl   08:16   0:00 /usr/sbin/httpd.worker
apache     2965  1.0  0.2 530868  9484 ?        Sl   08:16   0:00 /usr/sbin/httpd.worker
root       3075  0.0  0.0 103256   840 pts/1    R+   08:16   0:00 grep httpd

监控进程
~]# watch -n.5 ‘ps aux | grep httpd‘
重启看监控效果
~]# service httpd restart

创建web站点目录(创建URL根路径)
~]# mkdir -pv /web/host1
mkdir: 已创建目录 "/web"
mkdir: 已创建目录 "/web/host1"
[[email protected] ~]# vim /web/host1/index.html
           <html>
                        <head>
                                <title>host1</title>
                        </head>
                        <body>
                                <h1></h1>
                                        <p> host1 test.index... <a href="http://www.baidu.com"> bla... </a> </p>
                                <h2> </h2>
                        </body>
           </html>

 ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/web/host1"

http://172.16.100.65

                        2、持久连接
                                Persistent Connection:tcp连续建立后,每个资源获取完成后不全
断开连接,而是继续等待其它资源请求的进行; 
                                如何断开?
                                        数量限制
                                        时间限制

                        副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常 响应;
                        折衷:使用较短的持久连接时长,以及较少的请求数量;

                                        KeepAlive  On|Off
                                        KeepAliveTimeout  15
                                        MaxKeepAliveRequests  100

                                测试:
                                        telnet  WEB_SERVER_IP  PORT
                                        GET  /URL  HTTP/1.1
                                        Host: WEB_SERVER_IP

                        3、MPM 

                        httpd-2.2不支持同时编译多个MPM模块,所以只能编译选定要使用的那个;CentOS 6的rpm包为此专门提供了三个应用程序文件,httpd(prefork), httpd.worker, httpd.event,分别用于实现对不同的MPM机制的支持;确认现在使用的是哪下程序文件的方法:
                                        ps  aux  | grep httpd

                                默认使用的为/usr/sbin/httpd,其为prefork的MPM模块 ;
                                        查看httpd程序的模块列表:
                                                查看静态编译的模块:
                                                        # httpd  -l
                                                查看静态编译及动态编译的模块:
                                                        # httpd  -M

                                更换使用httpd程序,以支持其它MPM机制;
                                        /etc/sysconfig/httpd
                                                HTTPD=/usr/sbin/httpd.{worker,event}

                                注意:重启服务进程方可生效

                                MPM配置:
                                        prefork的配置           
                                                <IfModule prefork.c>
                                                StartServers       8
                                                MinSpareServers    5
                                                MaxSpareServers   20
                                                ServerLimit      256
                                                MaxClients       256
                                                MaxRequestsPerChild  4000
                                                </IfModule>             

                                        worker的配置:
                                                <IfModule worker.c>
                                                StartServers         4
                                                MaxClients         300
    MinSpareThreads     25
                                                MaxSpareThreads     75
                                                ThreadsPerChild     25
                                                MaxRequestsPerChild  0
                                                </IfModule>                             

                                PV,UV
                                        PV:Page View
                                        UV: User View

                        4、DSO
                                配置指定实现模块加载
                                        LoadModule  <mod_name>  <mod_path>

                                        模块文件路径可使用相对路径:
                                                相对于ServerRoot(默认/etc/httpd)

                        5、定义‘Main‘ server的文档页面路径
                                DocumentRoot  ""

                                文档路径映射:
                                        DoucmentRoot指向的路径为URL路径的起始位置
                                                其相当于站点URL的根路径;

                       (FileSystem) /web/host1/index.html  -->  (URL)  /index.html

                        6、站点访问控制常见机制

                                可基于两种机制指明对哪些资源进行何种访问控制

        <Directory  "">
                                                ...
                                                </Directory>

                                                <File  "">
                                                ...
                                                </File>

                                                <FileMatch  "PATTERN">
                                                ...
                                                </FileMatch>
                                        URL路径:
                                                <Location  "">
                                                ...
                                                </Location>

                                                <LocationMatch "">
                                                ...
                                                </LocationMatch>

                                <Directory>中“基于源地址”实现访问控制:
                                        (1) Options
                                                后跟1个或多个以空白字符分隔的“选项”列表;
                                            Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户;
                                            FollowSymLinks:允许跟踪符号链接文件所指向的源文件;
                                            None:
                                            All:

                                        (2)  AllowOverride与访问控制相关的哪些指令可以放在.htaccess文件(每个目录下都可以有一个)中;
                                             All: 
                                             None:

                                        (3) order和allow、deny
                                            order:定义生效次序;写在后面的表示默认法则;

                                            Allow from, Deny from
                                                        来源地址:
                                                                IP
                                                                NetAddr:
                                                                        172.16
                                                                        172.16.0.0
                                                                        172.16.0.0/16
                                                                        172.16.0.0/255.255.0.0

                        7、定义站点主页面:
                                DirectoryIndex  index.html  index.html.var

                        8、定义路径别名
                                格式:
                                        Alias  /URL/  "/PATH/TO/SOMEDIR/"

                                DocumentRoot "/www/htdocs"
                                        http://www.iecentury.com/download/bash-4.4.2-3.el6.x86_64.rpm 
                                                /www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm 

                                Alias  /download/  "/rpms/pub/"
  http://www.iecentury.com/download/bash-4.4.2-3.el6.x86_64.rpm 
                                                /rpms/pub/bash-4.4.2-3.el6.x86_64.rpm

                                        http://www.iecentury.com/images/logo.png
                                                /www/htdocs/images/logo.png

                        9、设定默认字符集
                                AddDefaultCharset  UTF-8

                                中文字符集:GBK, GB2312, GB18030

                        10、日志设定
                                日志类型:访问日志 和 错误日志

                                错误日志:
                                        ErrorLog  logs/error_log
                                        LogLevel  warn
        Possible values include: debug, info, notice, warn, error, crit, alert, emerg.

                                访问日志:
                                        LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
                                        CustomLog  logs/access_log  combined

                                        LogFormat format strings:
                                                http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats

                              %h:客户端IP地址;
                              %l:Remote User, 通常为一个减号(“-”);
                              %u:Remote user (from auth; may be bogus if return status (%s) is 401);非为登录访问时,其为一个减号;
                              %t:服务器收到请求时的时间;
                              %r:First line of request,即表示请求报文的首行;记录了此次请求的“方法”,“URL”以及协议版本;
                              %>s:响应状态码;
                              %b:响应报文的大小,单位是字节;不包括响应报文的http首部;
                              %{Referer}i:请求报文中首部“referer”的值;即从哪个页面中的超链接跳转至当前页面的;
                              %{User-Agent}i:请求报文中首部“User-Agent”的值;即发出请求的应用程序;

                        11、基于用户的访问控制

                                认证质询:
                                        WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码;

                                认证:
                                        Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源;

                                        认证方式有两种:
                                                basic:明文 
                                                digest:消息摘要认证

                                安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标
识,以便于告知用户认证的原因;

                                用户的账号和密码存放于何处?
 虚拟账号:仅用于访问某服务时用到的认证标识

                                        存储:
                                                文本文件;
                                                SQL数据库;
                                                ldap目录存储;

                                basic认证配置示例:
                                        (1) 定义安全域
                                                <Directory "">
                                                        Options None
                                                        AllowOverride None
                                                        AuthType Basic
                                                        AuthName "String“
                                                        AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"
                                                        Require  user  username1  username2 ...
                                                </Directory>

                                                允许账号文件中的所有用户登录访问:
                                                        Require  valid-user

                                        (2) 提供账号和密码存储(文本文件)
                                                使用专用命令完成此类文件的创建及用户管理
                                                        htpasswd  [options]   /PATH/TO/HTTPD_PASSWD_FILE  username 
                                                                -c:自动创建此处指定的文件,
因此,仅应该在此文件不存在时使用;
                                                                -m:md5格式加密
                                                                -s: sha格式加密
                                                                -D:删除指定用户

                                        另外:基于组账号进行认证;
                                                (1) 定义安全域
                                                        <Directory "">
                                                                Options None
                                                                AllowOverride None
                                                                AuthType Basic
                                                                AuthName "String“
                                                                AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"
                                                                AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
                                                                Require  group  grpname1  grpname2 ...
                                                        </Directory>

                                                (2) 创建用户账号和组账号文件;

                                                        组文件:每一行定义一个组
                                                                GRP_NAME: username1  username2  ...

                        12、虚拟主机

                                站点标识: socket
                                        IP相同,但端口不同;
                                        IP不同,但端口均为默认端口;
                                        FQDN不同;
                                                请求报文中首部
                                                Host: www.iecentury.com 

                                有三种实现方案:
基于ip:
                                                为每个虚拟主机准备至少一个ip地址;
                                        基于port:
                                                为每个虚拟主机使用至少一个独立的port;
                                        基于FQDN:
                                                为每个虚拟主机使用至少一个FQDN;

                                注意:一般虚拟机不要与中心主机混用;因此,要使用虚拟主机,得
先禁用‘main‘主机;
                                        禁用方法:注释中心主机的DocumentRoot指令即可;

                                虚拟主机的配置方法:
                                        <VirtualHost  IP:PORT>
                                                ServerName FQDN
                                                DocumentRoot  ""
                                        </VirtualHost>

                                        其它可用指令:
                                                ServerAlias:虚拟主机的别名;可多次使用;
                                                ErrorLog:
                                                CustomLog:
                                                <Directory "">
                                                ...
                                                </Directory>
                                                Alias
                                                ...

                                        基于IP的虚拟主机示例:
                                        <VirtualHost 172.16.100.6:80>
                                                ServerName www.a.com
                                                DocumentRoot "/www/a.com/htdocs"
                                        </VirtualHost>

                                        <VirtualHost 172.16.100.7:80>
                                                ServerName www.b.net
                                                DocumentRoot "/www/b.net/htdocs"
                                        </VirtualHost>

                                        <VirtualHost 172.16.100.8:80>
                                                ServerName www.c.org
                                                DocumentRoot "/www/c.org/htdocs"
                                        </VirtualHost>

                                        基于端口的虚拟主机:
                                        <VirtualHost 172.16.100.6:80>
                                                ServerName www.a.com
                                                DocumentRoot "/www/a.com/htdocs"
                                        </VirtualHost>

                                        <VirtualHost 172.16.100.6:808>
                                                ServerName www.b.net
                                                DocumentRoot "/www/b.net/htdocs"
                                        </VirtualHost>

                                        <VirtualHost 172.16.100.6:8080>
                                                ServerName www.c.org
                                                DocumentRoot "/www/c.org/htdocs"
                                        </VirtualHost>

                                        基于FQDN的虚拟主机:
                                        NameVirtualHost 172.16.100.6:80

                                        <VirtualHost 172.16.100.6:80>
                                                ServerName www.a.com
                                                DocumentRoot "/www/a.com/htdocs"
                                        </VirtualHost>

                                        <VirtualHost 172.16.100.6:80>
                                                ServerName www.b.net
                                                DocumentRoot "/www/b.net/htdocs"
                                        </VirtualHost>

                                        <VirtualHost 172.16.100.6:80>
                                                ServerName www.c.org
                                                DocumentRoot "/www/c.org/htdocs"
                                        </VirtualHost>                                  

                        13、status页面
                                LoadModule  status_module  modules/mod_status.so

                                <Location /server-status>
                                        SetHandler server-status
                                        Order allow,deny
                                        Allow from 172.16
                                </Location>

以上是关于centos6 httpd2.2详细剖析的主要内容,如果未能解决你的问题,请参考以下文章

httpd 一键编译安装脚本(centos6&7_httpd2.2&2.4)

Centos6部署lamp: httpd2.2+module模式

httpd2.2(centos6)配置认证登陆页面,基于文档认证(basic)

yum实验--使用源码包安装httpd2.2(centos6)

HTTP 之 编译安装HTTPD2.4

httpd2.2(centos6)配置认证登陆页面,基于文档认证(basic)虚拟主机专用配置及内置STATUS页面配置